스프링 타입 컨버터 - Converter

    타입 컨버터를 사용하려면 org.springframework.core.convert.converter.Converter 인터페이스를 구현하면 된다.

     

    주의 

    Converter 라는 이름의 인터페이스가 많으니 조심해야 한다.

    org.springframework.core.convert.converter.Converter 를 사용해야 한다.

     

    컨버터 인터페이스

    package org.springframework.core.convert.converter;
    
    public interface Converter<S, T> {
     	T convert(S source);
    }

     

    먼저 가장 단순한 형태인 문자를 숫자로 바꾸는 타입 컨버터를 만들어보자.

     

    StringToIntegerConverter - 문자를 숫자로 변환하는 타입 컨버터

     

    package hello.typeconverter.converter;
    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);
     	}
    }

    String -> Integer 로 변환하기 때문에 소스가 String 이 된다.

    이 문자를 Integer.valueOf(source) 를 사용해서 숫자로 변경한 다음에 변경된 숫자를 반환하면 된다.

     

    IntegerToStringConverter - 숫자를 문자로 변환하는 타입 컨버터

     

    package hello.typeconverter.converter;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.core.convert.converter.Converter;
    
    @Slf4j
    public class IntegerToStringConverter implements Converter<Integer, String> {
     	@Override
     	public String convert(Integer source) {
     		log.info("convert source={}", source);
     		return String.valueOf(source);
     	}
    }

    이번에는 숫자를 문자로 변환하는 타입 컨버터이다. 앞의 컨버터와 반대의 일을 한다. 이번에는 숫자가 입력되기 때문에 소스가 Integer 가 된다. String.valueOf(source) 를 사용해서 문자로 변경한 다음 변경된 문자를 반환하면 된다.

     

    테스트 코드를 통해 타입 컨버터가 어떻게 동작하는지 확인해보자

    ConverterTest - 타입 컨버터 테스트 코드

    package hello.typeconverter.converter;
    import org.junit.jupiter.api.Test;
    import static org.assertj.core.api.Assertions.*;
    
    class ConverterTest {
     
     	@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");
     	}
    }

    타입 컨버터 인터페이스가 단순해서 이해하기 어렵지 않을 것이다. 그런데 이렇게 타입 컨버터를 하나하나 직접 사용하면, 개발자가 직접 컨버팅 하는 것과 큰 차이가 없다. 타입 컨버터를 등록하고 관리하면서 편리하게 변환 기능을 제공하는 역할을 하는 무언가가 필요하다.

     

    참고

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

    > Converter 기본 타입 컨버터

    > ConverterFactory 전체 클래스 계층 구조가 필요할 때

    > GenericConverter 정교한 구현, 대상 필드의 애노테이션 정보 사용 가능

    > ConditionalGenericConverter 특정 조건이 참인 경우에만 실행

     

    참고

    스프링은 문자, 숫자, 불린, Enum등 일반적인 타입에 대한 대부분의 컨버터를 기본으로 제공한다. IDE에서 Converter , ConverterFactory , GenericConverter 의 구현체를 찾아보면 수 많은 컨버터를 확인할 수 있다.

    댓글