지난 포스팅에서 외부API를 사용하기위해 Webclient를 사용하기로 했었다
외부API에서 제공하는 것은 JSON이 아니라 XML이라서 파싱이 필요했음
여러 정보를 찾아본 결과 다음과 같이 3개를 발견할 수 있었음
특징 | JAXB | Jackson XML | HttpMessageConverter |
---|---|---|---|
주요 용도 | Java 객체와 XML 간 매핑, 스키마 검증 | XML과 Java 객체 간 변환, 성능 최적화 | HTTP 메시지 변환, Spring 통합 |
장점 | 표준화, 스키마 검증 지원, 안정성 | 성능, 유연성, JSON/XML 모두 지원 | Spring 통합, 콘텐츠 협상, 예외 처리 |
단점 | 설정 복잡, 유연성 부족 | XML 스키마 검증 제한, 표준 외부 의존 | HTTP 컨텍스트에 종속, 직접 제어 제한 |
적합한 경우 | 스키마 명확, 안정적 프로젝트 | 동적 XML, 성능 중요, JSON도 처리 필요 | Spring 웹 애플리케이션, HTTP 메시지 처리 |
JAXB : XML 데이터를 Java 객체로 변환하거나 그 반대로 변환하는 기술
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
Jackson : 기본적으로 JSON을 처리하는 라이브러리이지만, Jackson XML 모듈을 추가하면 XML 형식도 처리
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.x.x</version>
</dependency>
JAXB & Jackson XML은 라이브러리
두 성능을 비교한 내용은 스택오버플로워에서 찾을 수 있었음
https://stackoverflow.com/questions/65805250/hows-the-performance-of-jackson-compared-to-jaxb-in-creating-xml
-> JackSon이 성능이 더 좋았음
Spring에서는 HTTP 메시지 컨버터를 사용하여 WebClient
,RestTemplate
등의 HTTP 클라이언트를 통해 XML을 처리
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.x.x</version> <!-- Jackson 버전에 맞게 사용 -->
</dependency>
- Spring은 XML을 처리하기 위한
MappingJackson2XmlHttpMessageConverter
와 같은 메시지 컨버터 제공- Spring과의 통합성:
@RequestBody
,@ResponseBody
로 쉽게 사용 가능- 콘텐츠 협상: 클라이언트 요청 타입(예:
application/xml
)에 맞춰 자동 변환- 간편한 설정: JAXB나 Jackson XML을 내부 엔진으로 활용 가능
단, HTTP와 무관한 XML 파싱(파일 읽기 등)이라면 불필요
→ 이 경우 JAXB
나 Jackson XML
을 직접 쓰는 게 낫다
위 http message converter 의존성을 보면 jackson-dataformat-xml가 추가된 것을 찾아볼수 있다
필자 경우도 http message converter 기능은 spring-boot-starter-webflux 의존성을 추가됬으니 포함된 거 아닌가? 왜 또 추가해야하지 궁금했다
HTTP Message Converter 방식에서 XML을 처리할 때, 자동으로 XML을 파싱하고 직렬화/역직렬화하는 데 필요한 핵심 부분은 Jackson2XmlDecoder나 Jaxb2XmlDecoder와 같은 메시지 컨버터 이다
결론
- 스프링에서 XML을 처리할때 Jackson2XmlDecoder를 사용하려면 Jackson이 XML을 처리하는 기능을 제공해야 하기 때문에, jackson-dataformat-xml 의존성이 필요 하다!
- Jackson을 기반으로 XML 파싱을 하기 때문에, 이 의존성이 없으면 XML 파싱을 할 수 없습니다
필자 경우 HttpMessageConverter는 기본적으로 스프링이 제공하는 변환기를 사용하므로, 자동으로 필요한 변환기를 선택및 이를 기반으로 데이터를 처리해주기 때문에 설정이 덜 필요하고 관리가 용이 하기에 이걸로 선택하기로 함.
JAXB나 Jackson XML을 사용하려면 구체적인 설정을 필요
예를 들어서 @XmlRootElement와 같은 애너테이션을 사용하여 XML 바인딩을 처리하거나, Jackson에서 XML 모듈을 사용하려면 별도로 XmlMapper 등을 설정등 부수적인게 필요하기때문