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 사용해 보기