데이터 바인딩 이란 두 데이터 혹은 정보의 소스를 모두 일치시키는 기법이다. 즉, 어플리케이션 화면에 있는 객체와 데이터를 일치시키는 일을 뜻한다.
웹에서 사용자는 주로 서버에 문자열 형태로 서버에 전달을 한다. 서버에서는 사용자에게 받은 문자열을 도메인 객체의 타입으로 변환을 해서 사용을 해야 한다.
Spring에서는 데이터 바인딩 기능을 인터페이스로 추상화 하여 제공한다. 스프링 버전3 이전 까지는 PropertyEditor를 사용하여 데이터 바인딩을 하였다. 하지만 이는 상태 정보를 저장하고 있어(thread간 공유됨) thread-safe 하지 않은 방법이라 이제는 잘 쓰이지 않는다.
여기서는 상태 정보를 저장하지 않는 thread-safe한 방법인 Converter와 Formatter에 대해서 정리하였다.
Converter는 S타입을 T타입으로 바꾸는 변환기이다.
Converter 인터페이스를 implements하여 사용하고, 두 개의 제너릭타입 <source, target>을 받는다.
@RestController @RequestMapping("/convert") public class ConvertController { @GetMapping("/myconvert/{id}") public String MyConverter(ConvertExBean id) { // URI에서 {id}값을 String으로 요청하지만 Converter가 파라메터를 객체 변환한다. System.out.println(id) return "Y"; } }
@Component public class MyConverter implements Converter<String, ConvertExBean>{ // String -> ConvertExBean으로 컨버팅 @Override public ConvertExBean convert(String source){ ConvertExBean ex = new ConvertExBean(); ex.setId(source); return ex; } }
Spring Web MVC를 사용하는 경우, 아래처럼 config 클래스에서 addFormatter를 오버라이딩해야 한다.(MVC 웹 설정 등록)
하지만 Spring boot에서는 위 코드 처럼 @Component 어노테이션을 사용하여 bean로 등록하기만 하면 MVC 웹 설정을 따로 할 필요가 없다.
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new MyConverter); } }
Formatter는 String을 Object 타입으로 변환하는 변환기이다. Formatter는 Web에 사용하기 적합하다. 또한, 문자열을 Locale에 따라 다국화 하는 기능을 제공한다.
Formatter는 String-Object간의 변환을 담당하기 때문에 인자로는 Object 하나만 받는다.
@RestController @RequestMapping("/formatter") public class ConvertController { @GetMapping("/myformatter/{id}") public String myFormatter(@PathVariable("id") FormatterExBean ex) { // @PathVariable() 안에 {경로} 값을 써넣든지, 객체의 이름과 같게 해야 한다. System.out.println("ex : " + ex); return ex.getId().toString(); } }
@Component public class MyFormatter implements Formatter<FormatterExBean> { @Override public FormatterExBean parse(String text, Locale locale) throws ParseException { // String -> Object FormatterExBean formatterExBean = new FormatterExBean(); formatterExBean.setId(text); return formatterExBean; } @Override public String print(FormatterExBean object, Locale locale) { // Object -> String return object.getId(); } }
Formatter도 Converter와 마찬가지로 Spring Web MVC를 사용하는 경우에는WebMvcConfigurer 인터페이스를 구현한 클래스를 작성해야 하며, Spring boot에서는 @Component 어노테이션을 통해 빈에 등록하여 사용한다.
.
따로 Converter나 Formatter에 등록하지 않더라도 String에서는 String -> Integer, String -> boolean 등 기본적으로 Conversion을 제공한다.
이는 ConversionService에 기본적으로 등록돼 있으며, Converter나 Formatter를 bean으로 등록한다면 이 ConversionService에 추가가 된다.