[Spring Boot] 8. Spring-Boot-Devtools

Spring-Boot-Devtools

Developer Devtools

스프링 부트에서 제공하는 추가 개발 툴들의 모음이다.
반드시 필수는 아니며 기호에 따라서 사용이 가능하다.
사용하기위해서는 별도의 의존성이 필요하다.

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

의존성을 설정하면 기본적으로 새로 적용되는 프로퍼티들이 있다.
상세한것은 레퍼런스의 DevToolsPropertyDefaultsPostProcessor링크로 보면 깃허브 코드로 다음과 같은 코드를 확인할 수 있다.

DevToolsPropertyDefaultsPostProcessor.java의일부_깃허브링크->link
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static {
Map<String, Object> properties = new HashMap<>();
properties.put("spring.thymeleaf.cache", "false");
properties.put("spring.freemarker.cache", "false");
properties.put("spring.groovy.template.cache", "false");
properties.put("spring.mustache.cache", "false");
properties.put("server.servlet.session.persistent", "true");
properties.put("spring.h2.console.enabled", "true");
properties.put("spring.resources.cache.period", "0");
properties.put("spring.resources.chain.cache", "false");
properties.put("spring.template.provider.cache", "false");
properties.put("spring.mvc.log-resolved-exception", "true");
properties.put("server.error.include-stacktrace", "ALWAYS");
properties.put("server.servlet.jsp.init-parameters.development", "true");
properties.put("spring.reactor.stacktrace-mode.enabled", "true");
PROPERTIES = Collections.unmodifiableMap(properties);
}

의존성 추가하면 이제 위의 프로퍼티가 적용되서 설정이 바뀐다.
보면 주로 캐시가 꺼지는 부분과 관련이 있다.

개발할때 브라우저 확인시 고침이 안되는 부분떄문에 캐시를 비우고 새로 고침 하는 경우가 많은데 개발시 그런 수고를 줄이기 위해 아예 툴에서 제공을 해준다.

Automatic Restart

devtools를 사용하는 어플리케이션은 클래스 패스 의 파일 변경시 자동으로 재시작한다. 즉 클래스패스를 업데이트하는 것이 오토 리스타트의 트리거가 된다. 이클립스의 경우 파일을 수정하고 저장만해도 트리거되며 인텔리 J에서는 build project를 하면 역시 리스타트 된다.

어플리케이션 로드후 클래스를 수정하고 인텔리 J에서 빌드를 해보면 오토 리스타트가
일어나는 것을 알 수 있다. 오토리스타트는 실제로 직접 내장서버를 내리고 올리는 것보다 훨씬 빠른 속도를 자랑한다.

이는 스프링 부트가 2개의 클래스로더를 사용함에 기인한다. 써드파티jar들처럼 바뀌지 않을 클래스들은 “base”클래스로더에, 내가 현재 개발하고 있는 클래스들은 “restart” 클래스로더에 로드 된다. 오토리스타트시 리스타트 클래스만 새로 만들고 로딩 되기 때문에 일반적 재시작인 “cold start”보다 빠를 수밖에 없다.

Live Reload

더 신기한 것은 이 오토 리스타트시 테스트의 웹브라우저까지 오토 refresh 시킬 수 가 있다.
브라우저 확장 플러그인인 liveRload 플러그인은 Enable해놓으면 이 오토 리스타트시
빠른 리스타트와 함께 브라우저의 내용까지 바뀐 내용으로 refresh된 것을 확인 할 수 있다.

플러그인은 검색하면 여러 브라우저 용으로 나와있다.
라이브 리로드 서버를 끄려면 ‘spring.devtools.liveload.enabled = false’로 설정한다.

만약 이정도의 리스타트 속도에도 만족할 수 없다면 ZeroTurnaround의 JRebel등의 리로딩 기술을 사용해야한다.

Global Configuration

글로벌 설정 파일은 ~/.spring-boot-devtools.properties
이전 포스트의 설정의 우선순위에서 ‘application.properties’의 우선순위가 13인가
그랬다면 이 글로벌 설정 파일이야말로 가장 높은 1 우선순위를 가진다.
아마 spring-boot-devtools 의존성이 존재해야 설정될것이다.

##리모트 어플리케이션

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

이기능은 원격서버에 띄운 어플리케이션을 마치 로컬에 있는듯이 껐다 켰다 내렸다
할 수 있는 건데.. 운영용이 절대 아니다. 그리고 별도의 테스트 서버를 운영할 정도면
로컬에서 이미 충분히 테스트 할건 했을테고 운영전의 테스트 서버에서 테스트 되야할 피처는 이런식으로 관리되선 안된다. 별로인듯.

Related POST

공유하기