스프링/MVC

[MVC 기초]Spring Formatter Date, Number 원하는 포맷으로 변환하기

nomoreFt 2022. 7. 26. 17:30

Formatter란?

Formatter는 객체를 특정 형식의 문자로, 특정 형식의 문자를 객체로 변환해주는 객체를 의미한다.

스프링은 기본적으로 특정 객체를 정해진 양식으로 변환해주는 기능을 지원해준다.


숫자, 날짜 변환

@Data
static class Form {
@NumberFormat(pattern = "###,###")
private Integer number;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTime;
}
  • @NumberFormat(pattern = "###,###" : 숫자를 지정된 pattern으로 변환
  • @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") : 날짜를 지정한 pattern으로 변환한다.

Custom Formatter 만들어 ConversionService 등록

Formatter 인터페이스를 구현하여 Formatter를 생성한다.

public interface Printer<T> {
String print(T object, Locale locale);
}
public interface Parser<T> {
T parse(String text, Locale locale) throws ParseException;
}
public interface Formatter<T> extends Printer<T>, Parser<T> {
}
  • print : Object -> String 변환
  • parse : String -> Object 변환

기본적인 숫자 변환 포매터를 구현해보자 (기본 제공기능이긴 함)

@Slf4j
public class MyNumberFormatter implements Formatter<Number> {
 @Override
 public Number parse(String text, Locale locale) throws ParseException {
 log.info("text={}, locale={}", text, locale);
 NumberFormat format = NumberFormat.getInstance(locale);
 return format.parse(text);
 }
 @Override
 public String print(Number object, Locale locale) {
 log.info("object={}, locale={}", object, locale);
 return NumberFormat.getInstance(locale).format(object);
 }
}
  • implements Formatter {` : Formatter를 구현
  • NumberFormat.getInstance(locale) : 지역을 받아 Number에 콤마붙여주는 기능을 이미 구현한 구현체이다. 편의를 위해 사용

ConversionService에 등록

@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());
 //추가
 registry.addFormatter(new MyNumberFormatter());
 }
}

Converter와 같이 관리되어 등록된다.

View에서 Formatting 쓰기

위에서 Formatting을 선언한 객체의 변수들을 담아 View에 넘기면,

@PostMapping("/formatter/edit")
 public String formatterEdit(@ModelAttribute Form form) {
 return "formatter-view";
 }

Converting과 마찬가지로 ${{...}} 으로 변환하면 지정된 포매팅으로 값이 나온다.

<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>
  • ${form.number} : 10000 (포매팅이 안된 날 것 값 그대로)
  • ${{form.number}} : 10,000
  • ${form.localDateTime} : 2021-01-01T00:00:00
  • ${{form.localDateTime}} : 2021-01-01 00:00:00

주의사항

💥 ConversionService로 Formatting을 사용하여 적용하는 것은
@RequestParam, @ModelAttribute, @PathVariable, thymeleaf 등 뷰 템플릿 에서 사용할 수 있다.
JSON 변환시에 컨버팅은 해당 변환 라이브러리 (ex JACKSON) 에 달려있다.