스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - (52) 스프링 부트 - 스프링 타입 컨버터 - 타입 컨버터
인프런 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술편을 학습하고 정리한 내용 입니다.
타입 컨버터 - Converter
타입 컨버터를 어떻게 사용하는지 코드로 알아보자.
타입 컨버터를 사용하려면 org.springframework.core.convert.converter.Converter 인터페이스를 구현하면 된다.
주의
Converter라는 이름의 인터페이스가 많으니 조심해야 한다.org.springframework.core.convert.converter.Converter를 사용해야 한다.
간단하게 문자를 숫자로 바꾸는 컨버터를 구현해 보자.
StringToIntegerConverter - 문자를 숫자로 변환하는 타입 컨버터

converter 패키지를 만들고 그 안에 StringToIntegerConverter 생성

Converter 많다. 주의
1
2
3
4
5
6
7
8
9
@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이 된다.
이번엔 반대로 해보자.
IntegerToStringConverter - 숫자를 문자로 변환하는 타입 컨버터
hello.typeconverter.converter.IntegerToStringConverter
1
2
3
4
5
6
7
8
9
@Slf4j
public class IntegerToStringConverter implements Converter<Integer,String> {
@Override
public String convert(Integer source) {
log.info("convert source={}", source);
return source.toString();
}
}
반대로 된 코드다. 어렵지 않을 것이다.
숫자.toString() 한 것 뿐.
테스트 코드를 통해 타입 컨버터가 어떻게 동작하는지 알아보자.
ConverterTest - 타입 컨버터 테스트 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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");
}
}
간단하게 문자를 숫자로, 숫자를 문자로 바꾸는 테스트를 작성했다.

너무 간단한 예제이므로 좀 다른 컨버터 예시를 보자.
사용자 정의 타입 컨버터
이번엔 127.0.0.1:8080과 같은 IP, PORT를 입력하면 IpPort 객체로 변환하는 컨버터를 만들어 보자.
hello.typeconverter.type.IpPort
1
2
3
4
5
6
7
8
9
10
11
@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()를 생성한다.
따라서 모든 필드의 값이 같다면 a.equals(b)의 결과가 참이 된다.
StringToIpPortConverter - 컨버터
hello.typeconverter.converter.StringToIpPortConverter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Slf4j
public class StringToIpPortConverter implements Converter<String, IpPort> {
@Override
public IpPort convert(String source) {
log.info("convert 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);
}
}
127.0.0.1:8080 문자를 넣으면 IpPort 객체를 만들어서 반환한다.
IpPortToStringConverter
hello.typeconverter.converter.IpPortToStringConverter
1
2
3
4
5
6
7
8
9
@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();
}
}
간단하게 IpPort 객체를 받고 String으로 반환하는 컨버터다.
이제 테스트 해보자.
ConverterTest - IpPort 컨버터 테스트 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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 convert = converter.convert(source);
assertThat(convert).isEqualTo(new IpPort("127.0.0.1", 8080)); // @EqualsAndHashCode 때문에 비교 가능
}

자 이렇게 테스트까지 해보았다.
정리
Converter인터페이스를 구현하여 타입을 바꾸는 클래스들을 구현해 봤다.
그런데 이렇게 타입 컨버터를 하나하나 직접 사용하면 개발자가 직접 컨버팅 하는 것과 차이가 없다.
타입 컨버터를 등록하고 관리하면서 편리하게 변환 기능을 제공하는 역할을 하는 무언가가 필요하다.
참고
스프링은 용도에 따라 다양한 방식의 타입 컨버터를 제공한다.Converter→ 기본 타입 컨버터ConverterFactory→ 전체 클래스 계층 구조가 필요할 때GenericConverter→ 정교한 구현, 대상 필드의 애노테이션 정보 사용 가능ConditionalGenericConverter→ 특정 조건이 참인 경우에만 실행
자세한 내용은 공식 문서를 참조하자.
참고
스프링은 문자, 숫자, 불린, Enum등 일반적인 타입에 대한 대부분의 컨버터를 기본으로 제공한다.
IDE에서Converter,ConverterFactory,GenericConverter의 구현체를 찾아보면 수 많은 컨버터를 확인할 수 있다.

댓글남기기