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] Type Converter 본문

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

[TypeConverter] Type Converter

Seung__ 2021. 10. 1. 22:25
  • 타입 컨버터를 사용하려면 org.springframework.core.convert.converter.Converter 를 구현 ㅋㅋㅋㅋ
  • Converter라는 인터페이스가 너무 많음.. 조심 ㅎㅎ

1. String -> Integer


import lombok.extern.slf4j.Slf4j;
import org.springframework.core.convert.converter.Converter;

@Slf4j
public class StringToIntegerConverter implements Converter<String, Integer> {
    
    @Override
    public Integer convert(String source) {
      log.info("convert source= {}", source);
      return Integer.valueOf(source);
    }
    
}

 

 

2. Integer -> String


@Slf4j
public class IntegerToStringConverter implements Converter<Integer, String> {
    
    @Override
    public String convert(Integer source) {
        log.info("convert source={}", source);
        return  String.valueOf(source);
    }
}

 

 

3. Test


    @Test
    void stringToInteger(){
        StringToIntegerConverter converter = new StringToIntegerConverter();
        Integer result = converter.convert("10");
        assertThat(result).isEqualTo(10);
    }

    @Test
    void IntegerToString(){
        IntegerToStringConverter converter = new IntegerToStringConverter();
        String result = converter.convert(10);
        assertThat(result).isEqualTo("10");
    }

 

 

4. String -> IpPort


@Getter
@EqualsAndHashCode //field값이 모두 같으면 같은애로 처리.
public class IpPort {

    private String ip;
    private int port;

    public IpPort(String ip, int port) {
        this.ip = ip;
        this.port = port;
    }
}
@Slf4j
public class StringToIpPortConverter implements Converter<String, IpPort> {


    @Override
    public IpPort convert(String source) {
        log.info("converter source = {}", source);
        //"127.0.0.1:8080"
        String[] split = source.split(":");
        String ip = split[0];
        int port = Integer.parseInt(split[1]);
        return new IpPort(ip, port);
    }
}

 

 

5. IpPort -> String


@Slf4j
public class IpPortToStringConverter implements Converter<IpPort, String> {
    @Override
    public String convert(IpPort source) {
        log.info("convert source={}", source);
        //IpPort객체 -> "127.0.0.1:8080"
        return source.getIp() + ":" + source.getPort();

    }
}

 

 

 

6. Test


    @Test
    void stringToIpPort(){
        IpPortToStringConverter converter = new IpPortToStringConverter();
        IpPort source = new IpPort("127.0.0.1", 8080);
        String result = converter.convert(source);
        assertThat(result).isEqualTo("127.0.0.1:8080");
    }

    @Test
    void IpPortToString(){
        StringToIpPortConverter converter = new StringToIpPortConverter();
        String source = "127.0.0.1:8080";
        IpPort result = converter.convert(source);
        assertThat(result.getIp()).isEqualTo("127.0.0.1");
        assertThat(result.getPort()).isEqualTo(8080);
        assertThat(result).isEqualTo(new IpPort("127.0.0.1", 8080));
    }
  • 어? assertThat(result).isEqualTo(new IpPort("127.0.0.1", 8080)); 이게 가능한가??
  • @EqualsAndHashCode는 field의 값이 같으면 참조값이 달라도 같다고 본다.

 

그런데 이렇게 흠.. 일일히 사용하면 별론데? 직접 하는거랑 차이가 없다.

TypeConverter를 등록하고 편리하게 사용하고 싶다...

 

 

 

7. 정리


  • 스프링은 용도에 따라 다양한 방식의 타입 컨버터를 제공한다.
  •  Converter 기본 타입 컨버터
  •  ConverterFactory 전체 클래스 계층 구조가 필요할 때
  •  GenericConverter 정교한 구현, 대상 필드의 애노테이션 정보 사용 가능
  •  ConditionalGenericConverter 특정 조건이 참인 경우에만 실행
  •  https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#coreconvert
  •  스프링은 문자, 숫자, 불린, Enum등 일반적인 타입에 대한 대부분의 컨버터를 기본으로 제공한다.
  • IDE에서 onverter , ConverterFactory , GenericConverter 의 구현체 보면 여러 converter 볼 수 있음.

 

8. GitHub : TypeConverter


 

GitHub - bsh6463/TypeConverter

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

github.com

 

Comments