devOmnivore

Java 11에서 javax.xml.bind.JAXBException 에러가 발생하는 이유와 해결 방법

devOMNIVORE 2025. 1. 1. 00:58
반응형

 

Java 11에서 javax.xml.bind.JAXBException 에러를 해결하는 방법

Java 11로 업그레이드하면서 이전에는 문제없던 코드가 갑자기 javax.xml.bind.JAXBException 같은 에러를 던지기 시작했나요? 이 에러는 Java 9 이상에서 Java EE 모듈이 제거된 결과로 발생합니다. 특히 XML 데이터 처리에서 JAXB API를 사용하는 프로젝트라면 더더욱 영향을 받을 가능성이 높습니다. 이번 글에서는 이 문제의 원인과 해결 방법을 상세히 다뤄보겠습니다.

 

 

Java 11에서 javax.xml.bind.JAXBException 에러가 발생하는 이유와 해결 방법


🔍 에러의 원인: Java EE 모듈 제거

Java 9부터 Java EE 모듈이 더 이상 기본 클래스패스에 포함되지 않으며, Java 11에서는 이 모듈이 완전히 제거되었습니다. JAXB(Java Architecture for XML Binding)는 Java EE의 일부로 분류되기 때문에, 기존 코드에서 이를 사용하는 경우 다음과 같은 에러를 만나게 됩니다:

  • java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
  • java.lang.ClassNotFoundException: javax.xml.bind.JAXBContext

이러한 에러는 JAXB API 클래스가 더 이상 JVM의 클래스패스에 없기 때문에 발생합니다.


🔧 해결 방법: JAXB 의존성 추가하기

이 문제를 해결하려면 JAXB API를 직접 프로젝트 의존성으로 추가해야 합니다. 사용하는 빌드 도구에 따라 설정 방식이 달라질 수 있으니 Maven과 Gradle을 예로 들어 보겠습니다.

1. Maven을 사용하는 경우

pom.xml 파일에 다음 의존성을 추가하세요:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

추가적으로 실행 시점에 필요한 JAXB 구현체 의존성을 설정해야 할 수도 있습니다:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

2. Gradle을 사용하는 경우

build.gradle 파일에 아래와 같은 내용을 추가합니다:

implementation 'javax.xml.bind:jaxb-api:2.3.0'
implementation 'com.sun.xml.bind:jaxb-impl:2.3.0'
implementation 'javax.activation:activation:1.1.1'

⚠️ 주의할 점

1. JAXB 버전 선택

JAXB의 최신 버전을 사용하면 더 많은 기능을 활용할 수 있지만, 프로젝트의 다른 의존성과 충돌하지 않도록 주의해야 합니다.

2. 의존성 충돌 방지

프로젝트에서 다른 라이브러리를 사용하고 있다면, JAXB와 동일한 버전의 의존성이 포함되어 있지 않은지 확인하세요. 충돌이 발생할 경우, 의존성 트리를 분석해 해결해야 합니다.

3. Spring Boot 사용자라면?

Spring Boot는 일부 버전에서 기본적으로 JAXB API 의존성을 포함하고 있습니다. 만약 Spring Boot 프로젝트에서 이 에러가 발생한다면, Spring Boot 버전을 확인하거나 직접 의존성을 추가해야 할 수도 있습니다.


💡 결론 및 추가 팁

JAXB API는 XML 데이터와 Java 객체 간의 매핑을 단순화하는 데 유용하지만, Java 11 이후로는 기본적으로 제공되지 않습니다. 위에서 설명한 대로 의존성을 추가하면 문제를 해결할 수 있습니다.

또한, JAXB 외에도 Jackson이나 GSON과 같은 라이브러리를 사용해 JSON/XML 데이터를 처리하는 방식으로 전환하는 것도 고려해 볼 만한 대안입니다. 이들은 더 현대적이고 가볍게 설계된 도구들로, JAXB에 비해 높은 성능과 유연성을 제공합니다.


이제 Java 11에서 JAXBException 문제를 해결할 준비가 되셨나요? 혹시 이 글이 도움이 되었다면, 댓글로 여러분의 경험을 공유하거나 질문을 남겨주세요! 😊

반응형