Java ClassLoader 동작 원리 완벽 이해하기
Java JVM 구조를 공부하면 반드시 등장하는 핵심 개념이 바로:
ClassLoader
입니다.
실무에서도:
- Spring Boot 실행 구조
- 라이브러리 충돌
- Fat Jar 구조
- JDBC Driver 자동 로딩
- OOM(Metaspace)
등과 깊게 연결됩니다.
초보 시절에는 보통:
.class 파일 읽는 애
정도로만 이해하기 쉽습니다.
하지만 실제 ClassLoader는:
- 클래스 로딩
- 메모리 적재
- 클래스 중복 방지
- 보안
- 런타임 동적 로딩
을 담당하는 JVM 핵심 시스템입니다.
이번 글에서는:
- ClassLoader가 왜 필요한가
- 동작 과정
- Parent Delegation Model
- Bootstrap / Platform / Application Loader
- Spring Boot Fat Jar 구조
까지 깊게 정리해보겠습니다.
1. ClassLoader란?
ClassLoader는:
.class 파일(ByteCode)을 JVM 메모리에 로딩하는 컴포넌트
입니다.
즉:
.class 파일 읽기
↓
클래스 정보 생성
↓
JVM 메모리 적재
수행.
2. 왜 ClassLoader가 필요할까?
Java는 실행 중에:
필요한 클래스만 동적 로딩
합니다.
즉:
- 프로그램 시작 시 모든 클래스 로딩 X
- 필요한 순간 로딩 O
구조.
3. Java 실행 흐름 다시 보기
전체 흐름:
.java
↓
javac 컴파일
↓
.class(ByteCode)
↓
ClassLoader
↓
JVM 메모리
↓
Execution Engine 실행
4. ClassLoader 역할
핵심 역할:
| 역할 | 설명 |
| 클래스 탐색 | .class 찾기 |
| ByteCode 읽기 | 파일 로딩 |
| 클래스 생성 | JVM 메타데이터 생성 |
| 메모리 적재 | Method Area 저장 |
5. ClassLoader 동작 단계
ClassLoader 동작은 크게:
Loading
Linking
Initialization
3단계.
6. Loading 단계
Loading은:
.class 파일 읽기
단계.
예시:
User user = new User();
JVM은:
User.class 탐색
수행.
7. Loading 단계에서 하는 일
수행 작업:
- .class 파일 읽기
- ByteCode 메모리 적재
- Class 객체 생성
8. Class 객체란?
매우 중요합니다.
Java에서는 클래스 자체도 객체입니다.
예시:
Class clazz = User.class;
즉 JVM 내부에:
Class<User>
객체 생성됨.
9. Linking 단계
Linking은:
Verification
Preparation
Resolution
3단계 존재.
10. Verification
ByteCode 검증 단계.
즉:
이상한 ByteCode인가?
보안 문제 있는가?
검사.
11. 왜 Verification이 중요할까?
Java 보안 핵심 중 하나.
악성 ByteCode 차단 가능.
예:
메모리 직접 접근
잘못된 타입 접근
등 검증.
12. Preparation 단계
static 메모리 준비 단계.
예시:
static int count = 10;
이 단계에서는:
count = 0
기본값만 할당.
13. Initialization 단계에서 진짜 값 설정
count = 10
실제 초기화 수행.
14. Resolution 단계
클래스 참조 연결 단계.
예시:
UserService
↓
UserRepository 참조
연결 수행.
15. Initialization 단계
마지막 단계.
수행 내용:
- static 변수 초기화
- static block 실행
16. static block 예시
static {
System.out.println("초기화");
}
클래스 최초 로딩 시 실행.
17. 클래스는 언제 로딩될까?
대표 사례:
| 상황 | 로딩 여부 |
| new 객체 생성 | O |
| static 접근 | O |
| static method 호출 | O |
| Class.forName() | O |
18. Class.forName()
대표적인 동적 로딩 API.
Class.forName(
"com.mysql.Driver"
);
JDBC에서 매우 유명.
19. 왜 JDBC Driver 자동 등록될까?
옛날 JDBC 구조:
Class.forName("Driver");
호출 시:
static block 실행
↓
DriverManager 등록
구조.
20. Parent Delegation Model
ClassLoader 핵심 구조.
매우 중요합니다.
동작 방식:
“부모에게 먼저 요청”
입니다.
21. 왜 부모 위임 구조를 사용할까?
핵심 목적:
| 목적 | 설명 |
| 보안 | 핵심 클래스 보호 |
| 중복 방지 | 클래스 충돌 방지 |
| 안정성 | JVM 일관성 유지 |
22. ClassLoader 계층 구조
Java 기본 구조:
Bootstrap ClassLoader
↓
Platform ClassLoader
↓
Application ClassLoader
23. Bootstrap ClassLoader
최상위 로더.
로드 대상:
java.lang.*
java.util.*
즉 Java 핵심 클래스.
24. Bootstrap Loader 특징
| 특징 | 설명 |
| JVM 내부 구현 | C/C++ |
| Java 객체 아님 | O |
| 최상위 로더 | O |
25. Platform ClassLoader
(JDK9 이전 Extension Loader)
로드 대상:
JDK 확장 라이브러리
26. Application ClassLoader
실제 우리가 만든 클래스 로딩.
예:
src/main/java
클래스들.
27. Parent Delegation 실제 흐름
예:
new String()
실행 시:
Application Loader 요청
↓
Platform 요청
↓
Bootstrap 요청
↓
Bootstrap이 String 로딩
28. 왜 String을 직접 만들 수 없을까?
예를 들어:
package java.lang;
public class String {
}
이런 악성 클래스 방지 목적.
Bootstrap이 먼저 로딩하기 때문.
29. 클래스는 “이름 + ClassLoader”로 구분
매우 중요합니다.
즉:
같은 클래스 이름이어도
Loader 다르면 다른 클래스
입니다.
30. 그래서 발생하는 문제
대표 사례:
ClassCastException
인데 클래스 이름은 동일.
왜냐하면:
ClassLoader 다름
때문.
31. OSGi / WAS에서 자주 발생
대표 사례:
- Tomcat
- JBoss
- OSGi
에서 라이브러리 충돌 문제.
32. Spring Boot Fat Jar 구조
실무에서 매우 중요.
Spring Boot는:
jar 안에 jar 포함
구조 사용.
33. 일반 Java 실행 구조
보통:
classpath 기반
로딩.
34. Spring Boot는 왜 특별할까?
Spring Boot Fat Jar:
app.jar
└── lib/*.jar
즉 nested jar 구조.
기본 ClassLoader로 처리 어려움.
35. 그래서 Spring Boot가 Custom ClassLoader 사용
대표 클래스:
LaunchedURLClassLoader
Spring Boot 내부 구현.
36. ClassLoader와 메모리
클래스 정보는:
Method Area(Metaspace)
에 저장.
37. Metaspace OOM
대표 오류:
OutOfMemoryError:
Metaspace
원인:
- 클래스 너무 많이 로딩
- ClassLoader 누수
38. ClassLoader 누수(ClassLoader Leak)
실무에서 매우 중요.
대표 사례:
- WAS 재배포 반복
- static 참조 유지
- ThreadLocal 누수
39. 왜 ClassLoader Leak이 위험할까?
ClassLoader가 살아있으면:
해당 클래스 전체 GC 불가
즉:
- Metaspace 증가
- 메모리 누수
발생.
40. 실무에서 자주 하는 실수
1) ClassLoader 존재 자체를 모름
Spring/JPA 내부 구조 이해 어려워짐.
2) static 남용
ClassLoader GC 방해 가능.
3) ThreadLocal 정리 안 함
WAS 메모리 누수 원인 가능.
41. 핵심 정리
ClassLoader 핵심 역할:
.class 로딩
+
메모리 적재
+
중복 방지
+
보안 유지
입니다.
42. 정리
ClassLoader는 단순 파일 로더가 아닙니다.
실제로는:
- JVM 클래스 로딩
- 보안
- 메모리 구조
- Spring Boot 실행
- WAS 메모리 누수
와 깊게 연결되는 JVM 핵심 시스템입니다.
특히 실무에서는:
- Parent Delegation Model
- Bootstrap/Application Loader
- Spring Boot Fat Jar
- Metaspace/ClassLoader Leak
를 이해하는 것이 매우 중요합니다.
다음 글에서는:
Stack / Heap / Method Area 메모리 구조
를 객체 생성 과정과 함께 JVM 메모리 흐름 중심으로 깊게 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java 객체 생성 과정과 메모리 흐름 완벽 이해하기 (0) | 2026.05.26 |
|---|---|
| Java Stack / Heap / Method Area 메모리 구조 완벽 이해하기 (0) | 2026.05.26 |
| Java JVM 구조 이해 완벽 정리 (0) | 2026.05.26 |
| Java 템플릿 메서드 패턴(Template Method Pattern) 완벽 이해하기 (0) | 2026.05.22 |
| Java 전략 패턴(Strategy Pattern) 완벽 이해하기 (0) | 2026.05.22 |
댓글