컨버전 서비스 - ConversionService
이렇게 타입 컨버터를 하나하나 직접 찾아서 타입 변환에 사용하는 것은 매우 불편합니다. 그래서 스프링은 개별 컨버터를 모아두고 그것들을 묶어서 편리하게 사용할 수 있는 기능을 제공하는데, 이것이 바로 컨버전 서비스( ConversionService )입니다.
컨버전 서비스 인터페이스는 단순히 컨버팅이 가능한가? 확인하는 기능(canConvert)과, 컨버팅 기능(convert)을 제공합니다.
또한 추가로 컨버터를 등록하는 기능(addConverter)도 있어서 우리는 아래와 같이 컨버터를 등록하면 됩니다.
위에서 지금까지 만든 4개의 컨버터를 등록했습니다.
사용은 아래와 같이 합니다.
위와 같이 첫번째 인자로 타입이 변경되길 원하는 값, 두번째로 인자로 변경되었으면 하는 타입을 넣으면 우리가 등록한 컨버터를 보고 적절한 컨버터를 찾아 컨버팅을 해줍니다.
즉 위의 result는 정수 10이 됩니다.
이제 테스트를 해보겠습니다.
우리가 등록한 컨버터들이 잘 작동합니다.
스프링은 내부에서 ConversionService 를 사용해서 타입을 변환합니다.
예를 들어서 앞서 살펴본 @RequestParam 같은 곳에서 이 기능을 사용해서 타입을 변환하는 것입니다.
이제 컨버전 서비스를 스프링에 적용해보겠습니다.
스프링에 Converter 적용하기
먼저 우리가 만든 컨버터들을 스프링이 알 수 있도록 등록해두어야 합니다. 이전에 필터, 인터셉터를 등록했던것과 같이 WebConfig를 만들고, @Configuration 어노테이션과 WebMvcConfigurer를 implements하면 됩니다.
이제 컨트롤러에 /hello-v2?data=10으로 요청해보겠습니다.
결과를 보시면 아래와 같이 우리가 등록한 StringToIntegerConverter가 적용된 것을 볼 수 있습니다.
이제 IpPortConverter가 적용되는 것을 보겠습니다.
아래와 같은 요청을 날려보면
StringToIpPortConverter가 적용된 것을 볼 수 있습니다.
처리 과정
@RequestParam 은 @RequestParam 을 처리하는 ArgumentResolver 인 RequestParamMethodArgumentResolver 에서 ConversionService 를 사용해서 타입을 변환합니다. 부모 클래스와 다양한 외부 클래스를 호출하는 등 복잡한 내부 과정을 거치기 때문에 대략 이렇게 처리되는 것으로 이해해도 충분합니다. 만약 더 깊이있게 확인하고 싶으면 IpPortConverter 에 디버그 브레이크 포인트를 걸어서 확인해보시면 됩니다.
'Spring > spring mvc 심화' 카테고리의 다른 글
포맷터 - Formatter (0) | 2021.07.18 |
---|---|
뷰 템플릿에 컨버터 적용하기 (0) | 2021.07.18 |
타입 컨버터 (0) | 2021.07.17 |
12 Bean Validator3 - 등록용, 수정용 Item분리 (0) | 2021.07.08 |
11 Bean Validator3 - groups (0) | 2021.07.08 |