Spring Boot 의 Executable Jar 와 Loader
최근에 Spring Boot 로 운영하고 있던 웹 어플리케이션에서 'NoClassDefFoundError' 가 발생하여 이에 대한 원인을 추적하다가 Spring Boot 의 기본 동작과 연관이 있다는 사실을 알게 되었습니다. 초기에 Spring Boot 를 사용할 때 잠깐 봤던 기초적인 내용이지만, 이를 간과하여 에러 원인을 파악하는데 꽤나 시간을 쓰게 되었습니다. 다시한번 기초 및 기본기의 중요성을 깨닫게 되었고 같은 실수를 반복하지 않을 겸, 저와 같은 일을 다른 분들도 겪지 않길 바라는 마음에서 블로그에 Spring Boot 의 Executable Jar 에 대해 정리해보았습니다. 요약하자면 다음과 같습니다. ✔️ Java 에서는 Nested Jar 파일 (즉, jar 안에 jar 가 들어가있는 파일)을 로드하는 표준 방법을 제공하지 않는다. ✔️ 그래서 Spring Boot 에서 자체적으로 Executable Jar 파일 구조와 이에 대한 Loader 를 구현하였다. ✔️ Spring Boot 는 class 와 jar 파일의 offset 정보를 기록하여 필요시 Load 하도록 구현해두었다. ✔️ 만약 jar 파일이 바뀌게 된다면 위에서 기록한 offset 정보가 바뀌기 때문에 class Load 과정에서 오류가 발생하게 된다. ✔️ Spring Boot 로 개발된 jar 파일을 변경하게 될 경우 신중해야한다.