스프링 타입 컨버터 - 컨버전서비스(ConversionService)

    타입 컨버터를 하나하나 직접 찾아서 타입 변환에 사용하는 것은 매우 불편하다. 그래서 스프링은 개별 컨버터를 모아두고 그것들을 묶어서 편리하게 사용할 수 있는 기능을 제공하는데, 이것이 바로 컨버전 서비스( ConversionService )이다.

     

    ConversionService 인터페이스

    package org.springframework.core.convert;
    import org.springframework.lang.Nullable;
    
    public interface ConversionService {
    	boolean canConvert(@Nullable Class<?> sourceType, Class<?> targetType);
    	boolean canConvert(@Nullable TypeDescriptor sourceType, TypeDescriptor targetType);
    	<T> T convert(@Nullable Object source, Class<T> targetType);
    	Object convert(@Nullable Object source, @Nullable TypeDescriptor sourceType,
    	TypeDescriptor targetType);
    }

    컨버전 서비스 인터페이스는 단순히 컨버팅이 가능한가? 확인하는 기능과, 컨버팅 기능을 제공한다.

     

    사용 예 코드 작성

    ConversionServiceTest - 컨버전 서비스 테스트 코드

     

    package hello.typeconverter.converter;
    
    import hello.typeconverter.convertor.IntegerToStringConverter;
    import hello.typeconverter.convertor.IpPortToStringConverter;
    import hello.typeconverter.convertor.StringToIntegerConvertor;
    import hello.typeconverter.convertor.StringToIpPortConverter;
    import hello.typeconverter.type.IpPort;
    import org.assertj.core.api.Assertions;
    import org.junit.jupiter.api.Test;
    import org.springframework.core.convert.support.DefaultConversionService;
    
    import static org.assertj.core.api.Assertions.*;
    
    public class ConversionServiceTest {
    
        @Test
        void conversionService(){
            //등록
            DefaultConversionService conversionService = new DefaultConversionService();
            conversionService.addConverter(new StringToIntegerConvertor());
            conversionService.addConverter(new IntegerToStringConverter());
            conversionService.addConverter(new StringToIpPortConverter());
            conversionService.addConverter(new IpPortToStringConverter());
    
            //사용
            Integer result = conversionService.convert("10", Integer.class);
            assertThat(result).isEqualTo(10);
    
            assertThat(conversionService.convert(10, String.class)).isEqualTo("10");
            IpPort ipPort = conversionService.convert("127.0.0.1:8080", IpPort.class);
            assertThat(ipPort).isEqualTo(new IpPort("127.0.0.1", 8080));
    
            String ipPortString = conversionService.convert(new IpPort("127.0.0.1", 8080), String.class);
            assertThat(ipPortString).isEqualTo("127.0.0.1:8080");
        }
    }

    DefaultConversionService 는 ConversionService 인터페이스를 구현했는데, 추가로 컨버터를 등록하는 기능도 제공한다.

     

    등록과 사용 분리

    컨버터를 등록할 때는 StringToIntegerConverter 같은 타입 컨버터를 명확하게 알아야 한다. 반면에 컨버터를 사용하는 입장에서는 타입 컨버터를 전혀 몰라도 된다. 타입 컨버터들은 모두 컨버전 서비스 내부에 숨어서 제공된다. 따라서 타입을 변환을 원하는 사용자는 컨버전 서비스 인터페이스에만 의존하면 된다. 물론 컨버전 서비스를 등록하는 부분과 사용하는 부분을 분리하고 의존관계 주입을 사용해야 한다.

     

    컨버전 서비스 사용

    Integer value = conversionService.convert("10", Integer.class);

     

    스프링은 내부에서 ConversionService 를 사용해서 타입을 변환한다. 예를 들어서 앞서 살펴본 @RequestParam 같은 곳에서 이 기능을 사용해서 타입을 변환한다. 이제 다음 장에서 컨버전 서비스를 스프링에 적용해보자.

    'SPRING' 카테고리의 다른 글

    스프링이 제공하는 기본 포맷터  (0) 2023.12.31
    포맷터 - Formatter  (0) 2023.12.30
    스프링 타입 컨버터 - Converter  (1) 2023.12.29
    API 예외 처리 - @ControllerAdvice  (0) 2023.12.29
    API 예외처리 - @ExceptionHandler  (2) 2023.12.29

    댓글