스프링/4. 스프링 MVC-2

77. 컨버전 서비스

sdafdq 2023. 9. 23. 20:28

우리가 정의한 컨버터를 직접 호출해서 썼다.

하지만 일일히 이렇게 호출해서 쓰면 굳이 스프링의 컨버터를 상속받아 사용한 의미가 없다.

 

이런 컨버터들을 모아서 관리해주는 것이 바로 컨버전 서비스이다.

 

이것도 어댑터 패턴이다.

 

public interface ConversionService {

	boolean canConvert(@Nullable Class<?> sourceType, Class<?> targetType);
	boolean canConvert(@Nullable TypeDescriptor sourceType, TypeDescriptor targetType);

	@Nullable
	<T> T convert(@Nullable Object source, Class<T> targetType);

	@Nullable
	Object convert(@Nullable Object source, @Nullable TypeDescriptor sourceType, TypeDescriptor targetType);

}

실제 인터페이스는 이렇게 생겼다.

 

 

 

 

이제 컨버전 서비스에 추가시켜 테스트해보자.

 

public class ConversionServiceTest {
    @Test
    public void conversionService(){
        DefaultConversionService conversionService = new DefaultConversionService();
        conversionService.addConverter(new StringToIntegerConverter());
        conversionService.addConverter(new IntegerToStringConverter());
        conversionService.addConverter(new IpPortToStringConverter());
        conversionService.addConverter(new StringIpPortConverter());

        Integer strToInt = conversionService.convert("10",Integer.class);
        assertThat(strToInt).isEqualTo(10);

        String intToStr = conversionService.convert(10,String.class);
        assertThat(intToStr).isEqualTo("10");

        IpPort strToIpPort = conversionService.convert("127.0.0.0:8080",IpPort.class);
        assertThat(strToIpPort).isEqualTo(new IpPort("127.0.0.0", 8080));

        String ipPortTostr = conversionService.convert(new IpPort("127.0.0.0", 8080),String.class);
        assertThat(ipPortTostr).isEqualTo("127.0.0.0:8080");
    }
}

참고로 DefaultConversionService는 ConversionService 구현체 중 하나이다.

 

이름처럼 기본 컨버전 서비스이다.

추가할때는

컨버전서비스.addConverter(추가할컨버터클래스)

이렇게이고

 

사용할 때는

컨버전서비스.convert(소스, 변화할타입)

이다.

 

이것의 장점은 물론 등록할 때는 어떤컨버터를 등록하는지 알아야 하지만, 사용하는 입장에서는 그냥 근원이되는 소스와 바꿀 타입만 알고 있어도 된다.

 

 

참고로, DefaultConversionService는 ConversionService, ConverterRegistry 이렇게 두개의 인터페이스를 동시에 구현한 것이다.

ConversionService는 위와 같이 어댑터타입으로, 실제로 사용하는 것이 관심사인 인터페이스고,

ConverterRegistry는 이름 그대로 컨버터를 등록하는 것이 관심사인 인터페이스이다.

 

이렇게 관심사를 분리하는 것이 중요하다.

 

'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글

79. 컨버터를 뷰 템플릿에 적용  (0) 2023.09.23
78. 컨버전서비스 실제 사용  (0) 2023.09.23
76. 스프링 타입컨버터  (0) 2023.09.22
75. 스프링의 자동 타입 변환  (0) 2023.09.22
74. ControllerAdviece  (0) 2023.09.17