스프링 타입 컨버터 - 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 의 구현체를 찾아보면 수 많은 컨버터를 확인할 수 있다.