반응형

정리(스프링 타입 컨버터)


컨버터를 사용하든, 포맷터를 사용하든 등록 방법은 다르지만, 사용할 때는 컨버전 서비스를 통해서 일관성 있게 사용할 수 있다.

주의!
메시지 컨버터(HttpMessageConverter)에는 컨버전 서비스가 적용되지 않는다.
특히 객체를 JSON으로 변환할 때 메시지 컨버터를 사용하면서 이 부분을 많이 오해하는데,
HttpMessageConverter의 역할은 HTTP 메시지 바디의 내용을 객체로 변환하거나 객체를 HTTP 메시지 바디에 입력하는 것이다.
예를 들어서 JSON을 객체로 변환하는 메시지 컨버터는 내부에서 Jackson 같은 라이브러리를 사용한다.
객체를 JSON으로 변환한다면 그 결과는 이 라이브러리에 달린 것이다. 
따라서 JSON 결과로 만들어지는 숫자나 날짜 포맷을 변경하고 싶으면 해당 라이브러리가 제공하는 설정을 통해서 포맷을 지정해야 한다. 
결과적으로 이것은 컨버전 서비스와 전혀 관계가 없다.

컨버전 서비스는 @RequestParam, @ModelAttribute, @PathVariable, 뷰 템플릿 등에서 사용할 수 있다.

 

  • 프로젝트 생성
  • 스프링 타입 컨버터 소개
    • 원래대로라면 reuquest.getParameter를 하면 문자타입인데, 이것을 숫자로 바꾸려면 Integer.valueOf()를 직접 해줘야했었다.
    • 그런데, 스프링은 @RuquestParam에 Integer로 바로 바꿔주는 기능을 제공한다. 이것은 중간에 스프링이 컨버전서비스를 사용해서 제공하는 것이다.
    • @RequestParam뿐만 아니라, @ModelAttribute, @PathVariable에도 적용이 된다
  • 타입 컨버터 - Converter
    • 컨버터 인터페이스를 이용해서 구현하면, 우리가 변환하고자 하는 타입으로 변환할 수 있다.
    • 그런데, 사용방식이 조금 불편했다.
  • 컨버전 서비스 - ConversionService
    • 그래서 컨버전 서비스가 나오게 되었다.
    • 타입 컨버터를 하나하나 직접 찾아서 타입 변환에 사용하는 것은 매우 불편하다. 그래서 스프링은 개별 컨버터를 모아두고 그것들을 묶어서 편리하게 사용할 수 있는 기능인 컨버전 서비스를 제공한다.
    • DefaultConversionServiceConversionService 인터페이스를 구현했는데, 추가로 컨버터를 등록하는 기능도 제공한다.
    • 컨버터를 등록할 때는 "StringToIntegerConverter"같은 타입 컨버터를 명확하게 알아야 한다. 반면에 컨버터를 사용하는 입장에서는 타입 컨버터를 전혀 몰라도 된다. 타입 컨버터들은 모두 컨버전 서비스 내부에 숨어서 제공된다. 따라서 타입 변환을원하는 사용자는 컨버전 서비스 인터페이스에만 의존하면 된다. 물론 컨버전 서비스를 등록하는 부분과 사용하는 부분을 분리하고 의존관계 주입을 사용해야 한다. 
  • 스프링에 Converter 적용하기
    • WebMbcConfigurer에다가 addFormatters로 컨버터를 등록해주면 된다.
    • 그러면 스프링은 내부에서 사용하는 ConversionService에 컨버터를 추가해준다.
  • 뷰 템플릿에 컨버터 적용하기
    • {}는 적용X, {{}}는 적용O,
    • th:field는 컨버전 서비스 자동적용
  • 포맷터 - Formatter
    • 실제 웹 애플리케이션에서는 객체를 문자로, 문자를 객체로 변환하는 경우가 많다.  그래서 컨버터의 조금 특별한 버전인 Formatter가 등장한다.
    • Converter는 범용(객체 ->객체), Formatter는 문자에 특화(객체->문자, 문자->객체) + 현지화(Locale)
    • String print(T object, Locale locale) : 객체를 문자로 변경한다.
    • T parse(String text, Locale locale) : 문자를 객체로 변경한다.
  • 포맷터를 지원하는 컨버전 서비스
    • FormattingConversionService는 포맷터를 지원하는 컨버전 서비스이다.
    • 스프링 부트는 DefaultFormattingConversionService를 상속받은 WebConversionSevice를 내부에서 사용한다.
  • 포맷터 적용하기
  • 스프링이 제공하는 기본 포맷터
    • @NumberFormat : 숫자 관련 형식 지정 포맷터 사용 
    • @DateTimeFormat : 날짜 관련 형식 지정 포맷터 사용
  • 정리

 

 

반응형