안녕하세요, 코딩하는곰입니다. 🤗
Java 개발을 하다 보면 한 번쯤 마주치는 ClassNotFoundException! 이 에러는 단순해 보이지만 다양한 원인이 숨어있습니다. 오늘은 20년 경력의 Java 개발자로서, 이 예외의 발생 원인을 의존성 누락부터 JVM의 ClassLoader 동작 방식까지 깊이 있게 분석해보겠습니다. 특히 실무에서 마주칠 수 있는 다양한 시나리오와 해결 방법을 중점적으로 다룰 예정이니 끝까지 함께 해주세요!
ClassNotFoundException은 JVM이 런타임 시에 특정 클래스를 찾지 못할 때 발생하는 체크 예외입니다. 주로 Class.forName(), ClassLoader.loadClass() 메서드 호출 시 발생하며, 다음과 같은 특징을 가집니다:
ReflectiveOperationException의 하위 클래스 try {Class.forName("com.example.NonExistClass");} catch (ClassNotFoundException e) {System.out.println("클래스를 찾을 수 없습니다: " + e.getMessage());}
실무에서 가장 흔한 원인은 빌드 도구의 의존성 설정 오류입니다.
pom.xml에 필요한 라이브러리가 선언되지 않았다면:
<!-- 누락된 경우 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency>
해결 방법:
mvn dependency:tree로 의존성 확인 WEB-INF/lib에 JAR 포함 확인 provided로 선언 시 배포 환경에서 누락 가능성
모바일이나 데스크탑에서 별도 설치 없이 빠르게 사용할 수 있는 온라인 계산기를 이용해보세요.
JVM은 계층적 클래스 로더를 사용합니다.
| 로더 타입 | 로드 대상 | 특징 |
|---|---|---|
| Bootstrap | JRE 핵심 라이브러리 | 최상위 로더, C++ 구현 |
| Extension | jre/lib/ext 내 JAR | 확장 클래스 로드 |
| System | 애플리케이션 클래스 | 클래스패스 기반 로딩 |
// 현재 클래스 로더 확인ClassLoader loader = MyClass.class.getClassLoader();System.out.println(loader.toString());
✨ 감성과 열정이 만나는 현장을 직접 보고 싶다면, 장성 어울림음악회를 참고해보세요.
오늘은 ClassNotFoundException의 다양한 원인과 해결 방법을 심층적으로 살펴봤습니다. 🎯
이 에러는 단순히 “클래스가 없다”는 메시지보다 더 복잡한 배경을 가질 수 있습니다. 특히 동적 로딩이나 멀티 모듈 프로젝트에서는 더욱 주의가 필요하죠.
궁금한 점이 있다면 댓글로 남겨주세요!
다음 포스팅에서는 NoClassDefFoundError와의 차이점을 다룰 예정이니 기대해주세요!
코딩하는곰이었습니다. 🐾
(블로그 구독과 좋아요는 큰 힘이 됩니다!)
🖼️ 이번 주 주목할 만한 공연·전시 소식은, 제15회 진안고원 수박축제를 참 고해보세요.
