Converter

 

HTTP 요청 파라미터는 모두 문자로 처리되어서 다른 타입으로 받고 싶은 경우 직접 변환을 해야 되는데 스프링은 용도에 따라 다양한 방식의 타입 컨버팅을 제공한다. 하지만 수많은 타입 컨버터를 하나하나 찾는 것은 너무 불편하기 때문에 스프링은 추가로 컨버터를 편리하게 사용할 수 있는 ConversionService를 제공한다.

 

ConversionService 인터페이스는 단순하게 canConvert(), convert()로 되어 있고 직접 만든 컨버터를 등록할 수도 있는데

WebMvcConfigurer가 제공하는 addFormatters()를 통해 직접 만든 컨버터를 등록하면 스프링이 내부에서 사용하는 ConversionService에 추가가 되는데 직접 등록한 컨버터의 경우 스프링 기본 컨버터들보다 높은 우선 순위를 가진다.

 

 

ConversionService 적용 예시

 

1) 스프링MVC가 제공하는 @RequestParam 의 경우 컨트롤러의 파라미터를 처리하는 ArgumentResolver인 RequestParamMethodArgumentResolver에서 ConversionService를 사용해서 타입을 변환한다.

 

2) 타임리프는 변수 표현식에 괄호를 하나 더 넣어서 ${{...}}를 사용하면 ConversionService를 적용해서 변환된 결과를 출력해주는데 th:field의 경우 자동으로 ConversionService를 적용해준다.

 

 

Formatter

 

Converter는 타입을 변환하는 범용 기능을 제공하는데 실제로는 단순 범용적인 변환보다 숫자 1000을 문자 "1,000"으로 쉼표를 넣어 출력하거나 날짜 객체를 "22-06-17" 같이 출력하는 등의 처리를 해야 되는 경우가 많다. 이렇게 객체를 특정 문자 포멧에 맞추어 출력하는데 특화된 기능을 하는 것이 Formatter이다. (문자 변환에 특화)

 

하지만 Formatter도 크게 보면 객체를 문자로, 문자를 객체로 변환하는 정교한 컨버터일 뿐인데 포맷터를 지원하는 CovnersionService를 사용하면 포맷터도 컨버전 서비스에 추가할 수 있다.

 

스프링 부트는 포맷터를 추가할 수 있는 DefaultFormattingConversionService 를 상속 받은 WebConversionService를 내부적으로 사용한다. (Web)

 

스프링은 자바에서 기본으로 제공하는 타입들에 대해 수많은 포맷터를 기본으로 제공하는데 포맷터는 기본 형식이 지정되어 있기 때문에 객체의 각 필드마다 다른 형식으로 포맷을 지정하기가 어려워서 애노테이션 기반의 매우 유용한 포맷터 2개를 기본으로 제공한다.

 

  • @NumberFormat(pattern = "###,###") : 숫자 관련 형식 지정 포맷터 사용
  • @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") : 날짜 관련 형식 지정 포맷터 사용

 

주의)

메시지 컨버터(HttpMessageConverter)에는 컨버전 서비스가 적용되지 않는데 특히 객체를 JSON으로 변환할 때 쓰이는 메시지 컨버터는 내부에서 Jackson 같은 라이브러리를 사용하는데 이때 객체를 JSON으로 변환하는 것은 이 라이브러리에 달린 것이기 때문에 JSON 결과로 만들어지는 숫자나 날짜 포맷을 변경하고 싶은 경우 Jackson 라이브러리가 제공하는 설정에 따라 포맷을 지정해야 한다.

 

컨버전 서비스는 @RequestParam, @ModelAttribute, @PathVariable, 뷰 템플릿 등에서 사용 가능

 

+ Recent posts