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) 에 달려있다.