글 작성자: 개발섭

어떤식으로 문제가 발생하게 되었나?

현재 버스 앱을 만들고 있었습니다. 그래서 공공데이터 포탈에서 필요한 데이터를 뽑아서 가져와서 변환하는 프로그램을 만들었는데요.

문제는 공공 데이터 포탈에서 가져오는 데이터는 Json으로 데이터를 받아오면 데이터를 처리하는 데 있어서 여러가지 조건 사항들을 한번에 처리해주기가 너무 까다로워, 아예 저는 XML으로 파싱하는 것이 더 쉽다고 판단하고 그 데이터를 XML으로 받아서 파싱하는 방식으로 처리합니다.

이런 XML을 파싱하는 데이터를 빈에 올려서 파싱하는 함수를 따로 만들었지만 이상한 부분에서 문제가 발생합니다.

완전 이상한 문제

로컬환경 intellJ를 통해서 Run하는 경우는 문제없이 잘

작동하는 코드가, BootJAR 혹은 Install을 통해서 패키징되어 파일화 된파일을 자바로 실행하는 경우 오류가 나는 Case입니다.

 

위의 사진은 정상적으로 돌아가는 코드... 아래는 JAR파일로 패키징한 파일을 실행했을때 발생한 오류입니다.

 

오류 코드를 확인해보자면, org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name라는 오류가 발생하게됩니다.

 

결국에는 Bean이 생성이 안되는 문제인듯 합니다. 그래서 확인해봤던 것들이 뭐가 있었는지? 찬찬히 확인해본 결과 가장 많이 발생하는 오류는 대략적으로 package javax.xml.bind.annotation does not exist 와 같은 오류를 뱉어냈습니다. 혹은 xml에 관련된, 오류들을 많이 발생했습니다.

구체적으로 오류를 발생할때 상황을 이야기해보자면, Build시에 오류를 발생시키곤 했습니다.

어떤식으로 해결했나?

결국 문제점은 빌드 후 그 XML에 대해서 무언가가 재대로 처리되지 않아서 위와 같은 에러를 만들어진다고 생각하는데요. 그러면 Build를 관장하는 쪽에서 에러를 만들었다는 추론이 가능합니다.

즉, 의존성과 관련된 문제일 가능성이 크다는 것이고 그것에 힌트를 얻어서 저는 Spring Boot와 XML에 대한 관계를 찾아보게 됩니다.

인프런의 백기선님의 강의에서 적어놨었던 내용을 참고하여, 기본적으로 Spring Boot의 기본 의존성 설정에는 Json에 대한 의존성이 기본적으로 들어가있으나, XML에 대해서는 그 의존성이 없기때문에,

XML은 의존성이 설정되어있지 않으므로 Maven 혹은 Gradle에서 그 의존성 설정을 해줘야합니다

그 의존성 등록을 해주지 않으면 실제로 파일로 Build시에 XML에 대해서 재대로 처리해주지 못한다는 것입니다.

<dependency>
   <groupId>javax.xml.bind</groupId>
   <artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
   <groupId>org.glassfish.jaxb</groupId>
   <artifactId>jaxb-runtime</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-oxm</artifactId>
   <version>${spring-framework.version}</version>
</dependency>

Pom.xml에 다음과 같은 의존성을 꼭 추가하셔야지 Build시 JAR파일시 실행시의 오류를 방지할 수 있습니다.