2024. 10. 15. 04:40ㆍSpring 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()));
}
}
주요 구성 요소 설명:
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이 생성자 파라미터를 더 지능적으로 매핑할 수 있습니다.
MappingJackson2HttpMessageConverter
: 이 메시지 컨버터는 Jackson을 사용하여 JSON 데이터를 직렬화하고 역직렬화합니다.converters
리스트에 추가하면, Java 객체를 JSON으로 변환하거나 그 반대로 변환할 때 사용됩니다.MappingJackson2XmlHttpMessageConverter
: 이 컨버터는 Jackson을 사용하여 XML 데이터를 처리하며,createXmlMapper(true)
를 호출하여 XML 전용ObjectMapper
를 생성합니다.
Jackson 모듈
Spring은 특정 Jackson 모듈이 클래스패스에 있을 경우 이를 자동으로 등록합니다. 이러한 모듈은 Jackson이 특정 데이터 구조나 Java 기능을 더 잘 처리할 수 있도록 돕습니다:
jackson-datatype-joda
: Joda-Time 타입을 처리할 수 있도록 지원합니다.jackson-datatype-jsr310
: Java 8의 날짜 및 시간 API 타입(예:LocalDate
,LocalDateTime
등)을 처리할 수 있도록 지원합니다.jackson-datatype-jdk8
: Java 8의Optional
등 다른 Java 8 타입을 지원합니다.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와 마찬가지로 HttpMessageReader
및 HttpMessageWriter
를 사용하여 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 |