Message Converters

2024. 10. 15. 04:40Spring Framework/Web on Servlet Stack

Spring MVC의 메시지 컨버터(Message Converters)

Spring MVC는 메시지 컨버터(HttpMessageConverter)를 사용하여 HTTP 요청과 응답을 Java 객체로 변환하거나, Java 객체를 HTTP 요청과 응답으로 변환합니다. 이 기능을 통해 Spring MVC는 REST API와 상호작용할 때 JSON, XML, HTML 등 다양한 콘텐츠 타입을 자동으로 처리할 수 있습니다.

메시지 컨버터는 Java 객체를 HTTP 응답 본문으로 직렬화하거나(예: Java 객체를 JSON으로 변환), HTTP 요청 본문을 Java 객체로 역직렬화(예: JSON 데이터를 Java 객체로 변환)하는 역할을 합니다.

메시지 컨버터 커스터마이징

Spring MVC에서는 WebMvcConfigurer의 두 가지 메서드를 오버라이드하여 기본 메시지 컨버터를 커스터마이징하거나 교체할 수 있습니다:

  • configureMessageConverters(): 디폴트 컨버터를 모두 교체하고, 새로운 컨버터를 설정할 수 있습니다.
  • extendMessageConverters(): 디폴트 컨버터를 유지하면서, 커스터마이징하거나 추가할 수 있습니다.

예시: 메시지 컨버터 커스터마이징

다음 예시는 JSON 처리에 Jackson을 사용하고, XML 처리를 위한 Jackson 컨버터를 추가하는 설정을 보여줍니다. 이 설정에서는 Jackson2ObjectMapperBuilder를 사용하여 Jackson의 직렬화/역직렬화 동작을 커스터마이징합니다.

@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
            .indentOutput(true)  // 인덴트 활성화 (읽기 쉽게 출력)
            .dateFormat(new SimpleDateFormat("yyyy-MM-dd"))  // 사용자 정의 날짜 형식
            .modulesToInstall(new ParameterNamesModule());  // Java 8의 파라미터 이름 모듈 추가

        // JSON 메시지 컨버터 추가
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));

        // XML 메시지 컨버터 추가
        converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));
    }
}

주요 구성 요소 설명:

  1. Jackson2ObjectMapperBuilder: Spring에서 제공하는 빌더로, Jackson의 ObjectMapper를 쉽게 커스터마이징할 수 있습니다. ObjectMapper는 Java 객체를 JSON이나 XML로 변환하거나 그 반대로 변환하는 역할을 합니다.
    • indentOutput(true): JSON을 읽기 쉽게 들여쓰기(Pretty-Printing)를 활성화합니다.
    • dateFormat(new SimpleDateFormat("yyyy-MM-dd")): 날짜 형식을 yyyy-MM-dd로 지정합니다.
    • modulesToInstall(new ParameterNamesModule()): Java 8의 파라미터 이름을 지원하도록 모듈을 추가합니다. 이를 통해 Jackson이 생성자 파라미터를 더 지능적으로 매핑할 수 있습니다.
  2. MappingJackson2HttpMessageConverter: 이 메시지 컨버터는 Jackson을 사용하여 JSON 데이터를 직렬화하고 역직렬화합니다. converters 리스트에 추가하면, Java 객체를 JSON으로 변환하거나 그 반대로 변환할 때 사용됩니다.
  3. MappingJackson2XmlHttpMessageConverter: 이 컨버터는 Jackson을 사용하여 XML 데이터를 처리하며, createXmlMapper(true)를 호출하여 XML 전용 ObjectMapper를 생성합니다.

Jackson 모듈

Spring은 특정 Jackson 모듈이 클래스패스에 있을 경우 이를 자동으로 등록합니다. 이러한 모듈은 Jackson이 특정 데이터 구조나 Java 기능을 더 잘 처리할 수 있도록 돕습니다:

  1. jackson-datatype-joda: Joda-Time 타입을 처리할 수 있도록 지원합니다.
  2. jackson-datatype-jsr310: Java 8의 날짜 및 시간 API 타입(예: LocalDate, LocalDateTime 등)을 처리할 수 있도록 지원합니다.
  3. jackson-datatype-jdk8: Java 8의 Optional 등 다른 Java 8 타입을 지원합니다.
  4. jackson-module-kotlin: Kotlin 클래스와 데이터 클래스를 처리할 수 있도록 지원합니다.

이 모듈들은 Jackson이 클래스패스에서 감지하면 자동으로 등록되며, JSON이나 XML 처리 시 Java 또는 Kotlin 기능을 더 쉽게 사용할 수 있습니다.

기타 유용한 Jackson 모듈

애플리케이션의 요구 사항에 따라 다음과 같은 유용한 Jackson 모듈도 사용할 수 있습니다:

  • jackson-datatype-money: javax.money 타입(금융 관련 타입)을 처리할 수 있도록 지원합니다. 비공식 모듈이지만 금융 애플리케이션에서 널리 사용됩니다.
  • jackson-datatype-hibernate: Hibernate의 특정 타입과 속성을 지원하며, 지연 로딩된 엔터티 및 속성을 처리할 수 있도록 돕습니다. Spring과 Hibernate를 사용할 때 유용하며, Hibernate 프록시 및 엔터티를 효율적으로 처리할 수 있습니다.

Jackson의 디폴트 설정 커스터마이징

위 예제에서는 Jackson2ObjectMapperBuilder를 사용하여 Jackson의 기본 동작을 변경합니다:

  • DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 비활성화: 역직렬화 중에 알 수 없는 속성이 발견되면 예외를 던지는 대신 무시합니다. 예를 들어, JSON에 Java 클래스와 일치하지 않는 속성이 있을 경우 이를 무시하고 에러가 발생하지 않도록 설정합니다.
  • MapperFeature.DEFAULT_VIEW_INCLUSION 비활성화: Jackson의 @JsonView를 사용할 때, 기본적으로 모든 필드를 포함하는 대신 현재 View로 명시적으로 주석이 달린 필드만 출력되도록 설정합니다.

Spring Boot와 메시지 컨버터 통합

Spring Boot 애플리케이션에서는 메시지 컨버터가 WebMvcAutoConfiguration에 의해 자동으로 등록됩니다. 이때 애플리케이션에서 정의한 HttpMessageConverter 빈들이 디폴트 컨버터와 함께 추가됩니다.

Spring Boot에서의 모범 사례:

  • configureMessageConverters()를 수동으로 오버라이드하는 대신, Spring Boot에서 제공하는 HttpMessageConverters 메커니즘을 사용하는 것이 좋습니다. 이 방법이 Spring Boot의 자동 구성 방식과 더 잘 맞습니다.
  • Spring Boot에서 기본 메시지 컨버터 목록을 수정하거나 확장하려면 extendMessageConverters()를 사용하는 것이 좋습니다. 이 메서드를 사용하면 디폴트 컨버터를 유지하면서 추가하거나 수정할 수 있습니다.

XML 지원과 의존성

Jackson으로 XML 지원을 활성화하려면 jackson-dataformat-xml 라이브러리 외에도 woodstox-core-asl 의존성을 프로젝트에 추가해야 합니다. woodstox-core-asl은 Jackson이 XML을 효율적으로 처리하는 데 필요한 고성능 XML 프로세서입니다.

Reactive Stack에서의 메시지 변환기

Spring WebFlux(reactive 스택)에서는 메시지 컨버터가 유사하게 작동하지만, 비동기 처리와 reactive 프로세싱에 적합하도록 설계되었습니다. WebFlux도 Spring MVC와 마찬가지로 HttpMessageReaderHttpMessageWriter를 사용하여 HTTP 요청과 응답을 변환하며, 이를 비동기 처리 방식에 맞게 구성할 수 있습니다.

 

Spring MVC에서 메시지 컨버터를 커스터마이징하면 다양한 콘텐츠 타입과 직렬화 형식을 유연하게 처리할 수 있습니다. Jackson2ObjectMapperBuilder를 사용하면 Jackson의 JSON 및 XML 처리 동작을 쉽게 조정할 수 있으며, Java 8+ 기능을 지원하는 여러 모듈을 추가하여 더욱 강력한 데이터 처리 기능을 구현할 수 있습니다.

Spring Boot 애플리케이션에서는 디폴트 컨버터를 완전히 교체하지 않고 확장하거나 수정하는 방법을 사용하는 것이 더 권장됩니다. 메시지 컨버터는 다양한 데이터 형식을 효율적으로 처리할 수 있는 강력한 기능을 제공하며, RESTful API 개발에서 필수적인 역할을 합니다.

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

View Resolvers  (0) 2024.10.15
View Controllers  (1) 2024.10.15
Content Types  (0) 2024.10.15
Interceptors  (1) 2024.10.14
Validation  (0) 2024.10.14