# 🚀 Spring Legacy (Non-Boot) 핫스왑 환경 구축 가이드

본 가이드는 폐쇄망(Air-gapped) 환경에서 **JRebel** 대안으로 \*\*JetBrains Runtime(JBR)\*\*과 **HotswapAgent**를 사용하여, 서버 재시작 없이 Java 코드를 즉시 반영하는 방법을 설명합니다.

## 1\. 외부망 준비물 (반입 리스트)

폐쇄망으로 반입해야 할 필수 파일입니다.

| 항목 | 용도 | 다운로드 링크 (예시) |
| :--- | :--- | :--- |
| **JBR (JetBrains Runtime)** | DCEVM이 내장된 JDK | [JBR GitHub Releases](https://github.com/JetBrains/JetBrainsRuntime/releases) |
| **HotswapAgent.jar** | Spring Bean 설정 갱신용 | [HotswapAgent Releases](https://github.com/HotswapProjects/HotswapAgent/releases) |

> **주의**: JBR 버전은 프로젝트의 Java 버전(8, 11, 17 등)과 일치시켜 다운로드하세요.

-----

## 2\. IDE(IntelliJ / Eclipse) 환경 설정

### 2.1 JDK(JBR) 등록

1.  반입한 JBR 압축을 풉니다 (예: `C:\dev\jbr`).
2.  **IntelliJ**: `Project Structure` \> `SDKs` \> `Add JDK` 후 해당 경로 지정.
3.  **Eclipse**: `Preferences` \> `Java` \> `Installed JREs` \> `Add` 후 해당 경로 지정.

### 2.2 VM 옵션 추가

서버(Tomcat 등)의 실행 구성(Run/Debug Configuration)에 아래의 **VM Options**를 추가합니다.

```bash
# 클래스 구조 변경(필드/메서드 추가) 허용
-XX:+AllowEnhancedClassRedefinition

# Spring Bean 설정 및 리소스 실시간 반영 (경로 주의)
-javaagent:C:\path\to\hotswap-agent.jar


-XX:HotswapAgent=fatjar
-Dhotswap.agent.disablePlugin=org.hotswap.agent.plugin.ibatis.IBatisPlugin,org.hotswap.agent.plugin.mybatis.MyBatisPlugin
```

-----

## 3\. IDE별 세부 최적화 설정

### IntelliJ IDEA

1.  **컴파일러 설정**:
    - `Settings` \> `Build, Execution, Deployment` \> `Compiler`
    - **Build project automatically** 체크
2.  **고급 설정**:
    - `Settings` \> `Advanced Settings`
    - **Allow auto-make to start even if developed application is currently running** 체크
3.  **업데이트 정책**:
    - Tomcat 설정 내 `On 'Update' action` 및 `On frame deactivation`을 **Update classes and resources**로 변경.

### Eclipse

1.  **Auto Build**: `Project` \> `Build Automatically` 체크 확인.
2.  **Debug 모드**: 반드시 **Debug** 모드로 서버를 실행해야 핫스왑이 작동합니다.

-----

## 4\. 실제 개발 워크플로우

1.  **서버 실행**: 반드시 **Debug 모드**로 실행합니다.
2.  **코드 수정**: 메서드 로직, 필드 추가, 새로운 `@Service` 생성 등을 수행합니다.
3.  **반영 (Compile)**:
    - **IntelliJ**: `Ctrl + Shift + F9` (현재 파일 재컴파일) 또는 `Ctrl + F9` (전체 빌드).
    - **Eclipse**: 저장(`Ctrl + S`) 시 자동 컴파일 및 반영.
4.  **확인**: 서버 재시작 없이 브라우저에서 새로고침하여 결과를 확인합니다.

-----

## 5\. 주요 주의사항 (Troubleshooting)

* **상속 구조 변경**: 클래스의 부모를 바꾸거나 인터페이스를 변경하는 수준의 큰 수정은 서버 재시작이 필요할 수 있습니다.
* **정적 변수(Static)**: `static` 필드의 초기값 변경은 핫스왑 후에도 이전 값이 유지될 수 있습니다.
* **폐쇄망 라이브러리**: `hotswap-agent.jar` 외에 특정 프레임워크(예: MyBatis, Hibernate) 전용 플러그인이 필요한 경우, HotswapAgent 설정 파일(`hotswap-agent.properties`)을 통해 제어할 수 있습니다.