Error

[NoClassDefFoundError] 전이적 의존성 관리의 차이

연신내고독한늑대 2024. 10. 14. 20:00

최근에 AWS S3에 파일을 업로드하는 코드를 구현하면서 흥미로운 경험을 했습니다. 이미 완성된 폐쇄망이 아닌 프로젝트를 참고하여, 제 폐쇄망 환경에서 같은 기능을 구현하려고 시도했습니다. 먼저, S3 관련 기능을 사용하기 위해 aws-java-sdk-s3 라이브러리를 Gradle에 의존성 주입만 해줬습니다. 하지만 아래와 같은 오류가 발생했습니다

java.lang.NoClassDefFoundError: org/apache/http/protocol/HttpRequestExecutor

처음에는 이 오류가 왜 발생했는지 의아했지만, 문제를 해결하기 위해 알아보니 이 오류는 필수적인 전이적 의존성이 누락되었기 때문이었습니다.

 

■ 폐쇄망과 비폐쇄망 환경의 차이

제가 참고했던 폐쇄망이 아닌 프로젝트에서는, Gradle에 aws-java-sdk-s3 라이브러리만 의존성 주입을 했음에도 불구하고 필요한 다른 의존성들이 자동으로 다운로드되어 오류 없이 동작했습니다. 이는 Gradle이나 Maven이 **전이적 의존성(transitive dependency)**을 자동으로 해결해주기 때문입니다.

 

그러나 제가 구현하려던 폐쇄망 환경에서는 Gradle이 외부 인터넷에 접근할 수 없었기 때문에 aws-java-sdk-s3와 함께 필요한 다른 라이브러리들(httpclient, httpcore, joda-time 등)이 다운로드되지 않았습니다. 그래서 NoClassDefFoundError가 발생한 것입니다. 그래서 httpclient관련 라이브러리도 폐쇄망에 추가하면 httpcore추가 하라는 똑같은 오류가 발생하고, httpcore를 추가해주면  joda-time를 추가하라는 오류가 계속 발생했습니다.

 

■ Gradle과 Maven의 전이적 의존성 관리

Gradle과 Maven은 전이적 의존성 관리라는 매우 강력한 기능을 제공합니다. 이 기능 덕분에 프로젝트에 특정 라이브러리를 의존성으로 추가할 때, 그 라이브러리가 필요로 하는 다른 의존성들을 자동으로 함께 다운로드하고 프로젝트에 포함시킵니다.

 

폐쇄망이 아닌 프로젝트에서는 제가 Gradle에 **aws-java-sdk-s3**만 추가했지만, Gradle은 자동으로 이 라이브러리가 의존하는 aws-java-sdk-core, httpclient, httpcore, joda-time 등을 함께 다운로드해서 사용 가능한 상태로 만들어 주었습니다. 반면, 폐쇄망 환경에서는 외부 네트워크에 접근할 수 없었기 때문에, 추가적으로 필요한 라이브러리들이 누락되어 문제가 발생한 것입니다.

 

■ 결론

이번 경험을 통해 폐쇄망 환경에서 AWS SDK 같은 라이브러리를 사용할 때는 모든 필요한 의존성들을 수동으로 관리해야 한다는 사실을 다시 한번 깨달았습니다. 반면, 폐쇄망이 아닌 환경에서는 Gradle이나 Maven전이적 의존성 관리 덕분에 편리하게 의존성을 처리할 수 있었습니다. 이 차이점을 이해하는 것은 특히 폐쇄망 환경에서 개발할 때 매우 중요한 요소임을 알게 되었습니다.

'Error' 카테고리의 다른 글

[Tomcat]org.apache.catalina.webresources.Cache.backgroundProcess  (1) 2024.07.22