JAVA HotSwap Tomcat 재기동 없이 반영하기
by 개발자   2025-03-17 10:02:35   조회수:129

*.java 컴파일과 WAS 재기동, 그리고 핫스왑 기술 상세 설명

**1. .java 파일 컴파일 (Compile) => .class

  • 컴파일이란?

    • 사람이 이해하기 쉬운 고급 프로그래밍 언어 (여기서는 Java)로 작성된 소스 코드 (.java 파일)를 컴퓨터가 직접 실행할 수 있는 기계어 형태의 파일 (.class 파일, 바이트코드)로 변환하는 과정입니다.

    • Java 컴파일러 (javac)가 이 역할을 수행합니다.

  • *.class 파일 (바이트코드)

    • *.class 파일은 특정 운영체제에 종속되지 않는 중간 형태의 코드입니다. JVM (Java Virtual Machine)이라는 가상 머신 위에서 실행됩니다.

    • Java의 "Write Once, Run Anywhere" (한 번 작성하면 어디서든 실행) 철학을 가능하게 하는 핵심 요소입니다.

*2. WAS (Web Application Server)와 .class 파일 변경 시 재기동

  • WAS의 역할:

    • WAS는 웹 애플리케이션을 실행하고 관리하는 서버입니다. 웹 요청을 처리하고, 데이터베이스와 연동하며, 비즈니스 로직을 수행하는 등 웹 서비스 제공에 필요한 다양한 기능을 제공합니다.

    • Tomcat, Jetty, JBoss, WebSphere, WebLogic 등이 대표적인 WAS입니다.

  • *.class 파일 변경과 재기동:

    • WAS는 웹 애플리케이션을 실행하기 위해 *.class 파일을 로드합니다.

    • 일반적으로 WAS는 *.class 파일이 변경되면 변경 사항을 반영하기 위해 서버를 재기동해야 합니다. 이는 WAS가 실행 중인 애플리케이션의 코드를 변경하는 것이 어렵기 때문입니다.

    • 재기동은 WAS가 메모리에서 기존 애플리케이션을 내리고, 변경된 *.class 파일을 포함한 새로운 애플리케이션을 다시 로드하는 과정을 의미합니다.

    • 문제점: 재기동하는 동안 서비스가 중단되어 사용자에게 불편을 초래하고, 운영 환경에서 가동 중단 시간을 최소화해야 하는 경우 큰 문제가 될 수 있습니다.

3. Tomcat의 Auto Reload 기능

  • Auto Reload 기능이란?

    • Tomcat은 개발 편의성을 위해 Auto Reload 기능을 제공합니다. 이 기능을 활성화하면 Tomcat은 주기적으로 *.class 파일의 변경 여부를 감지하고, 변경 사항이 있을 경우 자동으로 애플리케이션을 재시작합니다.

  • 장점:

    • 개발자가 코드를 수정하고 저장할 때마다 수동으로 서버를 재시작할 필요가 없어 개발 생산성을 향상시킬 수 있습니다.

  • 단점:

    • Auto Reload 역시 내부적으로 재기동을 수행하므로, 짧은 시간 동안 서비스 중단이 발생합니다.

    • 세션이 끊어지지는 않지만, 재시작 동안 요청 처리 지연이 발생할 수 있습니다. 사용자는 짧은 멈춤 현상이나 약간의 응답 시간 지연을 경험할 수 있습니다.

    • 운영 환경에서는 서비스 중단 가능성 때문에 Auto Reload 기능을 비활성화하는 것이 일반적입니다.

4. 핫스왑 (Hot Swap) 기술: JRebel, DCEVM, Spring Loaded

  • 핫스왑이란?

    • 핫스왑 (Hot Swap)은 WAS를 재기동하지 않고도 실행 중인 애플리케이션의 코드를 즉시 변경하는 기술입니다.

    • 이를 통해 개발자는 코드 변경 사항을 즉시 확인하고 테스트할 수 있으며, 운영 환경에서는 서비스 중단 없이 업데이트를 적용할 수 있습니다.

  • 원리:

    • 핫스왑 기술은 JVM의 클래스 로더 기능을 활용하여 변경된 *.class 파일만 동적으로 로드합니다.

    • JVM의 일부 기능을 변경하거나, 별도의 에이전트를 사용하여 클래스 로딩 과정을 제어합니다.

  • 종류:

    • JRebel (상용 소프트웨어):

      • 가장 강력하고 안정적인 핫스왑 솔루션 중 하나입니다.

      • 다양한 IDE (Eclipse, IntelliJ IDEA 등)와 WAS를 지원합니다.

      • 복잡한 애플리케이션 구조에서도 높은 성공률을 보장합니다.

      • 하지만 상용 소프트웨어이므로 라이선스 비용이 발생합니다.

    • DCEVM (무료):

      • Dynamic Code Evolution VM의 약자로, OpenJDK 기반의 JVM을 수정하여 핫스왑 기능을 제공합니다.

      • JVM 자체를 변경하므로 JRebel만큼 강력한 핫스왑 기능을 제공합니다.

      • 무료로 사용할 수 있지만, JVM을 직접 수정해야 하므로 설치 및 설정 과정이 다소 복잡할 수 있습니다.

      • 최신 버전의 JDK를 지원하지 않을 수 있습니다.

    • Spring Loaded (무료):

      • Spring Framework 개발팀에서 만든 핫스왑 에이전트입니다.

      • Spring 기반 애플리케이션에 특화되어 있으며, 간단한 설정으로 핫스왑 기능을 활성화할 수 있습니다.

      • DCEVM보다는 기능이 제한적일 수 있지만, Spring 개발자에게는 간편한 대안이 될 수 있습니다.

      • 더 이상 활발하게 관리되지는 않지만, 여전히 사용 가능한 옵션입니다.

결론

*.java 파일을 컴파일하여 생성된 *.class 파일은 WAS에서 실행됩니다. 코드 변경 시 WAS를 재기동해야 하는 불편함을 해소하기 위해 Tomcat의 Auto Reload 기능이나 핫스왑 기술 (JRebel, DCEVM, Spring Loaded)을 사용할 수 있습니다. 각 기술은 장단점이 있으므로, 개발 환경과 요구 사항에 맞는 적절한 솔루션을 선택하는 것이 중요합니다.