๐ JAVA 02 - JVM ClassLoader์ ์คํ ๊ตฌ์กฐ
์ถ์ฒ ํ์ผ๋ช
2026-05-14-jvm-classloader-runtime-structure.md
title: โJVM ClassLoader์ ์คํ ๊ตฌ์กฐ - ์ Java๋ ๋์ ์ผ๋ก ํด๋์ค๋ฅผ ๋ก๋ฉํ๋๊ฐ?โ
date: 2026-05-14
categories: [To-Be-Senior]
tags: [Java, JVM, ClassLoader, Reflection, Runtime, Backend]
JVM ClassLoader์ ์คํ ๊ตฌ์กฐ
ํ์ต ๋ชฉํ
์ด๋ฒ ์ฃผ์ ์ ํต์ฌ์ ๋จ์ํ:
โClassLoader๋ ํด๋์ค๋ฅผ ์ฝ๋ ๊ฐ์ฒดโ
์์ค์ด ์๋๋ค.
์ค๋ฌด์์๋ ๋ค์์ ์ดํดํด์ผ ํ๋ค.
JVM์ ์ ClassLoader ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์๋๊ฐ?
์ ๋ถ๋ชจ ์์ ๋ชจ๋ธ์ด ํ์ํ๊ฐ?
Runtime Dynamic Loading์ ์ด๋ค ์ฅ์ ์ ๊ฐ์ง๋๊ฐ?
Reflection์ ์ ๋๋ฆฌ๋ค๊ณ ํ๋๊ฐ?
Spring์ ์ด๋ป๊ฒ ๋์ ์ผ๋ก Bean์ ์์ฑํ๋๊ฐ?
์ด์ ํ๊ฒฝ์์ ClassLoader๋ ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ๋ฐํ๋๊ฐ?
์ฆ:
โJava ๋ฐํ์ ์์คํ ์ ํต์ฌ ๋ฉ์ปค๋์ฆโ
์ ์ดํดํ๋ ๊ฒ์ด ๋ชฉํ๋ค.
JVM ์คํ ๊ตฌ์กฐ
flowchart TD
A[.java Source] --> B[javac Compile]
B --> C[.class Bytecode]
C --> D[JVM Start]
D --> E[ClassLoader]
E --> F[Runtime Data Area]
F --> G[Execution Engine]
Java๋:
์คํ ์์ (Runtime)์ ํด๋์ค ๋ก๋ฉ์ด ์ด๋ฃจ์ด์ง๋ค.
์ด๊ฒ C/C++์ ๊ฐ์ฅ ํฐ ์ฐจ์ด ์ค ํ๋๋ค.
ClassLoader๋ ๋ฌด์์ธ๊ฐ?
ClassLoader๋:
.class Bytecode๋ฅผ JVM ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๋ ์ญํ
์ ์ํํ๋ค.
Java์ ๋ชจ๋ ํด๋์ค๋ ๋ฐ๋์ ClassLoader๋ฅผ ํตํด ๋ก๋ฉ๋๋ค.
JVM ClassLoader ๊ตฌ์กฐ
flowchart TD
A[Bootstrap ClassLoader]
B[Platform ClassLoader]
C[Application ClassLoader]
A --> B
B --> C
Bootstrap ClassLoader
์ต์์ ๋ก๋.
ํต์ฌ Java ํด๋์ค ๋ก๋ฉ ๋ด๋น:
java.lang
java.util
java.io
์:
1
System.out.println(String.class.getClassLoader());
๊ฒฐ๊ณผ:
1
null
Bootstrap Loader๋ Native(C++) ์์ญ์์ ๋์ํ๊ธฐ ๋๋ฌธ์ null๋ก ํํ๋๋ค.
Application ClassLoader
๊ฐ๋ฐ์๊ฐ ์์ฑํ ํด๋์ค๋ฅผ ๋ก๋ฉํ๋ค.
1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
System.out.println(Main.class.getClassLoader());
}
}
์ถ๋ ฅ:
1
jdk.internal.loader.ClassLoaders$AppClassLoader
๋ถ๋ชจ ์์ ๋ชจ๋ธ (Parent Delegation Model)
ClassLoader์ ํต์ฌ ๊ตฌ์กฐ๋ค.
flowchart TD
A[ํด๋์ค ๋ก๋ฉ ์์ฒญ]
--> B[๋ถ๋ชจ ClassLoader ์์]
B --> C{๋ถ๋ชจ๊ฐ ํด๋์ค ๋ฐ๊ฒฌ?}
C -->|YES| D[๋ถ๋ชจ๊ฐ ๋ก๋ฉ]
C -->|NO| E[ํ์ฌ Loader๊ฐ ๋ก๋ฉ]
์ ์ด๋ ๊ฒ ์ค๊ณํ๋๊ฐ?
1. ๋ณด์
๋ง์ฝ ๋ถ๋ชจ ์์์ด ์๋ค๋ฉด:
1
2
3
4
package java.lang;
public class String {
}
๊ฐ์ ์ ์ฑ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
์ฆ:
Java ํต์ฌ ํด๋์ค๋ฅผ ์์กฐ ๊ฐ๋ฅ
ํด์ง๋ค.
๋ถ๋ชจ ์์ ๋ชจ๋ธ์ ํญ์ Bootstrap Loader๋ฅผ ์ฐ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๋ง๋๋ค.
2. ํด๋์ค ์ค๋ณต ๋ฐฉ์ง
Java์์ ํด๋์ค๋:
1
ํด๋์ค ์ด๋ฆ + ClassLoader
์กฐํฉ์ผ๋ก ์๋ณ๋๋ค.
์ฆ:
๊ฐ์ ํด๋์ค๋ผ๋ ClassLoader๊ฐ ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ํ์ ์ด๋ค.
Loading โ Linking โ Initialization
ํด๋์ค ๋ก๋ฉ์ ๋จ์ ํ์ผ ์ฝ๊ธฐ๊ฐ ์๋๋ค.
3๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค.
flowchart LR
A[Loading]
--> B[Linking]
--> C[Initialization]
1. Loading
.class ํ์ผ์ ์ฝ๋๋ค.
2. Linking
๋ฉ๋ชจ๋ฆฌ ์ฐ๊ฒฐ ๋ฐ ๊ฒ์ฆ ์ํ.
์ธ๋ถ ๋จ๊ณ:
Verify
Prepare
Resolve
์ฌ๊ธฐ์ Bytecode ๊ฒ์ฆ์ด ๋ฐ์ํ๋ค.
3. Initialization
์ ์ ๋ณ์ ์ด๊ธฐํ ์ํ.
1
2
3
static {
System.out.println("init");
}
Runtime Dynamic Loading
Java์ ํต์ฌ ํน์ง ์ค ํ๋๋ค.
1
2
Class<?> clazz =
Class.forName("com.mysql.jdbc.Driver");
์คํ ์์ ์ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ๋ก๋ฉํ๋ค.
์ ์ค์ํ๊ฐ?
์ด ๊ตฌ์กฐ ๋๋ถ์ Java๋:
Spring
JDBC
Tomcat
JPA Proxy
AOP Proxy
๊ฐ์ ๊ฐ๋ ฅํ ๋ฐํ์ ํ์ฅ์ฑ์ ๊ฐ์ง๋ค.
์ฆ:
Java ์ํ๊ณ ์ ์ฐ์ฑ์ ํต์ฌ
์ด๋ค.
Reflection๊ณผ ์ฐ๊ฒฐ
Reflection์:
๋ฐํ์์ ํด๋์ค ์ ๋ณด๋ฅผ ์กฐ์ํ๋ ๊ธฐ์
์ด๋ค.
1
2
3
4
Class<?> clazz = User.class;
Method[] methods =
clazz.getDeclaredMethods();
Spring์ ์ Reflection์ ์ฌ์ฉํ๋๊ฐ?
Spring ๋ด๋ถ๋ Reflection ๊ธฐ๋ฐ์ด๋ค.
๋ํ ์ฌ๋ก:
Bean ์์ฑ
DI ์ฃผ์
AOP Proxy
Annotation ๋ถ์
์ฆ:
Spring ๋ด๋ถ๋ Runtime Dynamic Loading + Reflection ๊ธฐ๋ฐ
์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
Reflection์ ์ ๋๋ฆฐ๊ฐ?
์ผ๋ฐ ํธ์ถ:
1
user.getName();
Reflection ํธ์ถ:
1
method.invoke(user);
Reflection์:
๋ฉํ๋ฐ์ดํฐ ํ์
์ ๊ทผ ์ ์ด ๊ฒ์ฌ
๋์ ํธ์ถ
๊ณผ์ ์ด ์ถ๊ฐ๋๋ค.
ํ์ง๋ง ์ค๋ฌด์์ ์ง์ง ๋ณ๋ชฉ์ธ๊ฐ?
๋๋ถ๋ถ์ ์๋๋ค.
์ค์ ๋ณ๋ชฉ์ ๋ณดํต:
DB
Network
External API
์์ ๋ฐ์ํ๋ค.
Reflection์ ๋ณดํต startup ๊ตฌ๊ฐ์์ ๋ง์ด ์ฌ์ฉ๋๋ค.
Spring Boot Auto Configuration
flowchart TD
A[Spring Boot Start]
--> B[Classpath Scan]
B --> C{ํน์ ํด๋์ค ์กด์ฌ?}
C -->|YES| D[Auto Configuration]
C -->|NO| E[Skip]
๋ํ ์ฌ๋ก:
JDBC Driver
Redis
Kafka
์๋ ์ฐ๊ฒฐ.
Tomcat๊ณผ ClassLoader
Tomcat์ ์ ํ๋ฆฌ์ผ์ด์ ๋ณ ๋ ๋ฆฝ ClassLoader๋ฅผ ์ฌ์ฉํ๋ค.
flowchart TD
A[Tomcat]
A --> B[WebApp ClassLoader A]
A --> C[WebApp ClassLoader B]
์?
ํด๋์ค ์ถฉ๋ ๋ฐฉ์ง
๋ ๋ฆฝ ๋ฐฐํฌ
Hot Reload ์ง์
์ด์ ํ๊ฒฝ ํต์ฌ ๋ฌธ์
ClassLoader Memory Leak
์ค์ ์ด์์์ ๋งค์ฐ ์ ๋ช ํ ์ฅ์ ์์ธ์ด๋ค.
ํนํ:
Tomcat
DevTools
Hot Reload
ํ๊ฒฝ์์ ์์ฃผ ๋ฐ์ํ๋ค.
์ ๋ฐ์ํ๋๊ฐ?
ClassLoader๊ฐ GC๋์ง ๋ชปํ๋ฉด:
ํด๋น Loader๊ฐ ๋ก๋ฉํ ๋ชจ๋ ํด๋์ค๋ GC ๋ถ๊ฐ
์ํ๊ฐ ๋๋ค.
๋ํ ์์ธ:
static ๊ฐ์ฒด
ThreadLocal
JDBC Driver ๋ฑ๋ก ๋๋ฝ
Cache ๊ฐ์ฒด
์ค์ ์ฅ์ ์ฌ๋ก
์ฌ๋ฐฐํฌ ๋ฐ๋ณต ํ:
1
java.lang.OutOfMemoryError: Metaspace
๋ฐ์.
์์ธ:
์ด์ WebApp ClassLoader ๋ฏธํด์
static cache ์ฐธ์กฐ ์ ์ง
์ฆ:
ํด๋์ค ์์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋์
๋๋ ์ํฉ์ด๋ค.
์ฑ๋ฅ ๊ด์
ClassLoader ์์ฒด๋ ๋น๋ฒํ์ง ์๋ค.
ํ์ง๋ง:
reflection ๋จ์ฉ
proxy ๊ณผ๋ค ์์ฑ
excessive dynamic loading
์ startup latency๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
Spring Boot ์ด๊ธฐ ๊ธฐ๋์ด ๋๋ฆฐ ์ด์ ์ค ํ๋๋ค.
Trade-off
์ฅ์
์ ์ฐ์ฑ
๋ฐํ์ ํ์ฅ
ํ๋ฌ๊ทธ์ธ ๊ตฌ์กฐ
๋์ ์์คํ
๋จ์
startup ๋น์ฉ ์ฆ๊ฐ
๋ฐํ์ ์ค๋ฅ ์ฆ๊ฐ
๋๋ฒ๊น ๋์ด๋ ์์น
classloader leak ์ํ
์์ฃผ ๋ฐ์ํ๋ ์ค์
1. Reflection ๋จ์ฉ
๋ถํ์ํ reflection ๋ฐ๋ณต ํธ์ถ.
2. static ๊ฐ์ฒด ๋์
์ฌ๋ฐฐํฌ ํ๊ฒฝ์์ ์น๋ช ์ .
3. custom ClassLoader ๋จ๋ฐ
๋งค์ฐ ๋ณต์กํ ๋๋ฒ๊น ์ ๋ฐ.
๋ฉด์ ๊ผฌ๋ฆฌ ์ง๋ฌธ
Q1. ๋ถ๋ชจ ์์ ๋ชจ๋ธ์ ์ ํ์ํ๊ฐ?
ํต์ฌ:
๋ณด์
์ค๋ณต ๋ก๋ฉ ๋ฐฉ์ง
Java Core ๋ณดํธ
Q2. ๊ฐ์ ํด๋์ค์ธ๋ฐ ์ ClassCastException์ด ๊ฐ๋ฅํ๊ฐ?
ํต์ฌ:
1
ํด๋์ค + ClassLoader
์กฐํฉ์ด ํ์ ์๋ณ ๊ธฐ์ค์ด๋ค.
Q3. Spring์ ์ Reflection์ ์ฌ์ฉํ๋๊ฐ?
ํต์ฌ:
๋ฐํ์ DI
Annotation ๊ธฐ๋ฐ ์ฒ๋ฆฌ
์ ์ฐ์ฑ ํ๋ณด
Q4. Reflection์ ์ ๋๋ฆฐ๊ฐ?
ํต์ฌ:
๋ฉํ๋ฐ์ดํฐ ์ ๊ทผ
๋์ ํธ์ถ
์ต์ ํ ์ ํ
์ข์ ๋ต๋ณ ์์
JVM์ Runtime ์์ ์ ClassLoader๋ฅผ ํตํด ํด๋์ค๋ฅผ ๋ก๋ฉํฉ๋๋ค.
Java๋ ๋ถ๋ชจ ์์ ๋ชจ๋ธ์ ํตํด ํต์ฌ ํด๋์ค๋ฅผ ๋ณดํธํ๋ฉฐ ์ค๋ณต ๋ก๋ฉ์ ๋ฐฉ์งํฉ๋๋ค.
๋ํ Runtime Dynamic Loading ๊ตฌ์กฐ ๋๋ถ์ Spring, JDBC, WAS ๊ฐ์ ์ ์ฐํ ํ๋ ์์ํฌ ๊ตฌ์กฐ๊ฐ ๊ฐ๋ฅํด์ก์ต๋๋ค.
๋ค๋ง Reflection๊ณผ Dynamic Loading์ startup ๋น์ฉ๊ณผ ClassLoader leak ๊ฐ์ ์ด์ ์ด์๋ฅผ ์ ๋ฐํ ์ ์์ด ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
๊ด๋ จ CS ๊ฐ๋ ์ฐ๊ฒฐ
์ฐ๊ฒฐ๋๋ ํต์ฌ ๊ฐ๋ :
Dynamic Linking
Runtime System
Virtual Machine
Memory Management
Plugin Architecture
Dependency Injection
Proxy Pattern
ํ์ ์์ ํนํ ์ค์ํ ํฌ์ธํธ
1. Spring ๋ด๋ถ ๋์ ์ดํด
๋๋ถ๋ถ Reflection ๊ธฐ๋ฐ.
2. ์ฌ๋ฐฐํฌ ํ๊ฒฝ Memory Leak
์ด์ ์ฅ์ ๋ก ์ง๊ฒฐ๋๋ค.
3. startup latency
MSA ํ๊ฒฝ์์ ์ค์ํด์ง๋ค.
ํต์ฌ ์์ฝ
Java๋ Runtime Dynamic Loading ๊ธฐ๋ฐ
ClassLoader๋ JVM ํต์ฌ ๋ฉ์ปค๋์ฆ
๋ถ๋ชจ ์์ ๋ชจ๋ธ์ ๋ณด์๊ณผ ์์ ์ฑ์ ์ํ ๊ตฌ์กฐ
Spring ๋ด๋ถ๋ Reflection ๊ธฐ๋ฐ
Dynamic Loading์ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง๋ง ์ด์ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํจ๋ค
ClassLoader leak์ ์ค์ ์ด์ ์ฅ์ ์์ธ์ด๋ค
์ค๋ฌด์์๋ โ์ ์ด๋ฐ ๊ตฌ์กฐ์ธ๊ฐ?โ๋ฅผ ์ค๋ช ๊ฐ๋ฅํด์ผ ํ๋ค