Spring ‐ 스프링 타입 컨버터 - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 스프링 타입 컨버터
[ Converter 예시 코드 작성 ]
@Slf4j
public class IntegerToStringConverter implements Converter<Integer, String> {
@Override
public String convert(Integer source) {
return String.valueOf(source);
}
}
@Slf4j
public class StringToIntegerConverter implements Converter<String, Integer> {
@Override
public Integer convert(String source) {
return Integer.valueOf(source);
}
}
- A → B, B → A 타입으로 변환하는 컨버터들을 직접 개발하면 매우 불편하다.
- 이를 위해 스프링은 ConversionService를 제공한다. ConversionService는 컨버터를 모아두고 묶어서 편리하게 사용할 수 있는 기능을 제공한다.
📚 ConversionService
// 등록 -> 추가적으로 여러 컨버터들 등록 가능
DefaultConversionService conversionService = new DefaultConversionService();
conversionService.addConverter(new IntegerToStringConverter());
conversionService.addConverter(new IpPortToStringConverter());
//사용
IpPort ipPort = conversionService.convert("127.0.0.1:8080", IpPort.class);
assertThat(ipPort).isEqualTo(new IpPort("127.0.0.1", 8080));
String ipPortString = conversionService.convert(new IpPort("127.0.0.1", 8080), String.class);
assertThat(ipPortString).isEqualTo("127.0.0.1:8080");
- 위와 같이 등록해도 실제로 스프링에 등록되지 않는다.
- 스프링에 등록하기 위해서는 WebMvcConfigurer가 제공하는 addFormatter()를 사용해서 컨버터를 스프링에 등록해주면 된다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToIntegerConverter());
registry.addConverter(new IntegerToStringConverter());
}
}
📚 Formatter
- Converter는 문자를 객체로, 객체를 문자로 변환하는 등의 범용적인 타입 변환 기능을 제공한다.
- Formatter는 객체를 특정한 포맷에 맞추어 문자로 출력하거나 그 반대 기능을 할 수 있도록 한다.
- Printer 인터페이스의 print() 메서드 : 객체를 문자로 변환
- Parser 인터페이스의 parser() 메서드 : 문자를 객체로 변환
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToIntegerConverter());
registry.addConverter(new IntegerToStringConverter());
registry.addFormatter(new DateFormatter());
}
}
- Formatter 역시 위와 같이 WebMvcConfigurer 인터페이스에서 addFormatter() 메서드로 추가하면 된다.
❗사실 스프링에서 이미 수많은 포맷터를 이미 기본으로 제공해준다. 따라서 직접 만들어 사용할 일이 거의 없다. ❗가장 많이 사용되는 포맷터는 @NumberFormat, @DateTimeFormat이 있다.