[배워서 바로 쓰는 스프링 부트2] 1.2 웹 애플리케이션 개발
1.2 웹 애플리케이션 개발
개발자 도구
스프링 부트는 spring-boot-devtools
모듈을 제공
이 모듈은 JVM 핫 스와핑과는 다른 방식으로 애플리케이션 개발의 효율성을 높여줌
spring-boot-devtools
를 의존관계에 추가하기(build.gradle
)
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
}
dependencies {
developmentOnly "org.springframework.boot:spring-boot-devtools"
}
디폴트 속성
spring-boot-devtools
는 자동으로 캐시를 비활성화하는 개발 환경 설정을 적용
DevToolsPropertyDefaultsPostProcessor
에 spring-boot-devtools
를 적용하는 설정이 모두 정리되어 있음
재실행 자동화
spring-boot-devtools
를 사용하면 클래스 경로에 포함된 파일의 변경을 감지해 자동으로 애플리케이션을 다시 실행함
단 정적 리소스 파일이나 템플릿처럼 재실행하지 않아도 되는 파일의 변경은 무시함
인텔리제이에서는 애플리케이션 실행 중 재컴파일을 실행하도록 설정을 변경 해야함ctrl+Shift+A
를 누르면 다이얼로그 창에 registry를 입력하고 Registry...
클릭
Registry 화면이 열리면 compiler.automake.allow.when.app.running
항목에 체크하면 애플리케이션 실행 중인 상태에서도 컴파일 할 수 있음
spring-boot-devtools
는 재실행 속도를 높이기 위해 두 개의 클래스 로드를 제공하며
서드파트 라이브러리처럼 변경되지 않는 부분은 베이스 클래스 로더에서 로드하여 이를 계속해서 사용함
변경되는 부분은 재실행용 클래스 로더에서 로드하고 재실행할 때마다 파기하거나 작성해 재실행하는 비용이 처음 실행보다 적어지도록 한다
리소스 제외
정적 리소스의 변경은 애플리케이션 재실행이 불필요 하므로 제외
디폴트 정적 리소스 제외 설정
/META-INF/maven
/META-INF/resources
/resources
/static
/public
/templates
재실행 트리거에서 제외할 파일 설정하기
spring.devtools.restart.exclude=static/**, public/**
재실행 트리거에서 제외할 파일 추가 설정하기
JVM 핫 스와핑을 사용하는 경우 설정을 추가하면 spring-boot-devtools
의
LiveReload 기능을 활용할 수 있어서 매우 편리함
spring.devtools.restart.additional-exclude=java/**, test/**
LiveReload
spring-boot-devtools
모듈을 의존관계에 추가하고 브라우저 확장 기능을 설치해 라이브러리 로드 환경을 구성
애플리케이션을 실행해 브라우저에서 개발 중인 화면을 열고 브라우저 확장 기능 아이콘을 클릭하면 LiveReload 서버와 웹소켓 통신이 확립됨
이 상태에서 템플릿이나 CSS, 자바스크립트 파일을 변경하면 브라우저 페이지가 새로고침 된다
LiveReload 비활성화
spring.devtools.livereload.enabled=false
재실행 VS 리로드
spring-boot-devtools
를 사용한 애플리케이션은 첫 번째 실행 이후의 실행 비용이 전보다 적게 들도록 설계되어 있음
하지만 소스를 변경하면서 즉시 동작을 확인하고 싶은 경우에는 리로드가 더 효율적임
스프링 부트 애플리케이션은 단순한 자바 애플리케이션이므로 특별히 아무것도 하지 않아도 JVM 핫 스와핑이 동작함
JDK에서 제공하는 표준 JVM 핫 스와핑은 여러 가지 제한이 있어 매우 편리하지는 않음
JVM 핫 스와핑을 구현하고 싶은 경우 JRebel
이나 Spring Loaded
사용을 고려
-
제이레벨(
JRebel
)- JVM 핫 스와핑의 기능을 크게 향상시킴
- 클래스의 추가/삭제, 부모 클래스의 대체뿐만 아니라
Spring Bean
의 리로드에도 대응 - 대부분 소스코드 변경이 즉시 반영됨
- 유료 연간 약 450달러
-
스프링 로디드(
Spring Loaded
)- Grails2 내부에서 이용
- 기능은 제이레벨이 못미침
- 무료
- 실행할 때 소스코드의 새로고침이 가능해 파일 변경을 감지하고 리로더를 실시
- 생성자, 메서드, 필드, 애너테이션, enum 값의 추가/변경/삭제에 대응
- 새로운 클래스 추가는 지원 X
DCEVM + HotSwapAgent
DCEVM
은 JDK에 패치를 적용해 클래스의 재정의 기능을 강화하므로 클래스 추가에 대한 핫스와핑이 작동함
HotSwapAgent
와 함께 사용하면 스프링 빈의 리로드가 가능해 DI 처리를 하는 서비스의 변경이 즉시 반영되어 매우 편리함
도입 방법
DCEVM
프로젝트 사이트에서 사용하는 JDK/JRE 버전용DCEVM
을 다운로드- 다운로드한 JAR 파일을 실행해 설치
java -jar DCEVM-*-installer.jar
- 윈도우의 경우 명령 프롬프트를 관리자 권한으로 열어 설치 프로그램을 실행
HotSwapAgent
인텔리제이에 플러그인 설치후 IDE 재시작- 인텔리제이
setting
의HotSwapAgent
항목에서bootRun
작업만 활성화하는 옵션 선택