728x90
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToIntegerConverter());
registry.addConverter(new IntegerToStringConverter());
registry.addConverter(new StringToIpPortConverter());
registry.addConverter(new IpPortToStringConverter());
}
}
- 스프링은 내부에서 ConversionService를 제공한다.
- 우리는 WebMvcConfigurer 가 제공하는 addFormatters()를 사용해서 추가하고 싶은 컨버터를 등록하면 된다.
- 이렇게 하면 스프링은 내부에서 사용하는 ConversionService 에 컨버터를 추가해준다
Test
@GetMapping("/hello-v2")
public String helloV2(@RequestParam Integer data){
System.out.println("data = " + data);
return "ok";
}
- String data를 Integer로 변환해 주어야하는데 이때, 우리가 작성한 StringToIntegerConverter가 동작하는 로그를 확인할 수 있다.
- 그런데 생각해보면 StringToIntegerConverter 를 등록하기 전에도 이 코드는 잘 수행되었다.
- 그것은 스프링이 내부에서 수 많은 기본 컨버터들을 제공하기 때문이다.
- 컨버터를 추가하면 추가한 컨버터가 기본 컨버터보다 높은 우선순위를 가진다.
Test 2
@GetMapping("/ip-port")
public String ipPort(@RequestParam IpPort ipPort){
System.out.println("ipPort IP = " + ipPort.getIp());
System.out.println("ipPort PORT = " + ipPort.getPort());
return "ok";
}
- 해당 컨버터는 Spring이 제공해 줄 수 없는 것이다.
- 우리가 작성한 StringToIpPortConverter 가 작동하게 되고, 정상적으로 동작하는 것을 확인할 수 있다.
처리 과정
- @RequestParam 은 @RequestParam을 처리하는 ArgumentResolver 인 RequestParamMethodArgumentResolver 에서 ConversionService를 사용해서 타입을 변환한다.
- 부모 클래스와 다양한 외부 클래스를 호출하는 등 복잡한 내부 과정을 거치기 때문에 대략 이렇게 처리되는 것으로 이해해도 충분하다
728x90
'스프링 MVC 2편(백엔드 웹 개발 활용 기술)' 카테고리의 다른 글
| Ch10. 스프링 타입 컨버터 소개 - 포맷터(Formatter) (0) | 2022.03.22 |
|---|---|
| Ch10. 스프링 타입 컨버터 소개 - 뷰 템플릿에 컨버터 적용하기 (0) | 2022.03.22 |
| Ch10. 스프링 타입 컨버터 소개 - 컨버전 서비스(ConversionService) (0) | 2022.03.22 |
| Ch10. 스프링 타입 컨버터 소개 - 스프링 타입 컨버터 (0) | 2022.03.22 |
| Ch09. API 예외 처리 - @ControllerAdvice (0) | 2022.03.21 |