Formatter
주로 사용자 지정 포맷을 적용해 데이터 변환을 처리할 때 사용된다.
Formatter는 ConversionService와 비슷한 목적을 가지지만 문자열을 객체로 변환하거나 객체를 문자열로 변환하는 과정에서 포맷팅을 세밀하게 제어할 수 있다.
객체를 특정한 포맷에 맞춰서 문자로 출력하는 기능에 특화된 것이 Formatter이다.
- Converter 보다 조금 더 세부적인 기능이라고 생각하면 된다.
공식문서
Locale
지역 및 언어 정보를 나타내는 객체.
- 언어 코드 en, ko
- 국가 코드 US, KR
특정 지역 및 언어에 대한 정보를 제공하여 국제화 및 지역화 기능을 지원한다.
Formatter Interface
Printer와 Parser를 상속받는다.
객체를 문자로 변환하고 문자를 객체로 변환하는 두 가지 기능을 모두 가지고 있다.
Printer
Object를 String으로 변환한다.
Parser
String을 Object로 변환한다.
FormattingConversionService
ConversinService와 Formatter를 결합한 구현체로 타입 변환과 포맷팅이 필요한 모든 작업을 한 곳에 수행할 수 있도록 설계되어 있어서 다양한 타입의 변환과 포맷팅을 쉽게 적용할 수 있다.
FormattingConversionService
Formatter를 지원하는 ConversionService이다.
어댑터 패턴을 사용하여 Formatter가 Converter처럼 동작하도록 만들어준다.
DefaultFormattingConversionService
FormattingConversionService + 통화, 숫자 관련 Formatter를 추가한 것
테스트
public class FormattingConversionServiceTest {
@Test
void formattingConversionService() {
// given
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
// Converter 등록
conversionService.addConverter(new StringToPersonConverter());
conversionService.addConverter(new PersonToStringConverter());
// Formatter 등록
conversionService.addFormatter(new PriceFormatter());
// when
String result = conversionService.convert(10000, String.class);
// then
Assertions.assertThat(result).isEqualTo("10,000");
}
}
ConversionService가 제공하는 convert( )를 사용하면 된다.
SpringBoot의 기능
SpringBoot는 기본적으로 WebConversionService를 사용한다.
- DefaultFormattingConversionService 상속
Spring이 제공하는 Formatter
Spring은 어노테이션 기반으로 원하는 형식의 Formatter를 사용할 수 있도록 기능을 제공한다.
💡참고
Spring은 Java에서 기본적으로 제공하는 타입들에 대해 기본적으로 Formatter 들을 제공한다.
하지만 기본 제공 Formatter 는 기본 형식이 정해져 있어서 필드마다 다른 형식으로 지정하기 어렵다.
Annoation
DTO 필드들에 적용 가능
@NumberFormat
- 숫자 관련 지정 Formatter 사용
- NumberFormatAnnotaionFormmatterFactory 사용
@DateTimeFormat
- 날짜 관려 지정 Formmat 사용
- Jsr310DateTimeFormatAnnotationFormatterFactory 사용
'스프링 프레임워크' 카테고리의 다른 글
ConversionService (0) | 2024.11.27 |
---|---|
TypeConverter (0) | 2024.11.27 |
WebMvcConfigure (0) | 2024.11.27 |
ArgumentResolver (1) | 2024.11.27 |
HttpMessageConverter (0) | 2024.11.27 |