XML 파싱: JAXB, Jackson XML, HttpMessageConverter 비교

NTbell·약 15시간 전
0

지난 포스팅에서 외부API를 사용하기위해 Webclient를 사용하기로 했었다
외부API에서 제공하는 것은 JSON이 아니라 XML이라서 파싱이 필요했음

여러 정보를 찾아본 결과 다음과 같이 3개를 발견할 수 있었음

  1. JAXB
  2. Jackson XML
  3. HttpMessageConverter

특징

특징JAXBJackson XMLHttpMessageConverter
주요 용도 Java 객체와 XML 간 매핑, 스키마 검증XML과 Java 객체 간 변환, 성능 최적화HTTP 메시지 변환, Spring 통합
장점표준화, 스키마 검증 지원, 안정성성능, 유연성, JSON/XML 모두 지원Spring 통합, 콘텐츠 협상, 예외 처리
단점설정 복잡, 유연성 부족XML 스키마 검증 제한, 표준 외부 의존HTTP 컨텍스트에 종속, 직접 제어 제한
적합한 경우스키마 명확, 안정적 프로젝트동적 XML, 성능 중요, JSON도 처리 필요Spring 웹 애플리케이션, HTTP 메시지 처리

JAXB vs Jackson XML

JAXB : XML 데이터를 Java 객체로 변환하거나 그 반대로 변환하는 기술

  • XML과 Java 객체 간의 변환을 쉽게 해주는 표준 API로, XML 데이터를 Java 객체로 매핑하거나 Java 객체를 XML 형식으로 직렬화할 때 사용
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

Jackson : 기본적으로 JSON을 처리하는 라이브러리이지만, Jackson XML 모듈을 추가하면 XML 형식도 처리

  • Java 표준 API로 XML 파싱을 처리하는 방법
  • XML 직렬화 및 역직렬화를 지원하며, XML 데이터를 Java 객체로 변환하거나 그 반대로 변환할 때 사용
  • JsonProperty, @XmlElement와 같은 애노테이션을 사용하여 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이 성능이 더 좋았음


Http Message Converter

Spring에서는 HTTP 메시지 컨버터를 사용하여 WebClient,RestTemplate 등의 HTTP 클라이언트를 통해 XML을 처리

  • 내부적으로 다양한 메시지 컨버터를 제공
  • XML 파싱을 위해 Jackson2XmlDecoder, Jaxb2XmlDecoder와 같은 HttpMessageConverter를 사용
<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 파싱(파일 읽기 등)이라면 불필요
→ 이 경우 JAXBJackson XML을 직접 쓰는 게 낫다

🤔의문점?

위 http message converter 의존성을 보면 jackson-dataformat-xml가 추가된 것을 찾아볼수 있다

필자 경우도 http message converter 기능은 spring-boot-starter-webflux 의존성을 추가됬으니 포함된 거 아닌가? 왜 또 추가해야하지 궁금했다

HTTP Message Converter 방식에서 XML을 처리할 때, 자동으로 XML을 파싱하고 직렬화/역직렬화하는 데 필요한 핵심 부분은 Jackson2XmlDecoderJaxb2XmlDecoder와 같은 메시지 컨버터 이다

결론

  • 스프링에서 XML을 처리할때 Jackson2XmlDecoder를 사용하려면 Jackson이 XML을 처리하는 기능을 제공해야 하기 때문에, jackson-dataformat-xml 의존성이 필요 하다!
  • Jackson을 기반으로 XML 파싱을 하기 때문에, 이 의존성이 없으면 XML 파싱을 할 수 없습니다

🐈

필자 경우 HttpMessageConverter는 기본적으로 스프링이 제공하는 변환기를 사용하므로, 자동으로 필요한 변환기를 선택및 이를 기반으로 데이터를 처리해주기 때문에 설정이 덜 필요하고 관리가 용이 하기에 이걸로 선택하기로 함.

JAXB나 Jackson XML을 사용하려면 구체적인 설정을 필요
예를 들어서 @XmlRootElement와 같은 애너테이션을 사용하여 XML 바인딩을 처리하거나, Jackson에서 XML 모듈을 사용하려면 별도로 XmlMapper 등을 설정등 부수적인게 필요하기때문

profile
최종빈의 컴퓨터교실

0개의 댓글

관련 채용 정보