목표

  • devtools의 동작원리에 대해서 알 수 있다.
  • devtools를 사용하는 이유를 설명할 수 있다.

 

1. devtools란 무엇인가? 

devtools(Developer Tools)는 스프링 부트에서 제공하는 개발 편의를 위한 모듈이다.
주로 변경된 코드를 서버 또는 화면에 신속하게 반영해 결과를 확인하기 위해서 사용한다.
검색해본 결과 여러 가지 설정 편의를 위한 파일 설정 방법과 같은 세부적인 내용들도 많이 접할 수 있었지만,
이 글에서는 가장 많이 사용되는 서버재시작(Automatic Restart) 기능과 웹 페이지 새로고침(LiveReload) 기능에 대해서만 간단히 알아보고자 한다.

 

2. devtools의 의존성 설정

Maven

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

Gradle

dependencies {
    developmentOnly("org.springframework.boot:spring-boot-devtools")
}

사용하는 프로젝트 빌드환경에 맞춰 위와 같이 의존성을 설정해주면 devtools를 사용하기 위한 기본적인 준비는 끝난 셈이다.

 

3. 서버재시작(Automatic Restart) 기능 사용하기

콘솔에서 println을 2번 출력하는 모습


먼저 devtools의 서버 재시작 기능을 적용하기 앞서 어떤 원리로 실행이 되는 건지 알아볼 필요가 있다.
devtools를 적용하면
Base classloader와 Restart classloader 라는 2개의 클래스로더를 통해 프로그램을 실행하게된다.
Base classloader는 서드파티 라이브러리 같은 직접 변경하지 않고 참조만 하는 파일들을 실행하는 역할을 맡는다.
이름에서 느껴지듯이 기본이 되는 클래스들을 불러오는 역할을 하기에 재시작하지 않는다.
Restart classloader는 현재 개발자가 작업하고 있는 코드처럼 변경이 발생하는 코드로 이루어진 클래스들을 실행하는 역할을 수행한다. 
이렇게 프로그램이 실행되고 나서 재시작을 할때면 Base classloader는 유지한 채 Restart classloader의 범위에 속하는 클래스들만 새로 실행한다.
따라서, 일반적으로 서버를 내렸다 올리는 식의 재시작 방법보다 더 빠르게 재시작할 수 있다.
Devtools는 classpath에 변경이 생기면 이를 감지해 재시작 여부를 판단하게 된다.
프로그램이 실행되면 polling을 통해 주기적으로 classpath의 변경여부를 확인하고 있기 때문에 가능한 부분이다.

 

1. IntelliJ IDEA를 사용 중인 경우 Build project automatically를 체크한다.


Ctrl + Alt + S를 눌러 Settings창을 열어서 위 그림처럼 설정해준다.
Build project automatically를 체크하면 코드를 저장하는 경우 자동으로. java파일을 빌드해서. class파일로 생성해준다.
자연스레 classpath의 class파일이 새로 생성되었으므로 변화가 생기게 된다.
그러면 앞서 설명한 대로 classpath를 모니터링하는 devtools가 이를 감지해 서버 재시작을 하는 원리이다.
따라서 이 설정이 안 되어있으면 수동으로 빌드(Ctrl + F9)를  해야 하는 번거로움이 생기니 체크하는 것이다.
간혹 자동으로 빌드가 안돼서 서버 재시작이 동작하지 않는 경우도 종종 있었는데, 그럴 경우 수동으로 빌드를 해주니 정상적으로 동작했다.

2. resouces > application.properties에 다음 프로퍼티를 설정해준다.

# 자동재시작 사용여부
spring.devtools.restart.enabled=true

# classpath 감지 주기 설정(선택사항)
# poll-interval 값은 항상 quiet-period 보다 커야한다.
spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s

기본 값이 true로 되어있기 때문에 별도로 설정하지 않아도 서버 재시작 기능은 동작한다.
만약 자동으로 재시작하는 것을 멈추고 싶다면 false로 값을 바꿔주면 된다.
그러면 Restart classloader에서 감지하는 classpath에 변경이 발생해도 재시작하지 않는다.
만약 프로그램을 빌드하는 시간이 오래걸려 재시작 주기를 길게 가져가고 싶다면 poll-interval과 quiet-period를 사용해 갱신주기를 변경할 수 있다.
poll-interval의 값이 quiet-period보다 같거나 작다면 IllegalArgumentException이 발생하게되니 주의해서 설정하도록 한다.

 

4. 화면 새로고침(LiveReload) 기능 사용하기

chrome livereload extension과 fiddler를 통해 검증한 다음 추가작성 예정.

Reference

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools