Class loader
Java Class Loader์ Dynamic Loading
Java์ ํฐ ํน์ง ์ค ํ๋๋ ๋ฐํ์ ์์ ๋์ ์ผ๋ก ํด๋์ค๋ฅผ ์ฝ์ด์ค๋ Dynamic Loading์ ๋๋ค. ์ด๋ ๋ชจ๋ ํด๋์ค๊ฐ ์ฐธ์กฐ๋๋ ์๊ฐ ๋์ ์ผ๋ก ๋ก๋ ๋ฐ ๋งํฌ๊ฐ ์ด๋ฃจ์ด์ง๋ ๋ฐฉ์์ ๋๋ค. Dynamic Loading์ Load Time Dynamic Loading๊ณผ Runtime Dynamic Loading์ผ๋ก ๋๋ฉ๋๋ค.
Load Time Dynamic Loading
Load Time Dynamic Loading์ ํน์ ํด๋์ค๊ฐ ๋ก๋๋ ๋ ๊ด๋ จ๋ ํด๋์ค๋ค์ ํจ๊ป ๋ก๋ํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ์์ค ์ฝ๋์์ Hello ํด๋์ค๋ String ๊ฐ์ฒด๋ฅผ main() ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, System ๊ฐ์ฒด๋ฅผ ํธ์ถํ๊ณ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ Hello ํด๋์ค๊ฐ ClassLoader์ ์ํด JVM์ผ๋ก ๋ก๋๋ ๋ java.lang.String ํด๋์ค์ java.lang.System ํด๋์ค๊ฐ ๋์์ ๋ก๋๋ฉ๋๋ค.
public class Hello {
public static void main(String[] args) {
System.out.println("Hello EXEM");
}
}Runtime Dynamic Loading
Runtime Dynamic Loading์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์๊ฐ์ ๋์ ์ผ๋ก ๋ก๋ํ๋ ๋ฐฉ์์
๋๋ค. ์๋์ ์์ค ์ฝ๋๋ Hello ํด๋์ค์์ ํน์ ํด๋์ค๋ฅผ ํธ์ถํ๋ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์ด๋ค ํด๋์ค๋ฅผ ๋ก๋ํด์ผ ํ ์ง๋ ์ธ์๋ก ๋์ด์จ ์ดํ์๋ ์ ์ ์์ต๋๋ค. ์ฆ, Class.forName(args[0])๋ฅผ ํธ์ถํ๋ ์๊ฐ์ args[0]์ ํด๋นํ๋ ํด๋์ค๋ฅผ ๋ก๋ํ ์๋ฐ์ ์๋ ์ํฉ์ด ๋ฉ๋๋ค.
public class Hello {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> cl = Class.forName(args[0]);
}
}ClassLoader ์ญํ
ClassLoader๋ JVM ๋ด๋ก ํด๋์ค๋ฅผ ๋ก๋ํ๊ณ ๋งํฌ๋ฅผ ํตํด ์ ์ ํ ๋ฐฐ์นํ๋ ๋ชจ๋์ ๋๋ค. JVM์ ๋์ผํ ํด๋์ค๋ฅผ ์ค๋ณตํด์ ๋ก๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ํด๋์ค ๋ก๋ ์ ์ ํด๋น ํด๋์ค๊ฐ JVM์ ์ด๋ฏธ ๋ก๋๋์ด ์๋์ง๋ฅผ ํ์ธํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค. ์ด ๊ณผ์ ์์ ํด๋์ค๋ฅผ ๊ตฌ๋ณํ๋ ๋ฐฉ๋ฒ์ ํด๋์ค์ ์ด๋ฆ์ ๋๋ค.
ClassLoader๋ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ด ๋ก๋ํ ํด๋์ค์ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ค์์คํ์ด์ค๋ ClassLoader๊ฐ ๋ก๋ํ ํด๋์ค์ ํ ๋ค์์ ์ ์ฅํ๋ฉฐ, ์ด๋ฅผ ํตํด JVM์ ๋์ผํ ํด๋์ค๋ผ๋ ์๋ก ๋ค๋ฅธ ClassLoader๊ฐ ๋ก๋ํ ๊ฒฝ์ฐ ์ค๋ณต ๋ก๋ํ ์ ์์ต๋๋ค.
Class Loader Delegation Model
์ฌ๋ฌ ๊ฐ์ ClassLoader๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ๊ฐ ClassLoader๋ ๋ถ๋ชจ ClassLoader๋ก๋ถํฐ ํด๋์ค๋ฅผ ๋ก๋ํ๋ ์์
์ ์์๋ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด, SystemClassLoader๊ฐ ํด๋์ค๋ฅผ ๋ก๋ํ๋๋ก ์์ฒญ๋ฐ์ผ๋ฉด ExtensionClassLoader์ BootstrapClassLoader๋ฅผ ํตํด ํด๋์ค๋ฅผ ์ฐพ๊ณ , ๋ง์ง๋ง์ผ๋ก ์์ ์ด ๋ก๋๋ฅผ ์๋ํฉ๋๋ค.

Class Loader์ ์ข
๋ฅ
Bootstrap ClassLoader: ๊ฐ์ฅ ์์์ ClassLoader๋ก, JVM ๊ธฐ๋ ์ ๊ฐ์ฅ ๋จผ์ ์์ฑ๋๋ฉฐ ๊ธฐ๋ณธ Java API๋ฅผ ๋ก๋ํฉ๋๋ค.
Extension ClassLoader:
Bootstrap ClassLoader๋ฅผ ๋ถ๋ชจ๋ก ํ๋ฉฐ, ํ์ฅ ํด๋์ค๋ค์ ๋ก๋ํฉ๋๋ค.Application ClassLoader: ์ฌ์ฉ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ClassLoader๋ก,
CLASSPATH์ ์์นํ ํด๋์ค๋ฅผ ๋ก๋ํฉ๋๋ค.User Defined ClassLoader: ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ์ฌ ์ฌ์ฉํ๋ ClassLoader์ ๋๋ค.
Class Loader์ ๋์ ๊ณผ์
Class Loader์ ๋์ ๊ณผ์ ์ ํฌ๊ฒ ์ธ ๋จ๊ณ๋ก ๋๋ฉ๋๋ค: ๋ก๋, ๋งํฌ, ์ด๊ธฐํ.
๋ก๋(Loading):
ํด๋์ค๋ฅผ ํ์ผ ์์คํ ์ด๋ ๋คํธ์ํฌ ๋ฑ์์ ๊ฐ์ ธ์ JVM ๋ด๋ก ๋ก๋ํฉ๋๋ค.
์: ํ์ผ ํํ์ ํด๋์ค๋ฅผ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ๋ํ์ฌ JVM์ ๋ก๋ํฉ๋๋ค.
์์ :
public class CustomClassLoader extends ClassLoader { @Override public Class<?> findClass(String name) throws ClassNotFoundException { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { // ํด๋์ค ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๋ก์ง ๊ตฌํ return new byte[0]; } }
๋งํฌ(Linking):
๊ฒ์ฆ(Verification): ํด๋์ค ํ์ผ์ ์ ํจ์ฑ ๊ฒ์ฆ.
Final ํด๋์ค๊ฐ ์ํผํด๋์ค๊ฐ ์๋์ง ํ์ธ.
Final ํด๋์ค๊ฐ ์ค๋ฒ๋ผ์ด๋๋์ง ์์๋์ง ํ์ธ.
์ถ์ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ตฌํ๋ ์ธํฐํ์ด์ค์ ๋ชจ๋ ๋ฉ์๋๊ฐ ๊ตฌํ๋์๋์ง ํ์ธ.
Constant Pool์ ์ ๋ณด๊ฐ ์ ํฉ์ฑ์ด ๋ง๋์ง ๊ฒ์ฆ.
๋ฐ์ดํธ ์ฝ๋์ ์ ํฉ์ฑ ๋ฐ ์์ ์ฑ์ ๊ฒ์ฆ.
์ค๋น(Preparation): ํด๋์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๊ธฐ๋ณธ ๊ฐ ์ค์ .
๊ธฐ๋ณธ ๋ณ์ ํ์ ๋ณ๋ก ์ด๊ธฐ๊ฐ์ ์ค์ ํฉ๋๋ค.
์: int๋ 0, float๋ 0.0f, ์ฐธ์กฐํ์ null ๋ฑ.
ํด๊ฒฐ(Resolution): ์์ง์ ์ฐธ์กฐ๋ฅผ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ก ๋ณํํฉ๋๋ค.
Constant Pool์ ์๋ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉ์๋, ํ๋์ ์์ง์ ์ฐธ์กฐ๋ฅผ ์ง์ ์ฐธ์กฐ๋ก ๋ณํํฉ๋๋ค.

Class Loader Work ์ด๊ธฐํ(Initialization):
ํด๋์ค ๋ณ์๋ฅผ ์ ์ ํ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๊ณ ,
<clinit>()๋ฉ์๋๋ฅผ ํตํด ์ด๊ธฐํ ์์ ์ ์ํํฉ๋๋ค.ํด๋์ค์ ์ด๊ธฐํ ๋จ๊ณ๋ ํด๋น ํด๋์ค์ ์ง๊ณ ์ํผํด๋์ค๊ฐ ์ด๊ธฐํ๋์ง ์์์ผ๋ฉด ๋จผ์ ์ด๊ธฐํํ๊ณ , ๊ทธ ํ ํด๋์ค์
<clinit>()๋ฉ์๋๋ฅผ ์ํํ์ฌ ์ด๊ธฐํ๋ฅผ ์๋ฃํฉ๋๋ค.์:
public class Example { static { /* ์ด๊ธฐํ ๋ธ๋ก */ } }
Class Sharing
Java 5๋ถํฐ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ผ๋ก, JVM์ ๊ฐ ํ๋ก์ธ์ค ์ฌ์ด์์ ๋ก๋๋ ํด๋์ค๋ฅผ ๊ณต์ ํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ JVM์ ๊ธฐ๋ ์๊ฐ์ ์ค์ด๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ JVM์ด ๋ก๋ํ ํด๋์ค๋ฅผ ๋ค๋ฅธ JVM์ด ๊ณต์ ํ์ฌ ์ฌ์ฌ์ฉํฉ๋๋ค.
Class Sharing์ ๋์ ๋ฐฉ์
ํ JVM์ด
rt.jar์ ๊ฐ์ ๊ธฐ๋ณธ ํด๋์ค ํ์ผ๋ค์ ๋ฏธ๋ฆฌ ๋ก๋ํด ๋์ผ๋ฉด, ๋ค๋ฅธ JVM์ ์ด ๋ก๋๋ ํด๋์ค ํ์ผ๋ค์ ๊ณต์ ํ์ฌ ์ฌ์ฉํฉ๋๋ค.์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ณ JVM ๊ธฐ๋ ์๊ฐ์ ๋จ์ถ์ํค๋ ๋ฐ ๊ธฐ์ฌํฉ๋๋ค.
WAS์์์ Class Loader ๊ตฌ์ฑ
Web Application Server(WAS)์์ ClassLoader๋ ๋ ๋ฆฝ์ ์ด๋ฉด์๋ ์ฌ๋ฌ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ ํด๋์ค๊ฐ ์์ด์ง ์๋๋ก ํ๋ฉฐ, ๋ชจ๋ ๊ฐ ํด๋์ค ๊ณต์ ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.

WebLogic๊ณผ JEUS์ Class Loader ๊ตฌ์กฐ
WebLogic: SystemClassLoader๊ฐ ์ต์์ ClassLoader๋ก, EJB ๋ชจ๋๊ณผ WEB ๋ชจ๋์ ๊ด๊ณ๋ฅผ ๊ณ ๋ฆฝ์์ผ ๊ตฌ์ฑํฉ๋๋ค.
EJB ๋ชจ๋์ WEB ๋ชจ๋๋ณด๋ค ์์์ ์์นํ๋ฉฐ, ์๋ก ๋ ๋ฆฝ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ ์งํฉ๋๋ค.
JEUS: SharedClassLoader์ IsolatedClassLoader ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
SharedClassLoader: ์ต๋ํ ํด๋์ค๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ์์ผ๋ก, EJB ๋ชจ๋์ด Redeploy๋๋ฉด ๊ด๋ จ๋ ๋ชจ๋ WEB ๋ชจ๋์ ClassLoader๋ฅผ ๋ค์ ์์ฑํด์ผ ํ๋ ๋จ์ ์ด ์์ต๋๋ค.
IsolatedClassLoader: ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ง๋ค ๊ณ ๋ฆฝ๋ ClassLoader ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ฑ๋ฅ์์ ์ด์ ์ด ์์ต๋๋ค.
Class Loader ์ต์
-Xbootclasspath: Bootstrap ClassLoader์ ๊ฒ์ ๊ฒฝ๋ก ์ค์ .
-Djava.ext.dirs: Extension ClassLoader์ ๊ฒ์ ๊ฒฝ๋ก ์ค์ .
-cp, -classpath: SystemClassLoader์ ๊ฒ์ ๊ฒฝ๋ก ์ค์ .
-XX:+TraceClassLoading: ๋ก๋๋ ๋ชจ๋ ํด๋์ค๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋๋ฒ๊น ์ต์ .
-XX:+TraceClassUnloading: ์ธ๋ก๋๋ ๋ชจ๋ ํด๋์ค๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ต์ .
-XX:+TraceClassLoadingPreorder: ์ฐธ์กฐ ์์๋๋ก ๋ก๋๋ ๋ชจ๋ ํด๋์ค๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ต์ .
-XX:+TraceClassResolution: Constant Pool์ ํด๊ฒฐ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ต์ .
-XX:+TraceLoaderConstraints: ClassLoader์ ์ ์ฝ ์กฐ๊ฑด์ ๋ํ ๊ธฐ๋ก์ ๋ณด์ฌ์ฃผ๋ ์ต์ .
-XX:+LazyBootClassLoader: Bootstrap ClassLoader์ Classpath์ ์๋ ํ์ผ๋ค์ Lazy ๋ฐฉ์์ผ๋ก ๋ก๋ํ๋ ์ต์ .
JVM ์ต์
์์
๊ธฐ๋ณธ Java API๋ณด๋ค ๋จผ์ ์ฝ์ด๋ค์ผ ๊ฒฝ๋ก๋ ํ์ผ์ ์ค์ :
java -Xbootclasspath/p:<๊ฒฝ๋ก> MyClassSystemClassLoader์ ๊ฒ์ ๊ฒฝ๋ก ์ค์ :
java -cp <๊ฒฝ๋ก> MyClassํด๋์ค ๋ก๋ ๋ฐ ์ธ๋ก๋ ์ถ์ :
java -XX:+TraceClassLoading -XX:+TraceClassUnloading MyClass
User Defined ClassLoader ์์
์ฌ์ฉ์๊ฐ ์ ์ํ ClassLoader๋ฅผ ํตํด ํด๋์ค ๋ก๋ ๋์์ ์ปค์คํฐ๋ง์ด์งํ ์ ์์ต๋๋ค.
public class CustomClassLoader extends ClassLoader {
@Override
public Class<?> findClass(String name) throws ClassNotFoundException {
byte
[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// ํด๋์ค ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๋ก์ง ๊ตฌํ
return new byte[0];
}
}์ด์ ๊ฐ์ด Java์ ClassLoader์ Dynamic Loading์ ๋ํด ์ดํดํ๊ณ , ์ด๋ฅผ ํ์ฉํ ๋ค์ํ ์ค์ ๊ณผ ์์ ๋ฅผ ํตํด ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค. ClassLoader์ ๋์ ์๋ฆฌ์ ๋ค์ํ ์ต์ ์ ์์งํจ์ผ๋ก์จ, Java ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์ ์ฐ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
Last updated