[Spring] Converter 분석하기

임현규·2023년 4월 20일
0

개인 공부

목록 보기
2/11
post-custom-banner

Converter란?

Spring Converter는 전략 인터페이스로 전략패턴으로 사용된다. Converter는 제네릭으로 <S, T> 를 받는데 S는 sourceType, T는 targetType로 단순히 타입을 바꿔주는 함수형 인터페이스라 할 수 있다. 이를 전략패턴을 활용해 Handler처럼 사용한다.

ConfigurableConversionService

ConfigurableConversionService는 ConversionService와 ConverterRegistry 타입의 Mix Type이다.

ConversionService는 실제 convert 동작을 수행하는 부분으로 canConvert를 이용해 내부에 Converter가 등록되어있는지 확인하고 해당 타입으로 convert가 확인 가능한지 확인한다. convert로 실제 convert 로직이다.

ConverterRegistry는 addConverter와 같은 메서드를 제공하고 Converter를 등록하는 책임을 가진다.

정리하자면, ConfigurableC는 Converter를 내부적으로 관리하고 호출해서 sourceType -> targetType으로 바꾸는 타입이라 할 수 있다.

Converter 동작 원리

요약

기본적으로 HandlerAdapter에서 InvocableHandlerMethod에서 resolveArgument 호출까지는 같다. 그러나 AbstractnamedValueMethodArgumentResolver에서 구현된 resolveArgument에서 메서드 파라미터 타입을 체킹하고 동일하지 않다면 Converter를 관리하는 ConversionService 타입을 호출해 convert를 수행해서 컨트롤러 method type과 일치해주는 역할을 수행한다.

코드 분석

HandlerMethodArgumentResolver 타입의 템플릿인 AbstractNamedValueMethodArgumentResolver에서 resolveArgument를 호출할 때
마지막에 타입이 일치하지 않으면 동작한다.

여기서 핵심은 resoveName과 WebDataBinder의 convertIfNessary이다.

resoveName은 해당 템플릿을 상속한 자식 ArgumentResolver에게 데이터 바인드 동작 핵심 로직을 위임한다. 여튼 해당 메서드를 통해 arugment를 가져오는데 컨트롤러 메서드에서 정의한 타입과 맞지 않다면 WebDataBinder에서 convertIfNessary를 호출한다.

convertIfNessary를 통해 TypeConverterDelegate의 convertIfNessary를 호출하고 결과적으로 해당 클래스에서 ConversionService 타입을 호출해 convert가 가능하면 convert를 호출한다

profile
엘 프사이 콩그루
post-custom-banner

0개의 댓글