요새 매일 적어야겠다고 생각했지만 블로그를 많이 못적은거 같다ㅜ
그래서 이번주가 가기전에 미뤄뒀던 블로그 작성을 해보려고 한다!!
그 중 첫번째는 바로 TypeConverter와 Formatter에 관한 내용이다!
말 그대로 변환해주는 용도이다!
String을 int로 혹은 String을 우리가 만든 객체 등으로 변환!
차고로 url에 적히는 내용은 전부 String이 기본이다!
저 위에 Converter 인터페이스를 직접 구현해보려고 한다!
url에 있는 파라미터를 내가 만든 IpPort라는 객체로 변환하는 컨버터 구현해보자!
@Slf4j
public class StringToIpPortConverter implements Converter<String, IpPort> {
@Override
public IpPort convert (String source) {
log.info("convert source={}",source);
String [] split = source.split(":");
String ip = split[0];
Integer port = Integer.valueOf(split[1]);
return new IpPort(ip,port);
}
}
간단하게 String타입의 ip와 Integer타입의 port를 필드로 갖는 IpPort객체로 변환 해주었다!!
Spring에 우리가 만든 컨버터들을 등록해주면 편하게 불러서 사용가능하다!
차고로 Formatting도 가능한 구현체를 사용했다!
@Test
void formattingConversionServie(){
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
conversionService.addConverter(new StringToIpPortConverter());
// 사용법
IpPort = ipPort = conversionService.convert("127.0.0.1:8080", IpPort.class);
Assertions.assertThat(ipPort).isEqualTo(new IpPort("127.0.0.1", 8080));
}
테스트를 위한 방식이어서 웹에 적용하는 것과는 조금 다르긴 하다!
그래도 이런 방식으로 넣어지고 작동한다를 알아두자!
이건 처음에는 이해가 안 갔는데 단순히 "문자열" -> 정수가 아니라
1,000 ->1000 이나 12년10일 => 2012 - 10 처럼 원하는 형태로 포맷팅 시키는걸 의미한다!
@Slf4j
public class MyNumberFormatter implements Formatter<Number> {
@Override
public Number parse(String text, Locale locale) throws ParseException {
log.info("text={}",text);
NumberFormat format = NumberFormat.getInstance(locale);
// 현지에 맞게 숫자 표기법 바꾸기!
return format.parse(text);
}
@Override
public String print(Number object, Locale locale ) {
return NumberFormat.getInstance(locale).format(object);
}
}
@Configuration
public class WebConfig implements WebMvcConfiguer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToIpPortConverter());
registry.addFormatter(new MyNumberFormatter());
}
}
@RequestParam 이나 @PathVariable, @ModelAttribute의 경우 내부에 컨버터가 있기 때문에 기본 타입들은 전환이 무난하게 가능했던것이다!!
우리가 만든 객체로 변환도 가능하지만 더 복잡한 변환이 있을때 컨버터가 있다는걸 인지하고 사용하자!
포맷팅은 좀 더 이해하고 어디에서 많이 사용되는지 보고 예제를 연습해야할거같다!