Spring Boot DevTools: 생산성 부스터

CH.dev·2025년 7월 24일
post-thumbnail

💡 핵심 개념

1. Spring Boot DevTools

프로젝트 의존성에 추가하는 것만으로 동작하는 개발 편의 도구 모음.

  • 빠른 자동 재시작 (Automatic Restart)

    • 일반적인 재시작과 달리, DevTools는 두 개의 ClassLoader를 사용해 속도를 극대화함.
      • Base ClassLoader: 잘 변하지 않는 의존성 라이브러리(JAR)들을 로드.
      • Restart ClassLoader: 개발자가 직접 작성하여 자주 변경되는 프로젝트 코드(/target/classes)를 로드.
    • 파일 변경이 감지되면, Restart ClassLoader만 버리고 새로 생성하여 프로젝트 코드만 다시 로드함. 무거운 라이브러리들은 이미 메모리에 로드된 상태이므로, 순수 애플리케이션 로딩 시간만 소요되어 매우 빠른 재시작이 가능함.
  • LiveReload 내장 서버

    • src/main/resources 하위의 정적 파일(HTML, CSS, JS)이나 템플릿 파일(Thymeleaf 등)이 변경될 때, 브라우저로 "새로고침해!" 라는 신호를 보내는 WebSocket 서버를 내장하고 있음.
  • 개발 환경 최적화 기본값 (Sensible Defaults)

    • 캐시 비활성화: Thymeleaf, Freemarker, Groovy Templates 등 템플릿 엔진의 캐시를 꺼서, 템플릿 수정 시 서버 재시작 없이도 바로 변경사항이 반영되도록 함 (spring.thymeleaf.cache=false).
    • 정적 리소스: 정적 리소스에 대한 HTTP 캐싱도 개발 중에는 비활성화.
    • H2 Console 자동 활성화 (H2 데이터베이스 의존성이 있을 경우).

2. LiveReload

파일 시스템 변경을 감지해 브라우저를 자동으로 새로고침하는 프로토콜. 동작 방식은 다음과 같음.
1. [서버] DevTools의 내장 LiveReload 서버가 파일 변경을 감지.
2. [통신] WebSocket을 통해 브라우저에 설치된 LiveReload 클라이언트(확장 프로그램)에게 변경 신호를 전송.
3. [클라이언트] 신호를 받은 브라우저가 현재 페이지를 자동으로 새로고침.

🛠️ 개발 환경 구축

IDE 설정 (IntelliJ IDEA 기준)

DevTools는 소스코드(.java)가 아닌 컴파일된 코드(.class)의 변경을 감지함. 따라서 소스코드 저장 시 IDE가 자동으로 컴파일을 해줘야 함.

  1. Auto Build 활성화: Settings > Build, Execution, Deployment > Compiler > Build project automatically 체크.
  2. 실행 중 Auto Build 허용 (핵심): Ctrl+Shift+A > Registry... 검색 및 실행 > compiler.automake.allow.when.app.running 항목 체크.
    • (참고: Eclipse는 기본적으로 저장 시 자동 컴파일 기능이 활성화되어 있어 별도 설정이 불필요한 경우가 많음.)

🧠 실전 코드 및 설정 예시

Maven (pom.xml)

<dependencies>
    <!-- ... other dependencies -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope> <!-- 런타임 시에만 필요 -->
        <optional>true</optional> <!-- 이 프로젝트를 의존하는 다른 프로젝트에 전파되지 않음 -->
    </dependency>
</dependencies>

Gradle (build.gradle.kts)

dependencies {
    // ... other dependencies
    developmentOnly("org.springframework.boot:spring-boot-devtools") // 개발 시에만 포함, 프로덕션 빌드에서 제외
}

재시작/LiveReload 동작 커스터마이징 (application.yml)

특정 파일 변경 시 재시작이나 LiveReload가 동작하지 않도록 제외할 수 있음.

spring:
  devtools:
    # LiveReload 기능 비활성화 (필요시)
    livereload:
      enabled: false
    # 자동 재시작 기능 비활성화 (필요시)
    restart:
      enabled: false
      # 아래 경로의 파일이 변경되어도 서버를 재시작하지 않음
      # 정적 리소스나 템플릿 변경 시에는 불필요한 재시작을 막아 효율을 높임
      exclude: "static/**, public/**, templates/**"

🔍 더 깊이 파고들기

  1. DevTools Restart vs. JVM HotSwap (JRebel 등)
    • DevTools는 클래스로더를 교체하는 방식으로, 비용 없이 빠르지만 메소드 시그니처 변경 등 구조적 변화에는 한계가 있음.
    • JRebel 같은 상용 HotSwap 솔루션은 JVM 위에서 바이트코드를 직접 수정하여, 거의 모든 코드 변경을 재시작 없이 즉시 반영 가능함.
      https://www.jrebel.com/products/jrebel
구분DevTools RestartJVM HotSwap (e.g., JRebel)
원리클래스로더 교체바이트코드 직접 수정
속도빠름 (초 단위)거의 즉시 (ms 단위)
변경 범위대부분 가능하나, 구조적 변경 시 제한적제약 거의 없음
비용무료유료 (상용 솔루션)
  1. Remote DevTools
    * 원격 서버에서 실행 중인 애플리케이션에 DevTools를 연결하여, 로컬에서 코드를 변경하면 원격 서버가 자동으로 재시작되도록 설정할 수 있음. 스테이징 환경 등에서 빠른 테스트에 유용함.
    https://docs.spring.io/spring-boot/reference/using/devtools.html#using.devtools.remote-applications

  2. Spring Boot Actuator와 함께 사용하기

    • DevTools가 개발 생산성에 초점을 맞춘다면, Actuator는 운영 및 모니터링에 초점을 맞춤. 함께 사용하면 개발 중에도 /actuator/health, /actuator/beans 등의 엔드포인트를 통해 애플리케이션 내부 상태를 손쉽게 확인할 수 있어 시너지가 좋음.
      https://spring.io/guides/gs/actuator-service
profile
더 이상 미룰 수 없다 나의 공부 나의 성장

0개의 댓글