Spring Boot 2.0.1 reference 정리 5
2018-04-20
1. Developer Tools
- 스프링 부트에는 편리한 개발 환경을 구축할 수 있는 tool이 포함되어 있다.
- 위의 4-4. Hot Swapping의 기능을 제공하는 spring-boot-devtools 모듈이 대표적이다
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
1-1. Property Defaults
- 스프링 부트가 지원하는 몇몇 라이브러리들은 성능을 향상 시키기 위해 캐시를 사용한다. 예를 들어 template engine은 컴파일된 템플릿을 캐시하여 반복적으로 템플릿 파일을 파싱하지 않도록 한다.
- 또한 Spring MVC는 정적 리소스를 제공 할 때 응답에 HTTP 캐싱 헤더를 추가 할 수 있다. 이 때문에 static resource를 변경할 경우 브라우저를 바로 리로딩 한다고 해서 변경 사항이 즉시 적용되지 않을 수 있다.
- 캐싱이 production 환경에서는 매우 유용하지만 개발 환경에서는 생산성을 오히려 떨어질 수도 있다. 그런 이유로 spring-boot-devtools는 캐싱 옵션을 기본적으로 비활성화 된다.
- 패키징 할 때는 자동으로 빠지므로 production에서는 캐싱 옵션이 활성화 된 상태로 작용한다.
- 캐시 옵션은 보통 application.properties 파일에 설정을 하는데 가령 Thymeleaf에서는 spring.thymeleaf.cache 프로퍼티를 지원한다
- 이런 프로퍼티를 수동적으로 적용하기 보다는 spring-boot-devtools 모듈을 사용하면 개발 시점에 유용한 설정들이 자동으로 적용된다.
- spring-boot-devtools의 설정이 궁금하다면 DevToolsPropertyDefaultsPostProcessor를 참고하라
1-2. Automatic Restart
- spring-boot-devtools를 사용하는 application은 classpath 내에 있는 파일이 변경되면 자동으로 restart 된다.
- static asset이나 view template은 application 재시작이 필요 없다.
- restart를 발생시키기 위해서는 classpath를 update 해야 하는데 classpath를 update 하는 방법은 사용하는 IDE에 따라 다르다. 이클립스에서는 파일이 변경 되어야 classpath가 update 업데이트 되고 restart를 일으킨다. 인텔리 제이에서는 프로젝트를 빌드 시킨다(Build -> Build Project)
-
Automatic Restart는 LiveReload와 매우 잘 작동한다. 만약 JRebel을 사용한다면 automatic restart는 비활성화 되고, LiveReload와 property overrides와 같은 다른 devtools를 사용한다면 여전히 활성화 된다.
- Restart VS Reload
- 스프링부트가 제공하는 restart는 두가지 classloader를 사용한다. 변경되지 않는 클래스(third-party jars 안에 있는 클래스)들은 base classloader로 읽어들이고, 실제로 개발한 클래스들은 restart classloader로 읽어들인다. application이 restart 될 때 기존 restart classlaoder는 버려지고 새로 만들어진다.
- 이러한 접근 방법은 아예 껐다가 다시 켜는 ‘cold start’보다 빠르다. 왜냐하면 base classloader가 대부분의 jar 파일을 읽어왔기 때문이다.
- 만약에 restart가 충분히 빠르지 않게 느껴진다면 JRebel과 같은 reloading 기술을 이용하라.
1-2-1. Logging changes in condition evaluation
- 기본적으로 application을 restart 할 때 마다 자동 설정에 대한 변경 사항을 report로 보여준다
- 설정을 비활성화 시키고 싶다면, property를 다음과 같이 설정하라
spring.devtools.restart.log-condition-evaluation-delta=false
1-2-2. Excluding Resources
- 특정 resource를 변경했을 때 restart를 일으키고 싶지 않은 경우가 있다
- /META-INF/maven, /META-INF/resources, /resources, /static, /public, /templates 내에 있는 resource들은 restart를 트리거 시키지는 않지만, live reload를 트리거 시킨다.
- 이런 제외 항목을 커스텀 하고 싶다면 spring.devtools.restart.exclude 프로퍼티에 설정해라
spring.devtools.restart.exclude=static/**,public/**
1-2-3. Watching Additional Paths
- classpath 내에 없는 파일을 수정하더라도 application restart를 일으킬 수 있다.
- spring.devtools.restart.additional-paths 에 application의 classpath와 관련 없는 파일 경로를 설정한다. 만약 그 파일이 변경되면 application이 restart 된다.
1-2-4. Disabling Restart
- restart를 원하지 않으면 spring.devtools.restart.enabled 프로퍼티를 사용해라. 대부분의 경우에는 application.properties에 세팅을 시켜라
- 모든 어플리케이션에 restart를 중지하고 싶다면 SpringApplication.run(…) 코드 전에 System 프로퍼티에 적용시켜라
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
1-2-5. Using a Trigger File
- 파일이 변경될 때마다 restart가 trigger 되는 것을 원치 않다면 특정한 파일이 바꼈을 때만 restart 시킬 수 있도록 설정할 수 있다.
- spring.devtools.restart.trigger-file 프로퍼티에 trigger 할 파일의 경로를 설정하라
2. LiveReload
- spring-boot-devtools 모듈에는 embedded LiveReload server가 있는데 플러그인을 깔면 리소스가 변경 될 때 브라우저를 자동으로 새로고침 해준다.
- LiveReload : LiveReload 크롬 플러그인
- 만약 LiveReload 서버를 비활성화 시키고 싶다면 spring.devtools.livereload.enabled 프로퍼티에 false를 세팅해라
3. Packaging Your Application for Production
- 실행가능한 jar는 production 배포 환경에서 사용할 수 있다.
- 클라우드 기반의 배포 환경에도 적절하다
- spring-boot-actuator 를 추가하는 것도 고려하라.