맨위로가기

자바 클래스로더

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

자바 클래스 로더는 자바 가상 머신에서 클래스를 로드하는 역할을 담당하며, 자바 언어로 작성되어 있어 자바 가상 머신의 세부 사항을 몰라도 자신만의 클래스 로더를 만들 수 있다. 자바 가상 머신은 부트스트랩, 확장, 시스템 클래스 로더의 세 가지 클래스 로더를 사용하며, 사용자는 시스템 클래스 로더를 대체하거나 클래스 로더의 연결 구조를 사용자 정의할 수 있다. 이러한 사용자 정의를 통해 런타임에 클래스를 로드/언로드하거나, 바이트코드를 변경하는 등의 다양한 기능을 구현할 수 있다. 또한, 자바 엔터프라이즈 환경에서는 애플리케이션 간의 격리를 위해 클래스 로더를 계층적으로 배치하여 사용하며, JAR 지옥과 같은 클래스 로딩 관련 문제 해결을 위해 OSGi, Java Module System과 같은 기술들이 개발되었다.

더 읽어볼만한 페이지

  • 자바 (프로그래밍 언어) - 자바 애플릿
    자바 애플릿은 웹 페이지에서 실행되는 자바 기반 프로그램으로, 웹 상호작용성을 높였으나 기술적 문제와 웹 표준 기술 발전에 따라 쇠퇴하여 사용이 중단되었다.
  • 자바 (프로그래밍 언어) - 자바FX
    JavaFX는 자바 기반의 UI 구축 플랫폼으로, 다양한 플랫폼을 지원하며 풍부한 UI 기능들을 제공하고, Java 8부터 JDK에 포함되었다가 JDK 11부터 분리되어 관리된다.
  • 자바 플랫폼 - 블루레이
    블루레이 디스크는 DVD 후속 매체로, 청색 레이저를 사용하여 고화질 영상과 음향을 제공하며 HD DVD와의 경쟁 후 고밀도 광디스크 표준으로 자리 잡았으나 스트리밍 서비스 성장으로 녹화용 디스크 생산이 중단되는 추세이다.
  • 자바 플랫폼 - 자바 플랫폼, 마이크로 에디션
    자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
자바 클래스로더
개요
종류자바 가상 머신의 하위 시스템
역할클래스 로딩 및 초기화
관련 기술리플렉션
바이트코드 조작
상세 정보
설명자바 클래스를 자바 가상 머신 (JVM)으로 로드하는 역할을 담당
특징동적 클래스 로딩 지원
클래스 격리 및 보안 기능 제공
사용자 정의 클래스 로더를 통한 확장 가능
클래스 로더 종류
부트스트랩 클래스 로더JVM 자체에 내장된 클래스 로더 (java.lang.ClassLoader의 최상위 클래스 로더)
확장 클래스 로더JRE 확장 라이브러리 로딩
시스템 클래스 로더애플리케이션 클래스패스에 있는 클래스 로딩
사용자 정의 클래스 로더개발자가 직접 구현하는 클래스 로더
동작 방식
로딩 과정1. 로딩 (Loading): 클래스 파일로부터 클래스 정보를 읽어옴.
2. 링크 (Linking):
검증 (Verification): 클래스 파일의 무결성 검사.
준비 (Preparation): 클래스 변수를 위한 메모리 할당 및 기본값 설정.
해결 (Resolution): 심볼릭 참조를 실제 참조로 대체.
3. 초기화 (Initialization): 클래스 변수를 초기화하고, static 블록 실행.
위임 모델 (Delegation Model)클래스 로딩 요청을 상위 클래스 로더에게 위임
부모 클래스 로더부터 클래스를 찾고, 없으면 자신이 직접 로딩
가시성 (Visibility)클래스 로더는 자신이 로딩한 클래스만 볼 수 있음
다른 클래스 로더가 로딩한 클래스에는 접근 불가
활용 예시
웹 애플리케이션 서버 (WAS)각 웹 애플리케이션마다 독립적인 클래스 로더를 사용하여 클래스 격리
동적 배포 및 언배포 지원
플러그인 아키텍처새로운 플러그인을 동적으로 로딩하여 애플리케이션 기능 확장
플러그인 간의 충돌 방지
코드 핫스왑 (HotSwap)애플리케이션 실행 중에 코드 변경 사항을 즉시 적용
개발 생산성 향상
참고 자료
외부 링크The basics of Java class loaders - JavaWorld
Internals of Java Class Loading - onjava.com
Understanding Extension Class Loading - java.sun.com
Classes and class loading - ibm.com

2. 클래스 로드 과정

각 자바 클래스는 클래스 로더에 의해 로드되어야 한다.[2] 자바 프로그램은 외부 라이브러리(프로그램 작성자가 아닌 다른 사람이 개발하고 제공하는 라이브러리)를 이용할 수 있으며, 이 외부 라이브러리 자체도 여러 라이브러리로 구성될 수 있다.

JVM이 시작되면 다음 세 개의 클래스 로더가 사용된다.[3][4]:


  • 부트스트랩 클래스 로더
  • 확장 클래스 로더
  • 시스템 클래스 로더

2. 1. 부트스트랩 클래스 로더

부트스트랩 클래스 로더는 핵심 자바 라이브러리를 `/lib` 디렉터리에서 로드한다.[3] 이 클래스 로더는 JavaVM의 핵심 부분이며, 네이티브 코드로 작성되어 있다.

2. 2. 확장 클래스 로더

확장 클래스 로더는 확장 디렉터리(<JAVA_HOME>/lib/ext영어 또는 `java.ext.dirs` 프로퍼티로 지정된 다른 디렉터리)에 있는 코드를 로드한다.[3][4] 이는 `sun.misc.Launcher$ExtClassLoader` 클래스로 구현되어 있다.[3][4]

2. 3. 시스템 클래스 로더

시스템 클래스 로더는 `java.class.path`, 즉 시스템 환경 변수 `클래스패스`에 있는 클래스를 로드한다. 이는 `sun.misc.Launcher$AppClassLoader` 클래스로 구현되어 있다.[3][4]

3. 사용자 지정 클래스 로더

자바 클래스 로더는 자바로 작성된다. 그러므로 자바 가상 머신의 세부적인 부분을 이해하지 않아도 자신만의 클래스 로더를 작성하는 것이 가능하다. 모든 자바 클래스 로더는 부모 클래스 로더를 가지며, 부모 클래스 로더는 새로운 클래스 로더가 인스턴스화되거나 가상 머신의 시스템 기본 클래스 로더로 설정된다. 기본적으로 사용자의 클래스는 모두 시스템 클래스 로더에서 로드되지만, 사용자가 정의한 클래스 로더로 대체하거나, 클래스 로더의 연결 구조를 사용자 정의하는 것도 가능하다.[5]

3. 1. 사용자 정의 클래스 로더의 활용

사용자 정의 클래스 로더를 사용하면 다음과 같은 작업이 가능하다.

  • 클래스의 로드/언로드를 런타임에 수행할 수 있다. 예를 들어, 런타임에 HTTP 리소스에서 라이브러리를 동적으로 로드할 수 있다.[5] 이는 다음 용도에서 중요한 기능이다.
  • * 스크립트 언어(동적 프로그래밍 언어)의 구현. 예를 들어 Jython이나 Groovy 등.
  • * JavaBeans 빌더의 이용.
  • * 사용자 정의 확장성(확장 기능)을 가능하게 한다.
  • * 여러 이름 공간 간의 상호 작용을 가능하게 한다. 이는 CORBA/RMI의 기초가 된다.
  • Java 바이트코드가 로드되는 방법을 변경한다 (예를 들어, 암호화된 Java 클래스를 로드한다[5]).
  • 로드된 바이트코드를 변경한다 (예를 들어, 관점 지향 프로그래밍에서 사용하면, 로드 시의 끼워넣기).[5]

4. Jakarta EE에서의 클래스 로더

Jakarta EE(구 Java EE)의 애플리케이션 서버는 통상 서버에 배치된 WAR나 EAR 아카이브를 계층적으로 배치된 클래스 로더로 로드하여, 애플리케이션 간 격리를 수행한다. 소위 "서블릿 컨테이너"는 통상 복수의 클래스 로더를 이용하여 구현된다.[2][6]

5. JAR 지옥 (JAR Hell)

'''JAR 지옥'''은 클래스 로딩이 예상대로 이루어지지 않는 상황을 가리키는 용어로, DLL 지옥과 유사하다.[7] JAR 지옥은 주로 동일한 라이브러리의 여러 버전이 사용되거나, 여러 라이브러리가 서로 다른 버전의 동일한 라이브러리에 의존하거나, 복잡한 클래스 로더 구조로 인해 발생한다.

5. 1. JAR 지옥 발생 상황

DLL 지옥과 비슷한 용어로 '''JAR 지옥'''이라는 말이 있는데, 이는 클래스 로딩이 예상대로 이루어지지 않는 상황 전반을 가리켜 사용된다.[7]

JAR 지옥은 다음과 같은 상황에서 발생한다.

  • Java 애플리케이션 개발 및 배포 시, 동일한 라이브러리의 여러 버전이 동시에 사용 가능하게 된 경우. 이 경우 처리 시스템은 오류를 발생시키지 않고 단순히 어느 한쪽의 라이브러리에서만 클래스를 로드한다.
  • 두 개의 라이브러리 A와 B (또는 애플리케이션 A와 그것이 사용하는 라이브러리 B)가 서로 다른 라이브러리 C의 다른 버전을 각각 요구하는 경우. 라이브러리 C의 각 버전에서 클래스 이름이 변경되지 않는다면, 라이브러리 C의 각 버전을 하나의 클래스 로더로 동시에 로드하는 방법은 존재하지 않는다.
  • Java 프로그램에서 단일 클래스 로더뿐만 아니라, 중첩되어 작동하는 여러 개의 클래스 로더를 사용하는 경우. 별도의 클래스 로더에 의해 로드된 클래스는 복잡하게 상호 작용하지만, 개발자가 그 기전을 충분히 이해하지 못하는 경우, 불가해한 오류나 버그가 발생한다.[8]

5. 2. JAR 지옥 해결 노력

OSGi 얼라이언스는 Java ME, Java SE, Jakarta EE 등에서 JAR 지옥을 해결하기 위한 모듈 방식 프레임워크를 개발하고 있다. (1998년 JSR 8부터 시작)[7] 이는 Manifest file|매니페스트 파일|JAR 매니페스트영어에 작성된 메타 데이터를 사용하여 JAR 파일(''번들''이라고 함)을 패키지 단위로 조작하는 것이다. 번들은 패키지를 내보내거나 가져오거나, 패키지를 비공개로 유지할 수 있으며, 이를 통해 기본적인 모듈화와 버전 관리된 종속성 관리가 가능하다.

JAR 지옥에 대한 개선책으로, 2005년에 Java Community Process에 의한 JSR 277 제정이 시작되었고, 그 결과 "Java Module System"이 정의되었다. 이는 배포 형식, 모듈의 버전 체계, 공통 모듈 저장소(.NET Framework의 Global Assembly Cache와 유사한 목적)를 Java에 도입하는 것을 목표로 했지만, 버전 관리 문제 등으로 논쟁이 일어났다.[9] 2008년 12월, Sun은 JSR 277을 보류하기로 발표했다.[10] 이후 JSR 376 Java Platform Module System|자바 플랫폼 모듈 시스템영어이 Java 9에 정식으로 도입되었다.[11] 2017년에 출시된 Java 9에는 "Java Platform Module System"이라고 하는 모듈형 소프트웨어 지원이 포함되어 있으며, module-info.java 파일에 의해 소스 레벨에서 제어된다. 이는 OSGi 아키텍처와는 다른 철학을 따르며, 하위 호환 가능한 방식으로 Java 런타임 환경에 모듈성을 제공하고, JRE가 제공하는 클래스를 로드하는 기본 메커니즘을 사용한다. 그러나 다른 버전의 라이브러리 공존을 제어하는 기능은 제공하지 않으므로 JAR 지옥 문제에 대한 접근 방식으로는 적합하지 않다.[12]

참조

[1] 웹사이트 The basics of Java class loaders http://www.javaworld[...] JavaWorld 2008-01-26
[2] 웹사이트 Internals of Java Class Loading http://www.onjava.co[...] onjava.com 2009-10-02
[3] 웹사이트 Understanding Extension Class Loading http://java.sun.com/[...] java.sun.com 2008-01-26
[4] 웹사이트 Classes and class loading http://www-128.ibm.c[...] ibm.com 2008-01-26
[5] 웹사이트 Cracking Java byte-code encryption http://www.javaworld[...] javaworld.com 2008-01-26
[6] 웹사이트 J2EE Class Loading Demystified http://www-128.ibm.c[...] ibm.com 2008-01-26
[7] 링크 http://incubator.apa[...]
[8] Internet Archive クラスローダーとJ2EEパッケージング戦略を理解する: 第2回「クラスローダーを理解する - シングルトンがシングルトンでなくなる日」 https://web.archive.[...] IBM
[9] InfoQ JSR 277論争、バージョニングで再燃 https://www.infoq.co[...]
[10] 링크 http://www.osgi.org/[...]
[11] TECH+ イマドキのJava徹底入門(4) Javaのモジュールシステムを理解しよう(その1) https://news.mynavi.[...]
[12] 웹사이트 Java 9, OSGi and the Future of Modularity (Part 1) https://www.infoq.co[...] 2024-02-25
[13] 웹인용 The basics of Java class loaders http://www.javaworld[...] JavaWorld 2008-01-26
[14] 웹인용 Internals of Java Class Loading http://www.onjava.co[...] onjava.com 2009-10-02
[15] 웹인용 Understanding Extension Class Loading http://java.sun.com/[...] java.sun.com 2009-12-08
[16] 웹인용 Classes and class loading http://www.ibm.com/d[...] ibm.com 2008-01-26
[17] 문서 These libraries are stored in JAR (파일 포맷)|Jar files called ''rt.jar'', ''core.jar'', ''server.jar'', etc.
[18] URL http://docs.oracle.c[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com