Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Spring Boot
- transaction
- jpa
- 스프링
- SpringBoot
- Servlet
- Exception
- 스프링 핵심 기능
- pointcut
- QueryDSL
- 백준
- db
- 자바
- JDBC
- Greedy
- java
- 인프런
- Thymeleaf
- Proxy
- http
- kotlin
- JPQL
- 김영한
- 알고리즘
- Android
- 그리디
- spring
- AOP
- springdatajpa
- 스프링 핵심 원리
Archives
- Today
- Total
개발자되기 프로젝트
[TypeConverter] conversionService 본문
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
'인프런 > [인프런] 스프링 MVC 2' 카테고리의 다른 글
[TypeConverter] View Template에 적용 (0) | 2021.10.02 |
---|---|
[TypeConverter] Spring에Converter 적용 (0) | 2021.10.01 |
[TypeConverter] Type Converter (0) | 2021.10.01 |
[TypeConverter] Spring Type Converter (0) | 2021.10.01 |
[API예외] @ControllerAdvice (0) | 2021.10.01 |
Comments