이 문서는 Google Cloud Translation API를 사용해 자동 번역되었습니다.
어떤 문서는 원문을 읽는게 나을 수도 있습니다.
Java 애플리케이션을 개발할 때 사용자 정의 클래스 로더를 작성해야 할 수 있습니다. 이는 기본 클래스 경로가 아닌 다른 위치에서 클래스를 로드하려는 경우나 클래스가 로드되는 방식을 수정하려는 경우에 자주 발생합니다.
이 기사에서는 Java에서 사용자 정의 클래스 로더를 작성하는 방법을 살펴보겠습니다. 또한 사용자 지정 클래스 로더의 일반적인 사용 사례 중 일부를 살펴보겠습니다.
커스텀 클래스 로더를 생성하는 방법에 대해 알아보기 전에 먼저 한 걸음 뒤로 물러나서 클래스 로더가 무엇인지 이해해 봅시다.
클래스 로더는 클래스를 Java 애플리케이션으로 로드하는 역할을 하는 소프트웨어입니다. Java 애플리케이션이 시작되면 JVM(Java Virtual Machine)이 클래스 로더를 로드합니다. 이 클래스 로더는 애플리케이션의 클래스 로드를 담당합니다.
JVM은 부트스트랩 클래스 로더라고 하는 기본 클래스 로더와 함께 제공됩니다. 이 클래스 로더는 java.lang.String
및 java.util.ArrayList
와 같은 핵심 Java 클래스를 로드합니다.
부트스트랩 클래스 로더 외에도 JVM에는 두 개의 다른 클래스 로더인 시스템 클래스 로더와 확장 클래스 로더가 함께 제공됩니다.
시스템 클래스 로더는 애플리케이션의 클래스 경로에 클래스를 로드하는 역할을 합니다. 클래스 경로는 JVM이 클래스를 검색해야 하는 위치 목록입니다. 기본적으로 클래스 경로에는 jre/lib/
및 jre/class/
디렉토리가 포함됩니다.
확장 클래스 로더는 extensions/
디렉토리의 클래스를 로드하는 역할을 합니다. extensions/
디렉토리는 개발자가 시스템의 모든 애플리케이션에서 사용할 수 있도록 JAR 파일을 배치할 수 있는 곳입니다.
이제 클래스 로더가 무엇인지 검토했으므로 사용자 지정 클래스 로더를 만들어야 하는 몇 가지 이유를 살펴보겠습니다.
사용자 정의 클래스 로더를 작성하는 일반적인 이유 중 하나는 기본 클래스 경로가 아닌 다른 위치에서 클래스를 로드하기 위해서입니다.
예를 들어, 애플리케이션에 로드하려는 일부 사용자 정의 클래스가 포함된 파일 시스템에 디렉토리가 있다고 가정해 보겠습니다. 이 디렉토리를 클래스 경로에 추가할 수 있지만 그러면 애플리케이션은 해당 디렉토리에서만 클래스를 로드할 수 있습니다.
애플리케이션이 여러 디렉토리에서 클래스를 로드할 수 있게 하려면 사용자 정의 클래스 로더를 생성해야 합니다. 이 사용자 정의 클래스 로더는 클래스 경로뿐만 아니라 여러 디렉토리에서 클래스를 검색할 수 있습니다.
사용자 정의 클래스 로더를 만드는 또 다른 일반적인 이유는 클래스가 로드되는 방식을 수정하기 위해서입니다.
예를 들어 애플리케이션에 로드하려는 일부 클래스가 포함된 JAR 파일이 있다고 가정해 보겠습니다. 그러나 이러한 클래스가 시스템 클래스 로더에 의해 로드되는 것을 원하지 않습니다. 대신 이러한 클래스를 별도의 네임스페이스에 로드하는 사용자 정의 클래스 로더를 사용하려고 합니다.
이것은 클래스가 로드되는 방식을 수정하려는 방법의 한 예일 뿐입니다. 다른 많은 가능성이 있습니다.
이제 사용자 정의 클래스 로더를 작성해야 하는 몇 가지 이유를 살펴보았으므로 실제로 작성하는 방법을 살펴보겠습니다.
커스텀 클래스 로더를 생성하는 것은 상대적으로 간단합니다. java.lang.ClassLoader
를 확장하는 클래스를 생성하기만 하면 됩니다. 이 클래스는 loadClass()
메서드를 재정의해야 합니다.
다음은 간단한 예입니다.
public class MyClassLoader extends ClassLoader {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
// Load the class from the filesystem
// ...
// Return the loaded class
return null;
}
}
이 예제에서는 파일 시스템에서 클래스를 로드하는 사용자 지정 클래스 로더를 만들었습니다. 이 클래스 로더는 실제로 어떤 클래스도 로드하지 않지만 고유한 사용자 정의 클래스 로더를 만드는 데 사용할 수 있는 스켈레톤을 제공합니다.
사용자 정의 클래스 로더를 생성한 후에는 JVM에 이를 사용하도록 지시해야 합니다. java.class.path
시스템 속성을 설정하여 이를 수행할 수 있습니다.
예를 들어 /path/to/classes
디렉토리에서 클래스를 로드하는 사용자 정의 클래스 로더가 있다고 가정해 보겠습니다. java.class.path
시스템 속성을 /path/to/classes
로 설정하여 이 클래스 로더를 사용하도록 JVM에 지시할 수 있습니다.
Java 애플리케이션을 시작할 때 명령줄에서 java.class.path
시스템 속성을 설정할 수 있습니다.
java -Djava.class.path=/path/to/classes MyApplication
또는 프로그래밍 방식으로 시스템 속성을 설정할 수 있습니다.
System.setProperty("java.class.path", "/path/to/classes");
java.class.path
시스템 속성을 설정하면 JVM은 사용자 정의 클래스 로더를 사용하여 클래스를 로드합니다.
이 기사에서는 Java에서 사용자 정의 클래스 로더를 작성하는 방법을 살펴보았습니다. 또한 사용자 정의 클래스 로더의 일반적인 사용 사례 중 일부를 보았습니다.