본문 바로가기

Java/mybatis

ClassLoader를 활용한 Thread 호출하기

# Thread.currentThread().getContextClassLoader( ) 의 기능

ClassLoader의 주요 기능은 클래스를 로딩하는 것 뿐만 아니라 다른 리소스도 읽어 올 수 있는 유용한 기능을 제공한다.

ClassLoader는 스레드에서 획득할 수가 있다. 여기서 획득된 스레드는 어떤 기반에서 생성된 것인지 구분을 해서 사용해야 한다. 주로 자바 main( ) 메소드 기반의 단독 애플리케이션을 예를 들지만 일반적으로는 웹 애플리케이션을 주로 다룰 것이다. 따라서 스레드를 어떤 기반에서 가져올 것인지 고려해야 하는 것이다. 

단독 애플리케이션 환경에서는 ClassLoader.getSystemResourceAsStream( ) 메소드를 통해 해당 리소스를 읽어오면 되지만, 웹 애플리케이션 환경에서는 Thread.currentThread().getContextClassLoader( ).getResourceAsStream( ) 메소드를 통해 리소스를 읽어오면 된다.

웹 애플리케이션은 웹 컨테이너 안에서 실행되며, 웹 컨테이너는 여러 개의 애플리케이션을 분리하여 구동시키기 위해 스레드를 각각 생성한다. 각 스레드에 ClassLoader를 부여하며 이때 setContextClassLoader( ) 메소드를 사용한다. 

만일 현재 실행되는 웹 어플리케이션의 스레드에 있는 ClassLoader를 가져오기 위해서는 getContextClassLoader( ) 메소드를 사용한다. 이후에 ClassLoader에 셋팅 된 클래스 패스에서 해당 리소스를 가져온다.