폐쇄망 Spring Boot vscode 개발 환경에서 핫리로드 적용하는 방법

Spring Boot DevTools를 추가했는데 소스 저장 후 자동 재시작되지 않는 원인과 해결 방법을 정리합니다. VS Code 자동 빌드, Gradle continuous 모드, 폐쇄망 실행 방법까지 확인할 수 있습니다.

Spring Boot DevTools 핫리로드

 

Spring Boot DevTools 핫리로드 안 될 때 VS Code 설정 방법

.\gradlew bootRun으로 Spring Boot를 실행했다고 해서 Java 소스 파일을 저장할 때마다 자동으로 컴파일되는 것은 아닙니다.

Spring Boot DevTools는 src/main/java의 소스 파일 자체를 감시하지 않습니다. 컴파일된 클래스가 저장되는 build/classes의 변경을 감지한 뒤 애플리케이션을 재시작합니다.

따라서 VS Code가 저장 시 Java 소스를 자동 빌드하지 않는 환경에서는 DevTools를 추가해도 핫리로드가 동작하지 않습니다. 특히 폐쇄망 Windows 11 환경에서는 VS Code 자동 빌드 설정과 Gradle 연속 빌드를 함께 확인해야 합니다.

Spring Boot DevTools 핫리로드가 동작하는 원리

Java 소스를 수정한 뒤 자동 재시작이 이루어지는 과정은 다음과 같습니다.

Java 파일 저장
→ Java 소스 컴파일
→ build/classes 변경
→ DevTools가 클래스 변경 감지
→ Spring Boot 자동 재시작

핵심은 소스 파일 저장과 클래스 컴파일이 별개의 과정이라는 점입니다.

bootRun은 애플리케이션을 실행하는 작업이고, DevTools는 컴파일된 클래스의 변경을 감지합니다. 중간 단계인 자동 컴파일이 실행되지 않으면 아무리 Java 파일을 저장해도 Spring Boot는 변경 사실을 알 수 없습니다.

1. Spring Boot DevTools 의존성 확인

먼저 build.gradle에 DevTools 의존성이 있는지 확인합니다.

dependencies {
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
}

폐쇄망 환경이라면 필요한 의존성이 Gradle 캐시에 존재해야 합니다. 의존성이 준비되어 있다면 다음 명령어로 실행합니다.

.\gradlew bootRun --offline --info --console=plain

실행 로그에서 다음과 같은 DevTools 관련 내용을 확인할 수 있습니다.

DevToolsPropertyDefaultsPostProcessor
restartedMain

이와 비슷한 로그가 출력된다면 DevTools가 적용된 상태입니다.

2. VS Code Java 자동 빌드 활성화

DevTools가 정상적으로 적용되어 있어도 VS Code가 Java 소스를 자동으로 컴파일하지 않으면 핫리로드는 동작하지 않습니다.

VS Code 설정에서 다음 항목을 검색합니다.

java.autobuild.enabled

해당 옵션이 활성화되어 있어야 합니다.

settings.json에서는 다음과 같이 설정할 수 있습니다.

{
    "java.autobuild.enabled": true
}

설정 파일은 다음 순서로 열 수 있습니다.

Ctrl + Shift + P
→ Preferences: Open User Settings (JSON)

Java 자동 빌드는 VS Code 자체 기능이 아니라 Java 확장 기능이 담당합니다. 따라서 폐쇄망 PC에도 Java와 Gradle 프로젝트를 처리할 수 있는 확장 기능이 설치되어 있어야 합니다.

필요한 확장 기능은 다음과 같습니다.

  • Language Support for Java by Red Hat
  • Extension Pack for Java

폐쇄망 환경에서는 확장 기능 설치 여부뿐 아니라 확장 기능이 정상적으로 활성화되어 있는지도 확인해야 합니다.

3. 가장 안정적인 방법은 터미널 두 개 사용

VS Code 자동 빌드가 정상적으로 동작하지 않거나 폐쇄망 환경에서 확장 기능 구성이 불안정하다면 Gradle 연속 빌드를 별도로 실행하는 방식이 가장 확실합니다.

터미널 1에서는 Spring Boot를 실행합니다.

.\gradlew bootRun --offline --console=plain

터미널 2에서는 클래스 파일을 연속으로 컴파일합니다.

.\gradlew classes --continuous --offline --console=plain

짧게 실행하려면 다음 명령어를 사용할 수 있습니다.

.\gradlew classes -t --offline

Gradle의 --continuous 또는 -t 옵션은 입력 파일 변경을 감지하면 지정한 작업을 다시 실행합니다.

전체 동작 과정은 다음과 같습니다.

Java 파일 저장
→ Gradle classes 작업 재실행
→ build/classes 변경
→ DevTools가 변경 감지
→ Spring Boot 자동 재시작

정상적으로 동작하면 Spring Boot 실행 터미널에서 다음과 비슷한 로그를 확인할 수 있습니다.

Restarting due to class path changes

4. bootRun --continuous를 권장하지 않는 이유

다음과 같이 한 터미널에서 실행하는 방법을 생각할 수 있습니다.

.\gradlew bootRun --continuous

하지만 이 방식은 기대한 대로 동작하지 않을 수 있습니다.

bootRun은 Spring Boot 애플리케이션이 종료될 때까지 계속 실행되는 장기 실행 작업입니다. 이 때문에 Gradle 연속 빌드가 다음 실행 사이클로 자연스럽게 넘어가지 못하는 경우가 있습니다.

따라서 다음처럼 역할을 분리하는 것이 안정적입니다.

터미널 1: Spring Boot 실행
터미널 2: Java 클래스 연속 컴파일

실무에서는 bootRun과 classes --continuous를 각각 별도 터미널에서 실행하는 구성을 권장합니다.

5. HTML, CSS, JavaScript 변경이 반영되지 않는 경우

Java 코드가 아니라 Thymeleaf 템플릿이나 정적 리소스를 수정했는데 화면에 반영되지 않는다면 캐시 설정도 확인해야 합니다.

application-dev.properties에 다음 설정을 추가할 수 있습니다.

spring.thymeleaf.cache=false
spring.web.resources.cache.period=0
spring.web.resources.chain.cache=false

개발 프로필을 적용해 실행합니다.

.\gradlew bootRun --offline --args="--spring.profiles.active=dev"

서버에는 변경 사항이 반영되었지만 브라우저 화면만 이전 상태라면 브라우저 캐시가 원인일 수 있습니다.

Windows에서는 다음 단축키로 강력 새로고침합니다.

Ctrl + F5

폐쇄망 Windows 11 환경 추천 실행 구성

폐쇄망 Windows 11과 VS Code를 사용하는 환경에서는 다음 조합이 가장 안정적입니다.

터미널 1:

.\gradlew bootRun --offline --console=plain

터미널 2:

.\gradlew classes --continuous --offline --console=plain

그리고 build.gradle에는 DevTools 의존성을 추가합니다.

dependencies {
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
}

VS Code 자동 빌드가 정상적으로 동작한다면 터미널을 하나만 사용해도 됩니다. 하지만 자동 빌드 여부가 불확실한 폐쇄망 환경에서는 Gradle 연속 빌드를 별도 터미널에서 실행하는 편이 문제를 확인하고 해결하기 쉽습니다.

자주 묻는 질문

Spring Boot DevTools만 추가하면 저장 즉시 자동 재시작되나요?

아닙니다. DevTools는 Java 소스 파일이 아니라 컴파일된 클래스의 변경을 감지합니다. VS Code 자동 빌드나 Gradle 연속 빌드처럼 소스를 클래스 파일로 컴파일하는 과정이 필요합니다.

gradlew bootRun만 실행하면 Java 파일이 자동 컴파일되나요?

애플리케이션 시작 시에는 필요한 컴파일 작업이 수행되지만, 실행 중 Java 파일을 저장했다고 해서 항상 자동으로 다시 컴파일되는 것은 아닙니다.

VS Code 자동 빌드가 동작하지 않으면 어떻게 해야 하나요?

다음 명령어를 별도 터미널에서 실행하는 방법이 가장 확실합니다.

.\gradlew classes --continuous --offline --console=plain

bootRun --continuous를 사용하면 안 되나요?

환경에 따라 동작할 수 있지만 bootRun은 종료되지 않는 장기 실행 작업이므로 연속 빌드 용도로는 안정적이지 않을 수 있습니다. bootRun과 classes --continuous를 분리하는 방식을 권장합니다.

HTML과 CSS만 수정했는데 화면이 바뀌지 않는 이유는 무엇인가요?

Thymeleaf 캐시, Spring 정적 리소스 캐시, 브라우저 캐시를 확인해야 합니다. 개발 환경에서는 관련 캐시를 비활성화하고 브라우저에서 Ctrl + F5로 강력 새로고침해 보세요.

마무리

Spring Boot DevTools 핫리로드가 동작하려면 DevTools 의존성만 추가해서는 부족합니다.

Java 파일 저장 후 클래스가 다시 컴파일되어야 하고, 변경된 build/classes를 DevTools가 감지해야 자동 재시작이 이루어집니다.

폐쇄망 Windows 11과 VS Code 환경에서는 다음 구성이 가장 안정적입니다.

터미널 1: gradlew bootRun
터미널 2: gradlew classes --continuous

VS Code 자동 빌드가 정상적으로 동작한다면 별도 연속 빌드가 필요하지 않을 수 있습니다. 반대로 저장 후 아무 반응이 없다면 DevTools부터 확인하기보다 build/classes의 파일이 실제로 갱신되는지 먼저 확인하는 것이 문제 해결에 더 빠릅니다.

관련 글 내부링크 위치:

  • Spring Boot DevTools 설정 방법
  • Gradle 오프라인 모드 사용 방법
  • VS Code 폐쇄망 확장 프로그램 설치 방법
  • Thymeleaf 캐시 비활성화 방법

Spring Boot DevTools 핫리로드, VS Code 자동 빌드, Gradle bootRun, Spring Boot 자동 재시작, Gradle continuous, Spring Boot 저장 후 자동 재시작 안 됨, VS Code Java 자동 컴파일 설정, Gradle bootRun 핫리로드 설정, 폐쇄망 Spring Boot 개발 환경