Type Conversion

2024. 10. 14. 21:11Spring Framework/Web on Servlet Stack

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()는 비표준 타입 간의 변환을 처리하는 커스텀 컨버를 등록하는 데 사용됩니다 (예: StringEnum으로 변환).

Formatter vs. Converter:

  • Formatter : 주로 문자열 값(폼이나 요청에서의)을 Java 객체로 변환하거나 그 반대로 변환하는 데 사용됩니다. 로케일 인식이 가능합니다.
  • Converter : 두 가지 임의의 타입 간의 일반적인 타입 변환을 처리합니다 (예: StringEnum으로, IntegerBoolean으로 변환).

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에 설정된 포매터를 등록하여 애플리케이션 전반에 적용되도록 합니다.

FormatterRegistrarFormattingConversionServiceFactoryBean을 사용한 고급 커스터마이징

  • FormatterRegistrar: 여러 포매터와 컨버터를 한 번에 등록하기 위한 SPI (Service Provider Interface)입니다. 자체 FormatterRegistrar를 작성하여 중앙에서 포매터를 등록할 수 있습니다.
  • FormattingConversionServiceFactoryBean: 이 팩토리 빈은 모든 포매터와 컨버터를 관리하는 FormattingConversionService를 생성하는 데 사용됩니다. 기본 동작과 다른 포매팅 서비스를 사용하고 싶을 때 유용합니다.

반응형 스택(Spring WebFlux)에서의 타입 변환

Spring WebFlux에서 FormatterRegistryWebMvcConfigurer의 동등한 기능은 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 : WebMvcConfigureraddFormatters() 메서드를 오버라이드하여 커스텀 포매터와 컨버터를 등록할 수 있습니다.
  • 날짜 및 시간 형식화: HTML5 날짜 및 시간 필드를 위한 포맷을 ISO 포맷으로 설정하려면 DateTimeFormatterRegistrar를 사용하여 맞춤 설정할 수 있습니다.
  • 반응형 스택: Spring WebFlux에서도 유사한 방식으로 WebFluxConfigurer를 사용해 포매터와 컨버터를 등록할 수 있지만, 논블로킹, 비동기 환경에서 작동합니다.

Spring MVC나 WebFlux에서 포매터와 컨버터를 커스터마이즈함으로써 애플리케이션이 입력 및 출력 변환을 특정 요구 사항에 맞게 처리할 수 있도록 설정할 수 있습니다.

'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글

Interceptors  (1) 2024.10.14
Validation  (0) 2024.10.14
MVC Config API  (0) 2024.10.14
Enable MVC Configuration  (0) 2024.10.14
MVC Config  (0) 2024.10.14