Converter

package org.springframework.core.convert.converter;

public interface Converter<S, T> {
    T convert(S source);
}
  • 타입 컨버터를 사용하려면 Converter 인터페이스를 구현한다.

@Slf4j
public class StringToIntegerConverter implements Converter<String, Integer> {

    @Override
    public Integer convert(String source) {
        log.info("convert source={}", source);
        return Integer.valueOf(source);
    }
}

스트링과 숫자 간의 컨버터를 만들었다.

@Getter
@EqualsAndHashCode
public class IpPort {

    private String ip;
    private int port;

    public IpPort(String ip, int port) {
        this.ip = ip;
        this.port = port;
    }
}
  • @EqualsAndHashCode

    • equals & hashcode를 재정의한다.

    • 값이 같으면 같다고 취급한다.

class ConverterTest {

    @Test
    void stringToIpPort() {
        StringToIpPortConverter converter = new StringToIpPortConverter();

        String source = "127.0.0.1:8080";
        IpPort result = converter.convert(source);

        assertThat(result).isEqualTo(new IpPort("127.0.0.1", 8080));
    }

    @Test
    void ipPortToString() {
        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");
    }
}

테스트 코드로 컨버팅 로직을 확인한다. 하지만 이렇게 하나하나 컨버터를 만드는 건 번거롭다.

참고

스프링은 용도에 따라 다양한 타입 컨버터를 제공한다.

  • Converter

    • 기본 타입 컨버터

  • ConverterFactory

    • 전체 클래스 계층 구조가 필요할 때 사용한다.

  • GenericConverter

    • 정교한 구현이 필요할 때 사용한다.

    • 대상 필드의 애너테이션 정보를 사용할 수 있다.

  • ConditionalGenericConverter

    • 특정 조건이 참인 경우에만 실행한다.

스프링은 문자, 숫자, boolean, enum 등 일반적인 타입에 대한 컨버터를 기본으로 제공한다. 위 컨버터의 구현체를 찾아보자.

타입 컨버터

Last updated