
HTTP 요청 파라미터는 모두 문자열로 처리되기 때문에, 요청 파라미터를 다른 제너릭 타입으로 변환하기 위해서는 변환하는 과정을 거쳐야 한다.@RequestParam, @ModelAttribute, @PathVariable 같은 어노테이션이 해당 과정을 대신해주기도 한다.
Converter라는 인터페이스를 구현해서 사용할 수 있다. Converter<S,T> 형태에서 S는 입력값의 형태를, T에는 변환하길 원하는 형태를 의미한다. public class StringToIntegerConverter implements Converter<String,Integer> {
@Override
public Integer convert(String source) {
return Integer.valueOf(source);
}
}
Converter를 구현하는 클래스를 만든 후 제네릭으로 원하는 자료형들을 넣어주면 매개변수와 반환 타입이 설정된 convert 메서드를 오버라이딩 할 수 있다. TypeConverter를 매번 직접 찾아서 형 변환에 사용하는 것은 불편하기 때문에, 스프링은 모든 컨버터들을 관리해주고, 클라이언트가 원하는 자료형을 입력만 하면 알아서 컨버터를 찾아서 적용해주는ConverionService를 제공한다.@Test
void conversionService() {
// conversionService 생성
DefaultConversionService conversionService = new DefaultConversionService();
// conversionService에 converter 등록
conversionService.addConverter(new StringToIntegerConverter());
assertThat(conversionService.convert("10", Integer.class)).isEqualTo(10);
}
DefaultConversionService는 인터페이스인 ConversionService의 구현체이다. convert 메서드에 입력값과 원하는 반환 타입만 지정해주면, conversionService는 등록한 컨버터중에 해당 작업을 진행할 수 있는 컨버터를 자동으로 찾아준다. @Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToIntegerConverter());
}
}
WebConfig 클래스를 만든 후 WebMvcConfigurer 인터페이스를 구현한다. WebMvcConfigurer는 MVC와 관련된 각종 커스터마이징 및 설정을 가능하게 해준다. String이 컨트롤러로 들어오면 @RequestParam,@ModelAttribute, @PathVariable 에서 Integer형으로 받을 시, 등록해둔 컨버터가 동작한다.Converter vs Formatter
Converter는 입출력 타입에 제한이 없는 범용적인 타입 변환 기능을 제공한다.converter가 formatter보다 우선순위가 높으므로, 비슷한 기능을 하는 converter가 있을 경우 formatter가 정상적으로 동작하지 않는다.💡 스프링은 이미 수많은 타입 컨버터를 구현해놓았고, conversionService를 내장하고 있기 때문에, 특별한 경우( ex> String을 입력 후 내가 만든 커스텀 객체로 변환할 때)를 제외하고는 스프링 내장 컨버터가 알아서 변환해준다.
출처
[Spring] 스프링 타입 컨버터 정리
[SpringBoot] 스프링 TypeConverter 정리
[Spring Boot] : ComversionServcie 사용해 보기