파일 업로드

이신성·2023년 11월 10일

스프링에 Converter 적용하기

WebConfig - 컨버터 등록

@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());
	} 
} 

뷰 템플릿에 컨버터 적용하기

ConverterController

@Controller
  public class ConverterController {
      @GetMapping("/converter-view")
      public String converterView(Model model) {
          model.addAttribute("number", 10000);
          model.addAttribute("ipPort", new IpPort("127.0.0.1", 8080));
          return "converter-view";
	} 
} 
  • Model에 숫자 10000와 ipPort 객체를 담아서 뷰 템플릿에 전달한다.

converter-view.html

<!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> 
  • 타임리프는 &{{…}}를 사용하면 자동으로 컨버전 서비스를 사용해서 변환된 결과를 출력해준다.

ConverterController

@Controller
 public class ConverterController {
     @GetMapping("/converter-view")
     public String converterView(Model model) {
         model.addAttribute("number", 10000);
         model.addAttribute("ipPort", new IpPort("127.0.0.1", 8080));
         return "converter-view";
     }
     @GetMapping("/converter/edit")
     public String converterForm(Model model) {
         IpPort ipPort = new IpPort("127.0.0.1", 8080);
         Form form = new Form(ipPort);
         model.addAttribute("form", form);
         return "converter-form";
     }
     @PostMapping("/converter/edit")
     public String converterEdit(@ModelAttribute Form form, Model model) {
         IpPort ipPort = form.getIpPort();
         model.addAttribute("ipPort", ipPort);
         return "converter-view";
} 
     @Data
     static class Form {
         private IpPort ipPort;
         public Form(IpPort ipPort) {
             this.ipPort = ipPort;
		} 
	} 
} 

converter-form.html

<!DOCTYPE html>
  <html xmlns:th="http://www.thymeleaf.org">
  <head>
      <meta charset="UTF-8">
      <title>Title</title>
  </head>
<body> 
<form th:object="${form}" th:method="post">
th:field <input type="text" th:field="*{ipPort}"><br/>
th:value <input type="text" th:value="*{ipPort}">(보여주기 용도)<br/> <input type="submit"/> 
</form> 
  </body>
  </html>
  • 타임리프의 th:field는 앞서 설명했듯이 id, name를 출력하는 등 다양한 기능이 있는데, 여기에 컨버전 서비스도 함께 적용된다.

GET / converter/edit

  • th:field가 자동으로 컨버전 서비스를 적용해주어서 ${{ipPort}}처럼 적용이 되었다. 따라서 IpPort -> String으로 변환된다.

POST / converter/edit

  • @ModelAttribute를 사용해서 String -> IpPort로 변환된다.

스프링이 제공하는 기본 포멧터

  • @NumberFormat: 숫자 관련 형식 지정 포멧터 사용
  • @DateTimeFormat: 날짜 관련 형식 지정 포멧터 사용

FormatterController

@Controller
 public class FormatterController {
     @GetMapping("/formatter/edit")
     public String formatterForm(Model model) {
Form form = new Form();
         form.setNumber(10000);
         form.setLocalDateTime(LocalDateTime.now());
         model.addAttribute("form", form);
         return "formatter-form";
     }
     @PostMapping("/formatter/edit")
     public String formatterEdit(@ModelAttribute Form form) {
         return "formatter-view";
     }
     @Data
     static class Form {
         @NumberFormat(pattern = "###,###")
         private Integer number;
         @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
         private LocalDateTime localDateTime;
     }
} 

formatter-form.html

<!DOCTYPE html>
  <html xmlns:th="http://www.thymeleaf.org">
  <head>
      <meta charset="UTF-8">
      <title>Title</title>
  </head>
<body> 
  <form th:object="${form}" th:method="post">
      number <input type="text" th:field="*{number}"><br/>
      localDateTime <input type="text" th:field="*{localDateTime}"><br/>
 	<input type="submit"/>
  </form>

  </body>
  </html>

formatter-view.html

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

0개의 댓글