스프링/4. 스프링 MVC-2

82. 포맷터 웹 어플리케이션(스프링, 컨버전서비스)에 등록

sdafdq 2023. 9. 24. 01:32

간단하다.

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new IpPortToStringConverter());
        registry.addConverter(new StringIpPortConverter());

        registry.addFormatter(new MyNumberFormatter());
    }
}

이렇게 등록하면 된다.

참고로, 우선순위는 포맷터보다 컨버터가 먼저이다.

 

 

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    <li>${number}: <span th:text="${number}" ></span></li>
    <li>${{number}}: <span th:text="${{number}}" ></span></li>
    <li>${ipPort}: <span th:text="${ipPort}" ></span></li>
    <li>${{ipPort}}: <span th:text="${{ipPort}}" ></span></li>
</ul>
</body>
</html>

이걸 호출 해 보면,

 

@GetMapping("/converter-view")
public String converterView(Model model){
    model.addAttribute("number",10000);
    model.addAttribute("ipPort", new IpPort("127.0.0.0", 8080));
    return "converter-view";
}

 

  • ${number}: 10000
  • ${{number}}: 10,000
  • ${ipPort}: hello.typeconverter.type.IpPort@59cb0945
  • ${{ipPort}}: 127.0.0.0:8080

이렇게 보다 시피 중괄호 두개로 묶은 것은 컨버팅을 하겠다는 소리인데, 우리가 등록한 데로 컨버팅이 일어났다.

 

 

 

또한,

@GetMapping("/hello-v2")
public String helloV2(@RequestParam Integer data){
    System.out.println("data = " + data);
    return "ok";
}

@RequestParam으로 받는 저것은 Integer타입이고,

http://localhost:8080/hello-v2?data=10,000

이렇게 콤마까지 하여 값을 줘도 알아서 포맷팅 되어 제대로 10000으로 정상 작동 한다.

 

우리가 @Configuration에 제대로 컨버팅 정보와 포맷팅 정보를 등록했기 때문에, @RequestParam, @ModelAttribute 등등이 알아서 저 포맷팅 및 컨버팅을 할 지 말지 검사하는 것이다.