Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[TypeConverter] conversionService 본문

인프런/[인프런] 스프링 MVC 2

[TypeConverter] conversionService

Seung__ 2021. 10. 1. 23:02

1. 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);
}
  • Convert 할수 있냐????, Converting 두 기능 제공.

 

2. 사용


  • DefaultConversionService는 Converter 인터페이스의 구현체 중 하나.
    @Test
    void conversionService(){
        //등록
        DefaultConversionService conversionService = new DefaultConversionService();
        conversionService.addConverter(new StringToIntegerConverter());
        conversionService.addConverter(new IntegerToStringConverter());
        conversionService.addConverter(new StringToIpPortConverter());
        conversionService.addConverter(new IpPortToStringConverter());

        //사용
        Integer result = conversionService.convert("10", Integer.class);
        System.out.println("result = " + result);
        Assertions.assertThat(result).isEqualTo(10);
    }
  • log
    • "10"을 숫자 10으로 변환.
    • StringToInetegerConverter가 자동으로 선택됨.
22:31:18.796 [Test worker] INFO hello.typeconverter.converter.StringToIntegerConverter- convert source= 10
result = 10
  • 다른 test 추가
    @Test
    void conversionService(){
        //등록
        DefaultConversionService conversionService = new DefaultConversionService();
        conversionService.addConverter(new StringToIntegerConverter());
        conversionService.addConverter(new IntegerToStringConverter());
        conversionService.addConverter(new StringToIpPortConverter());
        conversionService.addConverter(new IpPortToStringConverter());

        //사용
        Integer result = conversionService.convert("10", Integer.class);
        System.out.println("result = " + result);
        assertThat(result).isEqualTo(10);

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

        assertThat(conversionService.convert("127.0.0.1:8080", IpPort.class))
                .isEqualTo(new IpPort("127.0.0.1", 8080));

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

 

 

 

3. 등록과 사용 분리


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

 

 

 

4. ISP(Interface Separation Principle)


  • 인터페이스 분리 원칙
  • 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다.
  • DefaultConversionService 는 다음 두 인터페이스를 구현했다.
    • ConversionService : 컨버터 사용에 초점
    • ConverterRegistry : 컨버터 등록에 초점
  • 이렇게 인터페이스를 분리하면 컨버터를 사용하는 클라이언트와 
  • 컨버터를 등록하고 관리하는 클라이언트의 관심사를 명확하게 분리
  • 특히 컨버터를 사용하는 클라이언트는 ConversionService 만 의존
  • 컨버터를 어떻게 등록하고 관리하는지는 전혀 몰라도 된다.
  • 컨버터를 사용하는 쪽은 ConversionService를 사용함. ConverterResitry 인터페이스를 사용하지 않음.
  • 결과적으로 컨버터를 사용하는 클라이언트는 꼭 필요한 메서드만 알게된다. 
  • 이렇게 인터페이스를 분리하는 것을 ISP 라 한다

 

 

5. GitHub : 211001 ConversionService


 

GitHub - bsh6463/TypeConverter

Contribute to bsh6463/TypeConverter development by creating an account on GitHub.

github.com

 

 

Comments