hyeonga_code

JVM_02_JVM 구성 요소_클래스 로더 Class Loader 본문

JVM

JVM_02_JVM 구성 요소_클래스 로더 Class Loader

hyeonga 2024. 5. 8. 06:59
반응형

JVM 구성 요소

- Class Loader
    - Bootstrap Class Loader
    - Extension Class Loader
    - System/Application Class Loader
- Execution Engine
- Runtime Data Area

 

클래스 로더 Class Loader

자바 애플리케이션을 실행할 때 필요한 .class 파일을 로드합니다.
파일 시스템이나 네트워크 등에서 클래스를 찾아 읽고 JVM의 런타임 데이터 영역에 배치합니다.

자바의 동적 로딩을 가능하게 하는 중요한 요소입니다.
자바 프로그램이 실행되는 동안에도 새로운 클래스를 필요에 따라 찾아 로드할 수 있게 합니다.

1. 부트스트랩 클래스 로더 Bootstrap Class Loader

JVM이 가장 먼저 실행하는 최상위 클래스 로더입니다.
자바 런타임 환경의 핵심 클래스를 로드합니다.
Java의 기본 클래스 라이브러리를 로드합니다.

java.lang.*
java.util.*

 

특징
- 구현:
일반적으로 네이티브 코드로 구현되어 JVM 자체의 일부로서 동작합니다.
Java 언어로 작성되지 않았으므로 Java 코드에서 직접 접근할 수 없습니다.
- 로딩 범위:
JAVA_HOME/jre/lib 혹은 JAVA_HOME/lib에 위치한 핵심 Java 라이브러리들을 로드합니다.
rt.jar: 런타임 환경에서 필요한 대부분의 클래스를 포함
- 부모와의 관계:
부트스트랩 클래스 로더는 클래스 로더 계층 구조에서 최상위에 위치하므로 실질적인 부모 클래스 로더를 가지고 있지 않습니다.
- 보안:
핵심 Java API를 로드하기 때문에 JVM의 보안을 강화하는 중요한 역할을 합니다.
안전하지 않은 코드가 핵심 Java 클래스들을 오염시키는 것을 방지합니다.
- 확장성:
부트스트랩 클래스 로더 다음에는 확장 클래스 로더와 시스템/애플리케이션 클래스 로더] 위치하여 사용자 정의 클래스와 다른 자바 아카이브 파일을 로드하는데 사용됩니다.

 

자바 애플리케이션을 실행할 때 필요한 .class 파일을 로드합니다.
파일 시스템이나 네트워크 등에서 클래스를 찾아 읽고 JVM의 런타임 데이터 영역에 배치합니다.

자바의 동적 로딩을 가능하게 하는 중요한 요소입니다.
자바 프로그램이 실행되는 동안에도 새로운 클래스를 필요에 따라 찾아 로드할 수 있게 합니다.

 

 

 

클래스 로더의 구성

부트스트랩 클래스 로더 Bootstrap Class Loader

JVM이 가장 먼저 실행하는 최상위 클래스 로더입니다.
자바 런타임 환경의 핵심 클래스를 로드합니다.
Java의 기본 클래스 라이브러리를 로드합니다.
java.lang.* java.util.*

 

특징

  • 구현:
    일반적으로 네이티브 코드로 구현되어 JVM 자체의 일부로서 동작합니다.
    Java 언어로 작성되지 않았으므로 Java 코드에서 직접 접근할 수 없습니다.
  • 로딩 범위:
    JAVA_HOME/jre/lib 혹은 JAVA_HOME/lib에 위치한 핵심 Java 라이브러리들을 로드합니다.
    rt.jar: 런타임 환경에서 필요한 대부분의 클래스를 포함
  • 부모와의 관계:
    부트스트랩 클래스 로더는 클래스 로더 계층 구조에서 최상위에 위치하므로 실질적인 부모 클래스 로더를 가지고 있지 않습니다.
  • 보안:
    핵심 Java API를 로드하기 때문에 JVM의 보안을 강화하는 중요한 역할을 합니다.
    안전하지 않은 코드가 핵심 Java 클래스들을 오염시키는 것을 방지합니다.
  • 확장성:
    부트스트랩 클래스 로더 다음에는 확장 클래스 로더시스템/애플리케이션 클래스 로더가 위치하여 사용자 정의 클래스와 다른 자바 아카이브 파일을 로드하는데 사용됩니다.

 

확장 클래스 로더 Extension Class Loader

JRE의 확장 디렉터리에 있는 클래스를 로드합니다.
표준 핵심 Java API외의 추가적인 API를 로드합니다.
Java의 플러그 앤 플레이 기능을 가능하게 합니다.
Java 플랫폼의 일부로 제공되지 않는 확장 라이브러리를 로드합니다.
암호화 확장 XML 처리 라이브러리 JRE_HOME/lib/ext 폴더 내의 파일

 

특징

  • 로드 경로:
    JAVA_HOME/jre/lib/ext 혹은 JAVA_HOME/lib/ext에 위치한 라이브러리를 로드합니다.
    모든 Java 애플리케이션에서 사용할 수 있도록 자동으로 로드됩니다.
  • 부모 클래스 로더:
    부트스트랩 클래스 로더를 상위 클래스 로더로 가집니다.
    어떤 클래스를 로드하려고 할 때 먼저 부트스트랩 클래스 로더에 의해 로드되지 않았는지 확인하고, 로드가 필요한 경우에만 확장 클래스 로더가 동작합니다.
  • 보안:
    Java의 보안 모델을 강화합니다.
    무분별한 코드 실행을 방지하기 위해 클래스 로드 전에 여러 보안 검사를 수행합니다.
  • 사용법:
    특정 애플리케이션에서 공통적으로 사용될 수 있는 라이브러리를 확장 디렉토리에 배치하여 모든 Java 애플리케이션에서 쉽게 사용할 수 있도록 합니다.

 

플러그 앤 플레이

Java 플랫폼의 확장성과 유연성을 크게 향상시키는 특징을 가집니다.
Java에서 동적으로 라이브러리를 로드하고 통합할 수 있는 능력을 의미합니다.
Java 애플리케이션은 런타임에 추가적인 리소스나 기능을 로드하여 확장할 수 있습니다.

구현하는 매커니즘

1. 클래스 로더
애플리케이션 실행 중에 클래스를 동적으로 로드할 수 있습니다.

2. 리플렉션 Reflection
리플렉션 API를 통해 런타임에 프로그램의 구조를 분석하고 해당 클래스의 메소드를 호출하거나 속성을 변경하는 등의 작업을 가능하게 합니다.

3. JavaBeans
재사용이 가능한 컴포넌트 모델을 제공합니다.
이를 통해 애플리케이션을 동적으로 조립할 수 있습니다.

4. 서비스 제공 인터페이스 Service Provider Interface (SPI)
서비스 제공자가 자신의 구현을 시스템에 플러그인으로 제공할 수 있게 하는 프레임워크입니다.
JDBC API: 데이터베이스 드라이버를 SPI를 통해 플러그인으로 로드하여 Java 애플리케이션에서 사용할 수 있습니다.

5. OSGi (Open Service Gateway initiative)
더욱 진보된 동적 모듈 시스템을 제공합니다.
이 프레임워크는 애플리케이션의 라이프사이클 관리, 서비스 등록, 의존성 관리 등을 동적으로 처리할 수 있게 합니다.

 

시스템/애플리케이션 클래스 로더 System/Application Class Loader

 

애플리케이션 클래스패스에 있는 클래스를 로드합니다.
개발자가 작성한 클래스와 라이브러리를 처리합니다.
요청 받은 클래스를 먼저 부모인 확장 클래스 로더에게 위임하고, 찾지 못하는 경우 자신이 직접 로드합니다.
로드한 클래스에 대한 네임스페이스를 독립적으로 관리하여 다른 클래스 로더가 로드한 동일 이름의 클래스와 충돌하지 않습니다.
클래스 파일 뿐만 아니라 다양한 리소스 파일을 로드할 수 있는 기능을 제공합니다.

특징

  • 1. 로드 경로:
    CLASSPATH 환경 변수에 지정된 경로에서 클래스와 리소스를 로드합니다.
    .class파일이나 .jar 파일이 포함될 수 있습니다.
    CLASSPATH : Java 애플리케이션의 실행 시 필요한 클래스 파일과 패키지의 위치를 JVM에 알려주는 환경 변수
  • 2. 부모 클래스 로더:
    확장 클래스 로더를 부모 클래스 로더로 가집니다.
    확장 클래스 로더에 의해 클래스가 로드되지 않은 경우 시스템 클래스 로더에서 클래스를 로드합니다.
  • 3. 구현:
    Java에서 구현되었습니다.
    java.lang.ClassLoader 클래스를 확장하여 구현됩니다.
    개발자가 필요에 따라 시스템 클래스 로더의 행동을 재정의하거나 사용자 정의 클래스 로더를 만들 수 있습니다.
  • 4. 보안:
    Java 보안 모델의 일부입니다.
    로드되는 각 클래스에 대해 보안 검사를 수행합니다.
    악성 코드가 시스템 자원에 접근하는 것을 방지합니다.
  • 5. 기능:
    대부분의 애플리케이션 클래스와 리소스가 시스템 클래스 로더를 통해 로드됩니다.
    사용자가 직접 클래스 로더를 구현하는 경우 종종 시스템 클래스 로더를 기반으로 확장하여 구현합니다.

 

시스템 클래스 로더 System Class Loader

Java의 표준 클래스 로딩 매커니즘의 일부입니다.
일반적으로 Java 애플리케이션에서 사용자 정의 클래스와 서드 파티 라이브러리를 로드하는데 사용됩니다.

 

 

애플리케이션 클래스 로더 Application Class Loader

특정 컨텍스트나 Java 환경에서 사용자 정의 로딩 로직이 필요한 경우 사용됩니다.
사용자가 직접 정의한 클래스 로더를 구현할 때 해당 로더를 의미합니다.
특별한 매커니즘이 필요한 경우(클래스 격리가 필요하거나 특정 리소스만 로딩하고자 하는 경우)사용할 수 있습니다.
java.lang.ClassLoader 를 상속받아 새로운 클래스 로더를 구현하여 이를 통해 로딩 정책을 직접 제어할 수 있습니다.

 

 

시스템 클래스 로더와 애플리케이션 클래스패스 사이의 관계

Java 애플리케이션의 실행과 로딩 매커니즘에 중요한 역할을 합니다.
이 둘의 상호작용은 애플리케이션에서 필요한 클래스와 리소스를 효율적이고 로드하고 관리하는 기반을 제공합니다.

시스템 클래스 로더애플리케이션 클래스패스를 기반으로 클래스를 로드하는데 클래스패스에 지정된 디렉토리, JAR 파일, ZIP 파일 등에서 클래스 파일들을 찾아 JVM이 사용할 수 있도록 메모리에 로드합니다.

시스템 클래스 로더는 클래스패스에 명시된 경로를 순회하면서 필요한 클래스 파일을 찾고 로드하여 애플리케이션의 실행에 필수적인 클래스들을 사용할 수 있게 합니다.

클래스 패스에 지정된 위치에서 애플리케이션 리소스 (프로퍼티 파일, 설정 파일) 등을 로드하는데 사용됩니다.

 

Application Classpath 

Java 애플리케이션에서 사용하는 클래스 파일과 리소스가 위치한 경로를 지정하는 환경 설정입니다.
Java 런타임 환경과 클래스 로더는 필요한 클래스 파일과 리소스를 로드할 수 있습니다.
클래스패스 설정은 Java 애플리케이션의 실행과 개발에 있어 필수적인 요소입니다.

애플리케이션 클래스패스는 클래스와 리소스의 위치를 Java 컴파일러(javac) 나 JVM에게 사용자 정의 클래스, 라이브러리, 기타 리소스의 위치를 알려주는 역할을 합니다.

런타임 중에 클래스를 동적으로 로드할 수 있도록 지원하여 유연성과 확장성을 크게 향상시킵니다.
애플리케이션을 다른 환경으로 이동할 때 클래스패스 설정만 변경하면 동일한 애플리케이션을 다른 환경에서도 실행할 수 있는 환경 독립성을 보장합니다.

 

 

서드 파티 라이브러리 Third-party library 

애플리케이션 개발에서 외부 소스나 다른 개발자 그룹에 의해 생성되고 유지 관리되는 코드 라이브러리입니다.
개발 과정에서 필요한 기능을 제공하거나 특정 작업을 수행하기 위해 추가적인 기능성을 애플리케이션에 통합할 수 있는 방법을 제공합니다.
개발 시간을 절약하고 코드의 안정성을 높이며, 전문 기술을 애플리케이션에 쉽게 통합할 수 있도록 합니다.

  • 기능 확장
    특정 기능을 애플리케이션에 빠르게 추가할 수 있습니다.
    데이터베이스 관리 이미지 처리 복잡한 수학 연산 API 통합 라이브러리
  • 개발 시간 및 비용 절감
    이미 검증된 라이브러리를 사용함으로 필요한 기능을 즉시 구현할 수 있습니다.
    프로젝트의 전체적인 개발 시간과 비용을 줄일 수 있습니다.
  • 품질과 안정성
    일반적으로 넓은 범위의 개발자에 의해 사용되고 테스트되므로 높은 품질과 안전성을 보장합니다.
    대규모 커뮤니티에 의해 지원되고 있으므로 버그 수정과 개선이 지속적으로 이루어집니다.
  • 문서와와 지원
    잘 구성된 문서와 사용자 가이드를 지원합니다.
    활발한 사용자 커뮤니티 또는 전문 지원 옵션이 제공될 수 있어 개발 중에 발생할 수 있는 문제를 해결합니다.
  • 라이센스 고려사항
    해당 라이브러리의 라이선스 조건을 이해하고 준수하는 것이 중요합니다.
    일부 라이센스는 상용 프로젝트에 제한을 두거나 의무적으로 소스 코드를 공개하도록 요구할 수 있습니다.
  • 보안 리스크
    외부 라이브러리를 사용할 때에는 보안 취약점을 주의해야 합니다.
    사용하는 라이브러리가 최신 상태인지 알려진 보안 취약점이 없는지 주기적으로 검토해야 합니다.

 

사용자 정의 클래스 로더를 구현할 때의 고려 사항

  • 1) 클래스 로딩의 위임 모델 이해
    일반적으로 클래스 로더는 요청받은 클래스 로드 요청을 부모 로더에게 먼저 위임합니다.
  • 2) 격리
    서로 다른 애플리케이션 또는 모듈 간에 클래스 격리를 제공하기 위해서는 각각의 애플리케이션에 대해 독립된 클래스 로더 인스턴스를 사용해야 합니다.
    격리를 통해 다른 애플리케이션의 코드에 영향을 받지 않고 클래스 충돌 없이 여러 버전의 같은 라이브러리를 사용할 수 있습니다.
  • 3) 성능 최적화
    클래스 로딩 과정에서 I/O작업은 상대적으로 비용이 많이 드는 작업입니다.
    로더의 성능을 최적화하기 위해 캐싱 매커니즘을 구현할 수 있습니다.
    한 번 로드된 클래스는 캐시에 저장하여 재사용함으로 같은 클래스를 다시 로드할 때 I/O 비용을 줄일 수 있습니다.
  • 4) 보안
    외부 소스에서 코드를 동적으로 로드하는 경우 보안 검증 없이 임의의 코드를 실행할 수 있는 취약점이 발생할 수 있으므로 클래스 데이터를 로드하기 전에 적절한 보안 검증을 수행해야 합니다.
  • 5) 리소스 관리
    클래스 파일 뿐만 아니라 관련된 리소스 또한 관리할 수 있어야 합니다.
    리소스 로딩 경로 및 방식을 효율적으로 관리하여 리소스 접근성을 향상시킬 수 있습니다.
  • 6) 유연성 및 확장성
    클래스 로더의 확장성을 고려하여 향후 변경될 수 있는 요구사항에도 유연하게 대응할 수 있도록 설계해야 합니다.
    로딩 로직을 모듈화하여 필요에 따라 쉽게 교체하거나 업데이트할 수 있도록 구성할 수 있습니다.

 

클래스 로더를 계층적으로 적용하는 이유

# 보안 # 효율성 #모듈성

1. 위임 모델 Delegation Model의 적용
Java의 클래스 로더는 위임 모델을 사용하여 클래스를 로드합니다.
클래스 로더는 요청 받은 클래스를 로드하기 전에 항상 부모 클래스 로더에게 먼저 로딩을 시도하도록 요청합니다.
부모 로더가 클래스를 로드할 수 없을 때에만 현재 로더가 로드를 시도합니다.


>> 장점
- 중복 방지: 갘은 클래스가 여러 번 로드되는 것을 방지하여, 메모리 사용을 최적화하고 성능을 향상시킵니다.
- 보안 강화: 보안이 중요한 클래스들은 더 높은 우선순위의 로더에 의해 관리되므로 안전하게 유지됩니다. Bootstrap Class Loader Extension Class Loader
- 오류 최소화: 잘못된 클래스가 로드되는 것을 방지하고 더 안정적인 시스템 운영을 보장합니다.

 

 

2. 보안
Java의 보안 아키텍처는 클래스 로더 계층을 중심으로 구축됩니다.
클래스 로더 각각은 Java 플랫폼의 일부분으로 신뢰할 수 있는 라이브러리만을 로드하도록 설계되어 있습니다.
부트스트랩 클래스 로더는 JVM의 일부로서 JRE 의 핵심 클래스들을 로드하며 클래스들은 수정이 불가능하게 보호됩니다.

 

 

3. 성능 최적화
계층적 클래스 로딩은 필요한 클래스를 빠르고 효율적으로 로드할 수 있도록 합니다.
클래스가 이미 로드되어 있는지를 상위 클래스 로더부터 순차적으로 검사함으로 불필요한 로딩을 줄이고 시스템 리소스를 절약할 수 있습니다.

 

 

4. 모듈성과 확장성
클래스 로더의 계층적 구조는 Java 애플리케이션의 확장성을 향상시킵니다.
서로 다른 소스에서 오는 코드를 모듈화하고 관리하기 쉽게 만듭니다.
서드 파티 라이브러리나 사용자 정의 코드는 보통 애플리케이션 클래스 로더에 의해 관리되며 이는 확장 라이브러리 또는 기타 JVM 핵심 라이브러리와 격리됩니다.

 

 

5. 런타임 유연성
클래스 로더의 계층적 구조는 런타임에 새로운 클래스 로더를 동적으로 추가할 수 있는 유연성을 제공합니다.
이를 통해 애플리케이션은 실행 중에 새로운 코드를 로드하거나 기존 코드를 수정하는 등의 작업을 수행할 수 있습니다.

반응형