https://sundaland.tistory.com/366
[ ▶ Type Conversion ]
Spring MVC는 다양한 숫자 및 날짜 타입에 대한 기본적인 formatting 지원을 제공한다. 또한 @NumberFormat 및 @DateTimeFormat 애노테이션을 사용하여 필드의 포맷을 커스터마이즈할 수 있다. 이러한 타입 변환 시스템은 폼, JSON 응답, 기타 요청/응답 데이터에서 객체와 문자열 간의 변환을 쉽게 만들어준다. 여기서는 Spring MVC에서 이 기능이 어떻게 작동하는지, 커스텀 컨버터와 포매터를 등록하는 방법, 그리고 반응형 스택(Spring WebFlux)에서의 동등한 기능에 대해 설명한다.
[ ▷ Spring MVC의 디퐅트 타입 변환 ]
Spring MVC는 기본적으로 다양한 숫자 및 날짜 타입을 처리하기 위한 포매터를 설치한다. 이 포매터는 HTML 폼에서 사용되는 문자열 표현과 Java 타입(예: java.util.Date, java.time.LocalDate 등) 간의 변환을 담당한다.
- Number Formatting: Spring은 로케일에 따라 숫자를 자동으로 파싱한다. (미국에서는 "1,000.00", 유럽에서는 "1.000,00")
- Date Formatting: 날짜는 로케일에 따라 포매팅됩니다. (미국에서는 "MM/dd/yyyy", 유럽에서는 "dd/MM/yyyy")
필드에 @NumberFormat 또는 @DateTimeFormat 애노테이션을 사용하여 특정 필드가 어떻게 포맷팅될지 지정할 수 있다.
public class MyForm {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate date;
@NumberFormat(style = NumberFormat.Style.CURRENCY)
private BigDecimal price;
}
- @DateTimeFormat(pattern = "yyyy-MM-dd")는 Spring에게 폼에 표시할 때 date 필드를 "2024-10-14" 포맷으로 표시하도록 한다.
- @NumberFormat(style = NumberFormat.Style.CURRENCY)는 price 필드를 통화 포맷으로 표시하도록 한다. ( "$1,000.00")
[ ▷ Spring MVC에서 커스텀 Formatters와 Converters 등록 ]
때때로 비표준 데이터 타입이나 포맷을 처리하기 위해 커스텀 포매터와 컨버터를 등록해야 할 때가 있다. 이를 위해 FormatterRegistry를 사용다. WebMvcConfigurer 인터페이스를 구현하고 addFormatters 메서드를 오버라이드하여 커스텀 포매터나 컨버터를 등록할 수 있다.
▼ Spring MVC에서 커스텀 포매터를 등록하는 방법
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// 커스텀 포매터 등록
registry.addFormatter(new MyCustomFormatter());
registry.addConverter(new MyCustomConverter());
}
}
- FormatterRegistry는 포매터와 컨버터를 등록하는 데 사용된다.
- addFormatter()는 문자열과 커스텀 Date 포맷 간의 변환과 같은 작업을 수행하는 커스텀 Formatter를 추가한다.
- addConverter()는 비표준 타입 간의 변환을 처리하는 커스텀 컨버를 등록하는 데 사용된다. (String을 Enum으로 변환)
[ ▷ Formatter vs. Converter ]
- Formatter: 주로 문자열 값(폼이나 요청에서의)을 Java 객체로 변환하거나 그 반대로 변환하는 데 사용됩니다. 로케일 인식이 가능합니다.
- Converter: 두 가지 임의의 타입 간의 일반적인 타입 변환을 처리합니다. (String을 Enum으로, Integer를 Boolean으로 변환)
[ ▷ HTML 폼을 위한 날짜 및 시간 포매팅 ]
Spring MVC는 기본적으로 날짜 값을 파싱하고 포매팅할 때 Locale을 고려한다. 문자열 필드로 표현된 폼에서는 (<input type="text" />) Spring이 로케일에 맞는 DateTimeFormat을 사용하여 날짜 값을 파싱한다.
그러나 HTML5의 <input type="date" /> 또는 <input type="time" /> 필드를 사용하는 경우, 브라우저는 HTML 명세서에 정의된 고정된 ISO 8601 형식을 사용한다 (날짜의 경우 yyyy-MM-dd 형식). 이러한 경우, Spring이 이 형식을 사용하도록 명시적으로 설정해야 한다.
▼ 설정 방법
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(true); // 날짜 및 시간 필드를 위한 ISO 형식 사용 설정
registrar.registerFormatters(registry); // 포매터 등록
}
}
- DateTimeFormatterRegistrar: 이 클래스는 DateTimeFormatter 인스턴스를 설정하는 데 사용됩니다. DateTimeFormatter는 날짜 및 시간 필드를 포매팅하는 역할을 합니다.
- setUseIsoFormat(true): 이 메서드는 Spring이 ISO 8601 날짜 및 시간 포맷을 사용하도록 강제합니다. 이는 HTML5 <input type="date" /> 및 <input type="time" /> 필드에서 기대하는 포맷과 일치합니다 (예: 날짜는 yyyy-MM-dd 형식).
- registerFormatters(registry): FormatterRegistry에 설정된 포매터를 등록하여 애플리케이션 전반에 적용되도록 합니다.
[ ▷ FormatterRegistrar와 FormattingConversionServiceFactoryBean을 사용한 고급 커스터마이징 ]
- FormatterRegistrar: 여러 포매터와 컨버터를 한 번에 등록하기 위한 SPI (Service Provider Interface)입니다. 자체 FormatterRegistrar를 작성하여 중앙에서 포매터를 등록할 수 있다.
- FormattingConversionServiceFactoryBean: 이 팩토리 빈은 모든 포매터와 컨버터를 관리하는 FormattingConversionService를 생성하는 데 사용된다. 기본 동작과 다른 포매팅 서비스를 사용하고 싶을 때 유용하다.
[ ▷ 반응형 스택(Spring WebFlux)에서의 타입 변환 ]
Spring WebFlux에서 FormatterRegistry와 WebMvcConfigurer의 동등한 기능은 WebFluxConfigurer를 통해 제공된다. 목적은 유사하지만, 내부 메커니즘은 논블로킹 비동기 환경에 맞게 조정되었다.
▼ Spring WebFlux 애플리케이션에서 타입 변환을 커스터마이즈하는 방법
@Configuration
@EnableWebFlux
public class WebFluxConfig implements WebFluxConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// WebFlux를 위한 커스텀 포매터와 변환기 등록
registry.addFormatter(new MyReactiveFormatter());
registry.addConverter(new MyReactiveConverter());
}
}
컨셉과 메서드는 Spring MVC에서와 유사하지만, WebFlux는 논블로킹 방식을 사용한다. 포매터와 컨버는 Spring MVC에서처럼 커스터마이즈할 수 있지만, 반응형 환경에서는 비동기 처리가 가능하고 더 많은 동시 요청을 처리할 수 있다.
[ ▷ 요약 ]
- Default Formatters: Spring MVC는 숫자와 날짜에 대한 로케일 인식 기본 포매터를 제공한다.
- Custom Formatters: WebMvcConfigurer의 addFormatters() 메서드를 오버라이드하여 커스텀 포매터와 컨버터를 등록할 수 있다
- 날짜 및 시간 형식화: HTML5 날짜 및 시간 필드를 위한 포맷을 ISO 포맷으로 설정하려면 DateTimeFormatterRegistrar를 사용하여 맞춤 설정할 수 있다.
- 반응형 스택: Spring WebFlux에서도 유사한 방식으로 WebFluxConfigurer를 사용해 포매터와 컨버터를 등록할 수 있지만, 논블로킹, 비동기 환경에서 작동한다.
Spring MVC나 WebFlux에서 포매터와 컨버터를 커스터마이즈함으로써 애플리케이션이 입력 및 출력 변환을 특정 요구 사항에 맞게 처리할 수 있도록 설정할 수 있다.
'Web on Servlet Stack' 카테고리의 다른 글
Content Types (1) | 2024.10.15 |
---|---|
Validation (0) | 2024.10.15 |
Interceptors (0) | 2024.10.15 |
MVC Config API (0) | 2024.10.15 |
Enable MVC Configuration (0) | 2024.10.15 |