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 를 추가하는 것도 고려하라.

참고

백기선님 스프링부트 2.0 강의
Spring Boot Reference Guide