제8장 클래스 동적 반영

내용 목차

8.1. 개요
8.2. 기본 설정 및 동작
8.2.1. 서버 설정
8.2.2. 애플리케이션 설정
8.2.3. JEUS HotSwap으로 지원 가능한 애플리케이션 및 변환
8.2.4. JEUS HotSwap 제약 사항

본 장에는 웹 애플리케이션의 개발 속도 향상을 위한 Servlet Auto Reload 기능에 대해 설명한다.

일반적으로 Jakarta EE의 개발 Lifecycle은 다음과 같은 순서를 가지고 있다.

  1. 편집

  2. 빌드

  3. 배치

  4. 테스트

개발자들이 Jakarta EE 애플리케이션, 특히 웹 애플리케이션을 개발할 때 서블릿 등의 클래스를 수정하는 경우가 많다. 이러한 개발 과정을 신속하게 수행하기 위해 많은 노력들이 진행되어져 왔고, WebLogic 10.3에서는 FastSwap을 이용하여 이러한 재배포 과정을 줄이기 위한 기능을 제공하고 있다.

Java EE 5에서는 운영 중에 클래스 로더를 내리거나 인스턴스를 종료하지 않고도 클래스를 재정의하는 기능이 소개되었지만 선언된 필드와 메소드의 변경은 불가능한 제약사항을 가지고 있었다.

JEUS 6까지는 클래스를 수정한 뒤 수정된 클래스를 적용하려면 애플리케이션을 redeploy를 하거나, Auto Reload 기능을 통해서 주기적 체크 또는 요청에 따라 클래스 로더를 새로 생성하여 기존의 클래스 로더와 교체해야 했다. 그러나 redeploy할 경우 애플리케이션의 크기가 크면 상당한 시간이 걸리는 작업이고, Auto Reload 기능 또한 클래스 로더를 재작성하기 때문에 redeploy할 때만큼 많은 부하가 걸리고 있다.

이에 따라 JEUS 7부터는 기존의 클래스 로더의 리로딩이 필요한 동적 반영(Auto Reload)을 포함하여, JDK Instrumentation Package를 이용하여 클래스 로더의 리로딩 없이 Java 클래스의 재정의가 가능한 향상된 클래스 동적 반영(Auto Reload) 기능인 JEUS HotSwap 기능을 제공한다. 단, 현재는 웹 애플리케이션의 클래스들만 한정하여 지원한다.

주의

본 장에서 설명하는 JEUS의 Auto Reload(JEUS HotSwap 기능의 활성/비활성) 기능은 운영 상황에서는 원하지 않는 부하를 발생시킬 수 있으므로, 개발 단계에서만 사용할 것을 권장한다.

본 절에서는 JEUS의 Auto Reload 기능의 세부 설정 및 동작 방식을 설명한다.

JEUS Auto Reload 기능을 사용하려면 JEUS의 jeus-web-dd.xml에 <auto-reload>를 설정해야 한다. 그리고 JEUS HotSwap 기능을 사용하기 위해서는 <auto-reload> 하위의 <use-jvm-hotswap> 설정을 해야 한다. 이 기능들은 디렉터리 형태(Exploded Directory)인 웹 애플리케이션의 클래스 파일의 변경만 가능하다. 개발 과정에서 변경된 클래스들의 동적 반영을 위한 것이기 때문에 이미 클래스들이 노출된 디렉터리에 한정한다. 즉, 웹 애플리케이션 디렉터리의 WEB-INF/classes 디렉터리 하위에 있는 클래스의 변경만 지원한다. JEUS의 Auto Reload는 처음 애플리케이션이 배포된 후 클래스 수정이 발생한 시점을 기준으로 동작한다.

jeus-web-dd.xml에 <auto-reload>를 다음과 같이 설정하고, Auto Reload의 모니터링 주기는 WebAdmin을 사용하여 설정한다. WebAdmin을 통한 Auto Reload의 모니터링 주기 설정에 대한 자세한 내용은 “1.6.2. 모니터링 설정”을 참고한다.


세부 동작은 각 설정에 따라 다음과 같이 동작한다.

태그설명
<enable-reload>Auto Reload 기능의 사용여부를 결정한다. <enable-reload>는 true로 설정되어 있어야 한다.
<use-jvm-hotswap>
  • true : 클래스 로더를 교체하지 않고, 변경된 클래스를 재정의(redefinition)하거나 클래스 재변환(retransformation)을 통해 변경 사항을 적용한다. 만약 변경된 클래스들의 재정의 또는 재변환 시도 중 불가능한 클래스가 존재한다면 JEUS HotSwap 과정을 더 진행하지 않고, 기존의 Auto Reload 과정을 수행하여 변경 사항을 반영한다. JEUS HotSwap이 불가능한 클래스들의 변경 내역은 “8.2.4. JEUS HotSwap 제약 사항”을 참고한다.

  • false : JEUS HotSwap을 사용하지 않고, 애플리케이션의 클래스 로더를 교체하여 변경된 클래스를 적용한다.

<check-on-demand>
  • true : 요청이 들어왔을 때 바로 해당 애플리케이션의 클래스 로더를 기준으로 클래스의 마지막 수정시간을 검사하여 변경된 파일을 찾아낸다. 파일을 검사하여 변경된 클래스가 존재할 경우 <use-jvm-hotswap>의 설정 여부에 따라 Auto Reload가 수행된다.

  • false : 웹 엔진이 'Check Class Reload' 설정에 따라 일정 주기마다(기본적으로 300초) 해당 애플리케이션 클래스 로더를 기준으로 클래스의 마지막 수정시간을 검사하여 변경된 파일을 찾아낸다. 'Check Class Reload' 설정에 대한 자세한 내용은 “1.6.2. 모니터링 설정”을 참고한다.

    파일을 검사한 후 변경된 클래스가 존재하면 <use-jvm-hotswap>의 설정 여부에 따라 Auto Reload가 수행된다.

JEUS HotSwap은 Exploded 디렉터리 내의 POJO(Plain Old Java Object), 웹 애플리케이션 클래스들을 지원한다.

JEUS HotSwap은 다음 타입의 변경을 지원한다.

  • 정적 클래스 생성자 추가/제거

  • 일반 클래스 생성자 추가/제거

  • 정적 메소드 바디 수정

  • 일반 메소드 바디 수정

다음은 JEUS HotSwap에서 지원하는 클래스 변환 리스트이다.