
Data Binding
사용자나 외부 서버의 요청 데이터를 특정 도메인 객체에 저장해서 우리 프로그램의 Request에 담아주는 것을 뜻 합니다.
Converter<S, T> Interface
S(Source) 라는 타입을 받아서 T(Target) 이라는 타입으로 변환해주는 Interface 입니다.
인터페이스의 모양은 아래와 같습니다.
package org.springframework.core.convert.converter;
public interface Converter<S, T> {
T convert(S source);
}
파라미터에 JSON 형식 문자열이 담겨오는 경우 해당 문자열을 곧바로 특정 DTO에 담고 싶을 때 사용합니다.
// 요청
GET /user-info
x-auth-user : {"id":123, "name":"Paul"}
Header에 x-auth-user라는 값이 있을 때 이를 바로 특정 DTO에 담고 싶을 때
// 유저 객체
public class XAuthUser {
private int id;
private String name;
// the usual getters and setters...
}
위처럼 헤더에 담긴 JSON 형식의 문자열을 XAuthUser에 바로 담고 싶은 경우 아래와 같이 Converter를 Bean으로 등록하면 됩니다.
@Component
public class XAuthUserConverter implements Converter<String, XAuthUser> {
@Override
public XAuthUser convert(String source) {
return objectMapper.readValue(source, XAuthUser.class);
}
}
이와 비슷하게 PathParameter나 기타 특수한 경우의 데이터를 특정 객체에 담고 싶은 경우
- Converter를 만들어서 Spring에 Bean으로 등록
- 스프링 내에 ConversionService라는 내장된 서비스에서 Converter 구현체 Bean들을 Converter 리스트에 등록
- 외부 데이터가 들어오고 Source Class Type -> Target Class Type이 Converter에 등록된 형식과
일치하게 되면 해당 Converter가 동작하는 원리
Formatter
일반적인 객체 변환은 String형과 특정 객체간의 변환이 대부분이기 때문에
위의 Converter보다는 Formatter가 더 많이 사용됩니다.
Formatter는 특정 객체와 String 간의 변환을 담당합니다.
아래 샘플 코드는 Date <-> String 간의 변환을 수행하는 Formatter 입니다.
- print: API 요청에 대한 응답을 줄 때 Date 형식으로 된 데이터를 특정 Local에 맞춘 String으로 변환
- parse: API 요청을 받아올 때 String으로 된 "2022-11-16 16:49:00"와 같은 특정 날짜 형식의 데이터를 Date로 변환하도록 합니다.
package org.springframework.format.datetime;
@Component
public final class DateFormatter implements Formatter<Date> {
public String print(Date date, Locale locale) {
return getDateFormat(locale).format(date);
}
public Date parse(String formatted, Locale locale) throws ParseException {
return getDateFormat(locale).parse(formatted);
}
// getDateFormat 등 일부 구현은 핵심에 집중하기 위해 생략
}
Formatter도 Converter와 마찬가지로 Spring Bean으로 등록하면 자동으로 ConversionService에 등록 시켜주기 때문에
필요(요청/응답 시 해당 데이터 타입이 존재하는 경우)에 따라 자동으로 동작하게 됩니다.
'Develop > Spring' 카테고리의 다른 글
(작성 중) Spring web.xml (0) | 2022.11.16 |
---|---|
Spring SpEL (0) | 2022.11.16 |
Spring Validation (0) | 2022.11.16 |
Spring AOP (0) | 2022.11.16 |
Spring Resource (0) | 2022.11.16 |