사용자나 외부 서버의 요청을 특정 도메인 객체에 저장해서 우리 프로그램에 Request에 담아주는 것을 뜻한다.
Converter<S,T>Interface를 사용하는데
S(source)라는 타입을 받아서 T(target)이라는 타입으로 변환해서 리턴해주는 인터페이스이다.
인터페이스 모양은 다음과 같다.
public interface Converter<S,T>{
T convert(S source);
}
어떤 경우에 사용할까?
예를 들어, 파라미터에 json 형식 문자열이 담겨오는 경우 해당 문자열을 특정 dto에 담고 싶을때 사용한다.
//요청
GET /user-info
x-auth-user : ("id":123,"name":"Paul")
//유지 객체
public class XAuthUser{
private int id;
private String name;
//the usual getters and setter...
}
@GetMapping("/user-info")
public UserInfoResponse getUserInfo{
@RequestHeader("x-auth-user") XAuthUser xAuthUser{
// get User Info logic here...
}
}
위 헤더에 담긴 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나 기타 특수한 경우의 데이터를 특정 객체에 담고 싶은경우
특정 객체를 String으로 변환.
public final class DateFormatter implements Formatter<Date>{
public String print(Date date,Locale locale){
return getDataFormat(locale).format(date);
}
public Date parse(String formatted,Locale locale) throws ParseException{
return getDataFormat(locale).parse(formatted);
}
//getDateFormat 등 일부 구현은 생략...
}
print: API 요청에 대한 응답을 줄때, Date형식으로 된 데이터를 특정 locale에 맞춘 String으로 변환
parse: API 요청을 받아올 때, String으로 된 "2021-01-01 13:15:00" 같은 날짜 형식의 데이터를 Date로 변환하도록 함
Formatter도 converter와 마찬가지로 Spring Bean으로 등록하면 자동으로 ConversionService에 등록시켜주기 때문에 필요(요청/응답 시 해당 데이터 타입이 있는 경우)에 따라 자동으로 동작하게 된다.