Data Binding
- 사용자나 외부 서버의 요청 데이터를 특정 도메인 객체에 저장해서 우리 프로그램의 Request에 담아주는 것을 뜻함
- 요청 데이터를 편하게 내가 원하는 객체로 바꿔주는 역할이라고 보면 될 듯
주로 사용하는 방식
Converter<S,T> 인터페이스
- S 타입을 받아서 T 타입으로 변환해주는 인터페이스
package org.springframework.core.convert.converter;
public interface Converter<S, T> {
T convert(S source);
}
- 웹MVC할 때 요청 데이터를 내가 원하는 객체로 변환할 때 사용한다.
- 작성한 Converter는 빈 등록 해주어야 한다.
- 예시
// 요청
GET /user-info
x-auth-user : {"id":123, "name":"Paul"}
// 유저 객체
public class XAuthUser {
private int id;
private String name;
// the usual getters and setters...
}
// 이 예시에서는 요청이 들어오면 요청헤더에서 x-auth-user를 가져와서 XAuthUser 객체로 바꿔준다.
@GetMapping("/user-info")
public UserInfoResponse getUserInfo(@RequestHeader("x-auth-user") XAuthUser xAuthUser){
// get User Info logic here...
}
// 컨버터 작성
@Component
public class XAuthUserConverter implements Converter<String, XAuthUser> {
// 이 로직에서 바꾸려는 객체로 만들고 반환해주면 된다.
@Override
public XAuthUser convert(String source) {
return objectMapper.readValue(source, XAuthUser.class);
}
}
- 위의 예시는 String → XAuthUser 단방향 변환인데 아래 코드처럼 사용하면 양방향도 가능하다.
public class UserConverter {
@Component
public static class StringToUserConverter implements Converter<String, User> {
@Override
public User convert(String s) {
return new User(Integer.parseInt(s));
}
}
public static class UserToStringConverter implements Converter<User, String> {
@Override
public String convert(User event) {
return String.valueOf(event.getId());
}
}
}
Formatter 인터페이스
- 특정 객체와 String 간의 변환을 담당 (양방향 변환)
- 예시
package org.springframework.format.datetime;
@Component
public final class DateFormatter implements Formatter<Date> {
// API 요청에 대한 응답 시에 Date형식의 데이터를 특정 locale에 맞춘 String으로 변환
public String print(Date date, Locale locale) {
return getDateFormat(locale).format(date);
}
// API 요청을 받아올 때, String으로 된 날짜 형식의 데이터를 Date로 변환
public Date parse(String formatted, Locale locale) throws ParseException {
return getDateFormat(locale).parse(formatted);
}
// getDateFormat 등 일부 구현은 핵심에 집중하기 위해 생략...
}
주의사항
- Converter나 Formatter를 사용하려면 아래와 같이 WebMvcConfigurer를 구현한 설정파일에 등록해주거나
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new UserConverter().UserToStringConverter());
registry.addFormatter(new UserFormatter());
}
}
- Converter 나 Formatter 클래스에 @Component를 붙여 빈으로 등록 해야한다.
댓글