https://sundaland.tistory.com/23
[ ▶ Spring Boot DevTools ]
Spring Boot의 DevTools를 사용하는 것은 필수는 아니지만, 개발 과정에서 상당한 이점을 제공한다. DevTools는 개발 효율성과 경험을 크게 향상시키는 여러 기능을 제공하므로, 많은 개발자들이 이를 선호한다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>sia</groupId>
<artifactId>taco-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>taco-cloud</name>
<description>Taco Cloud Example</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
[ ▷ 자동 재시작 ]
- 코드 변경 시 자동 재시작: DevTools는 클래스패스에 있는 파일이 변경될 때마다 애플리케이션을 자동으로 재시작힌다. 이는 개발자가 변경 사항을 더 빠르게 확인할 수 있게 해주어 개발 사이클을 단축시킨다.
- 빠른 재시작: DevTools는 RestartClassLoader를 사용하여 애플리케이션의 특정 부분만을 재로딩함으로써 전체 애플리케이션 재시작보다 빠르게 작업을 수행한다.
[ ▷ Live Reload ]
- Live Reload: DevTools는 브라우저 확장 기능과 함께 사용할 때 HTML, CSS, JavaScript와 같은 리소스 파일이 변경될 때 브라우저를 자동으로 새로고침한다. 이는 프론트엔드 개발 시 매우 유용하다.
[ ▷ 프로퍼티 파일 자동 리로드 ]
- 구성 변경의 자동 적용: 애플리케이션의 구성 파일(application.properties 또는 application.yml)이 변경되면 DevTools는 서버 재시작 없이도 변경 사항을 자동으로 적용한다.
[ ▷ 탬플릿 캐시 비활성화 ]
- 템플릿 캐싱 비활성화: 개발 중에는 Thymeleaf, FreeMarker 등의 템플릿 캐싱을 비활성화하여, 템플릿 파일 변경 시 즉시 결과를 볼 수 있다.
[ ▷ H2 데이터베이스 콘솔 자동 활성화 ]
- H2 콘솔 자동 활성화: H2 데이터베이스를 사용하는 경우, DevTools는 자동으로 H2 콘솔을 활성화하여 데이터베이스 작업을 더 쉽게 할 수 있도록 한다.
특정 JDBC URL에서 h2-console 접속이 가능함을 알 수 있다.
웹 브라우저에서 h2-console url을 입력다.
h2 콘솔 로그인 웹 페이지가 렌더링됨을 알 수 있다.
Save Settings를 Generic H2(Embedded)를 선택하고 JDBC URL을 h2-console 자동 구성으로 생성된 url을 입력한다.
h2 데이터베이스 현재 상황을 나타내는 웹 페이지를 볼 수 있다.
[ ▷ DevTools 사용을 고려해야 하는 경우 ]
- 개발 과정에서 위와 같은 기능이 유용하다고 생각되면 DevTools를 사용하는 것이 좋다.
- 특히, 자주 코드를 변경하고 빠르게 결과를 확인해야 하는 웹 개발 작업에서 DevTools는 큰 도움이 된다.
[ ▷ DevTools 사용을 고려하지 않아도 되는 경우 ]
- 성능 최적화가 중요한 프로덕션 환경에서는 DevTools를 사용하지 않아야 한다. DevTools는 개발 편의성을 위해 설계되었으며, 프로덕션 환경에서는 추가 오버헤드를 초래할 수 있다.
- 코드 변경 후 자동 재시작이나 라이브 리로드 기능이 필요하지 않은 경우, DevTools 없이 개발을 진행할 수 있다.
DevTools 사용 여부는 개발자의 개인적인 선호도, 프로젝트의 요구 사항, 그리고 개발 과정에서의 편의성과 생산성을 고려하여 결정된다.
DevTools가 프로젝트에 포함되지 않는다면, 다음과 같은 특정 패키지의 경로를 확인할 수 있다.
스프링 부트 웹 어플리케이션 구동시, 자동 구성을 위한 정보 (org.springframework.boot.autoconfigure.AutoConfiguration.imports)를 찾는 부분이다.
jar:file:/C:/Users/user name/.m2/repository/org/springframework/boot/
spring-boot-autoconfigure/3.1.2/spring-boot-autoconfigure-3.1.2.jar!/META-INF/spring/
org.springframework.boot.autoconfigure.AutoConfiguration.imports
하지만 DevTools을 사용한다면 위와 다른 경로에서 org.springframework.boot.autoconfigure.AutoConfiguration.imports를 찾는 것을 알 수 있다.
jar:file:/C:/Users/user name/.m2/repository/org/springframework/boot/
spring-boot-devtools/3.1.2/spring-boot-devtools-3.1.2.jar!/META-INF/spring/
org.springframework.boot.autoconfigure.AutoConfiguration.imports
DevTools가 사용되는 경우, 특정 패키지 경로에서 운영되는 이유는 다음과 같은 몇 가지 주요한 이유로 설명할 수 있다.
- 클래스 로드 분리: DevTools는 애플리케이션의 클래스를 두 개의 클래스로더로 분리한다. 하나는 "기본" 클래스로더로, 라이브러리와 같이 변경되지 않는 클래스를 로드한다. 다른 하나는 "재시작" 클래스로더로, 개발 중에 변경될 가능성이 있는 애플리케이션의 클래스를 로드한다. 이렇게 함으로써 개발 중에 변경된 코드만 빠르게 재로드할 수 있으며, 전체 애플리케이션을 재시작할 필요가 없다.
- 개발 편의 기능 제공: DevTools는 개발 중에 유용한 여러 기능을 제공하는데, 이러한 기능들은 spring-boot-devtools 패키지 내에 구현되어 있다. 예를 들어, 템플릿 캐시를 자동으로 비활성화하거나, H2 데이터베이스 콘솔을 자동으로 활성화하는 등의 기능이 있다.
- 자동 설정: DevTools는 자동 설정을 통해 Spring Boot 애플리케이션의 개발 환경을 최적화한다. AutoConfiguration.imports 파일은 Spring Boot가 자동 구성을 수행할 때 사용하는 클래스 목록을 포함하고 있으며, DevTools는 이러한 자동 구성을 개발 환경에 맞게 조정할 수 있다.
- 의존성 관리: Maven 또는 Gradle과 같은 빌드 도구를 사용하는 경우, DevTools는 .m2 또는 다른 로컬 저장소에 저장된 의존성을 관리하고 사용한다. 이를 통해 개발자가 의존성을 쉽게 관리하고 업데이트할 수 있도록 돕는다.
DevTools이 제공하는 기능과 이점을 최대한 활용하기 위해 Spring Boot는 DevTools와 관련된 구성 요소와 클래스를 별도의 경로에 배치하고 관리한다. 이러한 설계는 개발 환경을 최적화하고, 개발자가 더 빠르고 효율적으로 작업할 수 있도록 지원하는 데 목적이 있다.
'Spring Boot > Auto-Configuration' 카테고리의 다른 글
@EnableAutoConfiguration (0) | 2024.10.21 |
---|---|
Spring Boot Starter (0) | 2024.10.21 |
SpringApplication.run (0) | 2024.10.21 |
Spring Native (0) | 2024.10.21 |
Spring Boot Auto-Configuration (0) | 2024.10.21 |