ConversionService
타입 컨버터를 하나하나 만드는 것은 번거롭다.
스프링은 개별 컨버터를 모아서 ConversionService를 통해 편리하게 사용할 수 있도록 해준다.
ConversionService에 컨버터를 등록하면 변환해준다.
등록과 사용의 분리
컨버터를 등록할 때는 어떤 타입 컨버터인지 알아야 한다.
컨버터를 사용할 때는 타입 컨버터가 어떤 건지 몰라도 된다.
타입 컨버터는 컨버전 서비스 내부에 숨어서 제공된다.
사용하는 쪽은 컨버전 서비스 인터페이스에만 의존하면 된다.
인터페이스 분리 원칙
DefaultConversionService는 두 인터페이스를 구현한다.
ConversionService
컨버터 사용에 초점을 둔다.
ConverterRegistry
컨버터 등록에 초점을 둔다.
이렇게 인터페이스가 분리되어 있으면 등록하는 쪽과 사용하는 쪽의 관심사를 분리할 수 있다.
Converter 적용하기
스프링은 내부에서 ConversionService를 제공한다.
WebMvcConfigurer.addFormatters()에 컨버터를 등록하면 내부에서 사용하는 ConversionService에 컨버터를 추가해준다.
요청을 날려보면 쿼리 스트링이라 문자인데도 Integer로 파라미터를 잘 받는다.
근데 예전에는 우리가 StringToIntegerConverter를 등록하지 않아도 코드가 잘 실행됐었다. 스프링이 이미 수 많은 기본 컨버터를 제공하기 때문이다.
만약 커스텀 컨버터를 추가하면 기본 컨버터보다 높은 우선 순위를 가진다.
커스텀 컨버터도 잘 동작하는 것을 확인했다. 컨버터는 @RequestParam 뿐 아니라 @ModelAttribute 등에도 다 적용이 된다.
처리 과정
@RequestParam을 처리하는 RequestParamMethodArgumentResolver에서
ConversionService를 사용해 타입을 변환한다.
Last updated
Was this helpful?