Hyeok의 웹 개발 블로그

<2025.04.17> Formatter 본문

TIL/Spring

<2025.04.17> Formatter

Yhyeok 2025. 4. 17. 22:45

🔎Formatter

- 주로 사용자 지정 포맷을 적용해 데이터 변환을 처리할 때 사용

- Formatter는 ConversionService와 비슷한 목적을 가지지만 문자열을 객체로 변환하거나 객체를 문자열로 
 변환하는 과정에서 포맷팅을 세밀하게 제어할 수 있다.


  • Formatter Interface
    • Printer, Parser 상속
    • 객체를 문자로 변환하고 문자를 객체로 변환하는 두가지 기능을 모두 가지고 있다.
    • Printer
      • Object를 String으로 변환한다.
    • Parser
      • String을 Object로 변환한다.
        • Formatter Interface
          • Printer, Parser 상속
          • 객체를 문자로 변환하고 문자를 객체로 변환하는 두가지 기능을 모두 가지고 있다.
          • Printer
            • Object를 String으로 변환한다.
          • Parser
            • String을 Object로 변환한다.
              • Formatter Interface
                • Printer, Parser 상속
                • 객체를 문자로 변환하고 문자를 객체로 변환하는 두가지 기능을 모두 가지고 있다.
                • Printer
                  • Object를 String으로 변환한다.
                • Parser
                  • String을 Object로 변환한다.

 

💡 FormattingConversionService

 - ConversionService 와 Formatter를 결합한 구현체로 타입 변환과 포맷팅이 필요한 모든 작업을 한 곳에서
 수행할 수 있도록 설계되어 있어서 다양한 타입의 변환과 포맷팅을 쉽게 적용 가능.

 

  • FormattingConversionService
    • Formatter를 지원하는 ConversionService
      • 어댑터 패턴을 사용하여 Formatter가 Converter처럼 동작하도록 만들어준다.
  • DefaultFormattingConversionService
    • FormattingConversionService + 통화, 숫자관련 Formatter를 추가한것
  • SpringBoot의 기능
    • SpringBoot는 기본적으로 WebConversionService를 사용한다.
    • DefaultFormattingConversionService 상속
              •  

 

📌 Spring이 제공하는 Formatter

 - Spring은 어노테이션 기반으로 원하는 형식의 Formatter를 사용할 수 있도록 기능을 제공

 - 기본 제공 Formatter는 기본형식이 정해져있어서 필드마다 다른 형식으로 지정하기 어렵다.

 

  • Annotation
    • DTO 필드들에 적용 가능
    1. @NumberFormat
      • 숫자 관련 지정 Formatter 사용
      • NumberFormatAnnotationFormatterFactory
    2. @DateTimeFormat
      • 날짜 관련 지정 Formatter 사용
      • Jsr310DateTimeFormatAnnotationFormatterFactory
    3. Json
      • @NumberFormat과 @DateTimeFormat은 폼 데이터와 URL 파라미터를 처리하는 ConversionService와 관련이 있다.
      • Jackson의 직렬화/역직렬화 과정에는 기본적으로 영향을 미치지 않는다.
      • @JsonFormat 나 커스텀 Deserializer를 사용하는 방식이 필요하다.
       
    4. Deserializer
      - 정상적으로 변환 후 출력된다.
    5. @JsonFormat
      • @JsonFormat은 날짜 형식이나 숫자 포맷을 지정할 수 있다.
      • 콤마를 포함한 숫자는 Jackson이 자동으로 변환하지 않으므로 커스텀 처리가 필요하다.
      • 커스텀 데이터의 변환이 필요한 경우 Deserialize 사용