2023. 4. 17. 12:12ㆍSpring Boot
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를 사용할 때 얻을 수 있는 주요 이점입니다:
1. 자동 재시작
- 코드 변경 시 자동 재시작: DevTools는 클래스패스에 있는 파일이 변경될 때마다 애플리케이션을 자동으로 재시작합니다. 이는 개발자가 변경 사항을 더 빠르게 확인할 수 있게 해주어 개발 사이클을 단축시킵니다.
- 빠른 재시작: DevTools는 RestartClassLoader를 사용하여 애플리케이션의 특정 부분만을 재로딩함으로써 전체 애플리케이션 재시작보다 빠르게 작업을 수행합니다.
2. Live Reload
- Live Reload : DevTools는 브라우저 확장 기능과 함께 사용할 때 HTML, CSS, JavaScript와 같은 리소스 파일이 변경될 때 브라우저를 자동으로 새로고침합니다. 이는 프론트엔드 개발 시 매우 유용합니다.
3. 프로퍼티 파일 자동 리로드
- 구성 변경의 자동 적용: 애플리케이션의 구성 파일(application.properties 또는 application.yml)이 변경되면 DevTools는 서버 재시작 없이도 변경 사항을 자동으로 적용합니다.
4. 템플릿 캐시 비활성화
- 템플릿 캐싱 비활성화: 개발 중에는 Thymeleaf, FreeMarker 등의 템플릿 캐싱을 비활성화하여, 템플릿 파일 변경 시 즉시 결과를 볼 수 있습니다.
5. 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' 카테고리의 다른 글
SLF4J (0) | 2023.04.17 |
---|---|
@Autowired (0) | 2023.04.17 |
Spring Boot 기반 Jar 파일 (0) | 2023.04.17 |
@Conditional (0) | 2023.04.13 |
3. Spring Data JPA Query Methods Naming Rules (0) | 2023.04.13 |