개발 기록

> [Spring] Spring 은 요청을 어떻게 처리 해주고 있는 걸까? (4) Convert 본문

DIVE

> [Spring] Spring 은 요청을 어떻게 처리 해주고 있는 걸까? (4) Convert

1z 2023. 12. 8. 23:19

 

 

1 . Converter 개념  

데이터나 신호, 프로그램 등을 어떤 형식에서 다른 형식으로 변환하는 것을 컨버터라고 한다.
ex. 오디오 CD 를 MP3 형식의 음원 파일로 변환해주는 프로그램

 

물론 Spring 에서도 Converter 를 지원하고 있다.  Spring Converter는 전략 인터페이스로 전략패턴으로 사용된다. 

 

 

Converter <S, T>

S는 sourceType,  T는 targetType 으로 이 Convert 인터페이스는 S 에서 T 로 변환해주는 기능의 함수형 인터페이스이다.

 

※ 보통 바인딩한 데이터가 일치하지 않는 경우 실행에 필요한 컨트롤러 메서드의 인자 타입을 맞추기 위해 바인딩한 데이터 타입을 변경하는 용도로 사용한다.

 

2.  Converter 구조  

 

 

1. ConversionServicecanConvert() 메서드를 이용해 내부에 Converter가 등록되어있는지 확인하고 해당 타입으로 convert 가 확인 가능한지 확인한다. 이후 convert() 메서드로 실제 convert 를 수행한다.

2. ConverterRegistryaddConverter() 메서드로 Converter 를 등록한다.

정리하자면, ConversionService 와 ConverterRegistry 상속하는 ConfigurableConversionService 인터페이스의 구현체는  Converter를 내부적으로 관리하고 sourceType을 targetType 으로 변환하는 역할을 한다.  

 

 

2.  사용처   

 

ArgumentResolver 가 핸들러 메서드의 인자값을 바인딩 할 때 Converter 를 사용한다.

 

 

 

(1) resolverArugument

 

메서드 파라미터 타입을 확인하고 동일하지 않다면 convertIfNessary 메서드를 호출한다.

 

- biderFactory : 요청 핸들러 메서드의 Parameter를 Binding할 데이터 바인더를 생성하는 팩토리

- arg :  해당 argument (ex. RequestParamMethodArgumentResolver) 에서 요청값을 담은 obj

 

 

 

(2) convertIfNessary

 

convertIfNessary 메서드를 최종적으로 구현한 TypeConverterDelegate  ClassconvertIfNessary 메서드 부분이다. 

 

Converter를 관리하는 ConversionService 불러와서  convert  가능시 수행하여 컨트롤러 메서드 인자 type과 일치시켜준다.

 

 

 

 

 

 

참고

https://www.baeldung.com/spring-httpmessageconverter-rest

https://cl8d.tistory.com/11

https://velog.io/@e1psycongr00/Converter-%EB%B6%84%EC%84%9D%ED%95%98%EA%B8%B0