스프링은 컨버터 인터페이스를 제공해 준다.
되게 간단하다.
public class StringToIntegerConverter implements Converter<String, Integer> {
@Override
public Integer convert(String source) {
return Integer.valueOf(source);
}
}
Converter<source타입, 바꿀타입>
이렇게 해서, convert라는 메소드를 @override 하면 된다.
그 안에 작업해서 return 해 버리면 된다. 예를들어, String 타입으로 들어온 것을 우리가 만든 IpPort 객체로 Convert 한다고 하면,
@Getter
@EqualsAndHashCode
public class IpPort {
private String ip;
private int port;
public IpPort(String ip, int port) {
this.ip = ip;
this.port = port;
}
}
public class StringIpPortConverter implements Converter<String, IpPort> {
@Override
public IpPort convert(String source) {
StringToIntegerConverter converter = new StringToIntegerConverter();
String[] split = source.split(":");
String ip = split[0];
Integer portInt = converter.convert(split[1]);
IpPort ipPort = new IpPort(ip, portInt);
return ipPort;
}
}
그냥 이렇게 하면 된다.
참고로, 저기 들어오는 값은 "127.0.0.0:8080" 이런 식이라고 가정 했을 때다. 테스트 했을 때 잘 된다.
그리고, 진짜 컨버터는 엄청 많다. Spring에서 제공하는 컨버터 자체만 해도 2개가 나온다.
그 중
import org.springframework.core.convert.converter.Converter;
이걸 써야 한다.
참고로,
@Getter
@EqualsAndHashCode
public class IpPort {
private String ip;
private int port;
public IpPort(String ip, int port) {
this.ip = ip;
this.port = port;
}
}
저기 애노테이션으로 @EqualsAndHashCode 해놓으면, 생기는 기능들이 있는데, 그 중 하나는,
만약 IpPort("127.0.0.0", 8080)과 IpPort("127.0.0.0",8080) 이렇게 다른 객체를 비교했을 때, 멤버들의 값이 서로 같으면 true가 나오게끔 해주는 기능이다. equals 로 비교 했을 때.
일단 테스트의 Assertions.assertThat.isEqualTo()를 사용하기 용이하게 하기 위해 썼는데,
더 광범위할 듯? equals 관련해서 더 광범위할듯?
애매하면 쓰지 말고..
참고로 HttpMessageConverter는 이런 컨버터와 관계가 없다.
A -> B 이런 게 필요한 형태는 아주 다양하다.
HttpMessageConverter는 객체 <-> Json 이다.
이런 거는 Jackson 데이터 포맷터 이런 식으로 알아봐야 한다. 얘도 따로 제공해주는 포맷팅 방법이 있을거다.
'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글
78. 컨버전서비스 실제 사용 (0) | 2023.09.23 |
---|---|
77. 컨버전 서비스 (0) | 2023.09.23 |
75. 스프링의 자동 타입 변환 (0) | 2023.09.22 |
74. ControllerAdviece (0) | 2023.09.17 |
73. @ExceptionHandler API 예외 (0) | 2023.09.16 |