Spring Boot Dev Tools

KKH_94·2023년 8월 8일
0

SpringBoot

목록 보기
2/9

Spring Boot Dev Tools

Spring Boot DevTools는 Spring Boot 기반의 개발자를 위해 설계된 모듈로, 개발 환경에서 여러 가지 편의 기능을 제공합니다. 주요 기능은 다음과 같습니다.

  1. 자동 리스타트(Automatic Restart): 기본적으로 DevTools는 클래스패스에 있는 파일들에 대한 변경 사항을 감지하고, 변경이 감지되면 애플리케이션을 자동으로 재시작합니다.

이를 통해 개발자는 새로운 코드 변경 사항을 반영하기 위해 수동으로 애플리케이션을 재시작하는 번거로움을 피할 수 있습니다. DevTools의 재시작 기능은 기본 JVM 종료와 다르게 클래스 로더를 이용하여 빠르게 수행됩니다.

  1. 라이브 리로드 서버(LiveReload Server): DevTools는 라이브 리로드 서버를 포함하고 있습니다. 이 서버는 웹 브라우저에 라이브 리로드 플러그인이 설치되어 있을 경우, 애플리케이션이 재시작될 때 자동으로 브라우저를 새로 고침합니다.

  2. 캐시 설정 변경: DevTools는 개발 환경에서 특정 캐시를 비활성화합니다. 예를 들어, Thymeleaf 템플릿 캐시는 기본적으로 비활성화되어, 변경사항이 즉각적으로 반영되게 됩니다.
    또는 property 캐싱도 비활성할 수 있습니다.

  3. 원격 애플리케이션(Remote Applications): DevTools는 원격 애플리케이션에 대한 변경 사항을 자동으로 감지하고, 변경 사항이 있을 경우 해당 애플리케이션을 재시작합니다.

이 기능은 spring-boot-devtools 모듈을 애플리케이션에 포함시키고, spring.devtools.remote.secret 속성을 설정함으로써 활성화할 수 있습니다.

  1. 프로퍼티 기본값 오버라이드: DevTools는 몇 가지 Spring Boot 프로퍼티의 기본값을 오버라이드합니다.

예를 들어, spring.thymeleaf.cache 프로퍼티는 기본적으로 false로 설정되며, spring.freemarker.cache 프로퍼티도 마찬가지입니다.

DevTools를 사용하기 위해선, 의존성을 추가해야 합니다. Maven과 Gradle에서는 각각 다음과 같이 추가할 수 있습니다.

Maven

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

Gradle

dependencies {
    developmentOnly("org.springframework.boot:spring-boot-devtools")
}

이렇게 DevTools 모듈을 프로젝트에 추가하면, Spring Boot는 실행 시 해당 모듈을 자동으로 감지하고 DevTools의 기능을 활성화합니다.

하지만 주의할 점은, DevTools는 개발 환경에서만 사용하도록 설계되었으므로, 프로덕션 환경에서는 사용하지 않도록 해야 합니다.

이를 위해 Maven 또는 Gradle 설정에서 true 또는 developmentOnly 를 사용하여 프로덕션 환경에서는 DevTools가 포함되지 않도록 해야 합니다.

클래스패스(Classpath)는 Java에서 사용되는 개념으로, JVM이나 Java가 애플리케이션을 실행할 때 필요한 클래스 파일들이 위치한 디렉토리와 JAR 파일들의 경로를 나타냅니다.

Spring Boot 프로젝트에서, 클래스패스는 일반적으로 다음의 위치를 포함합니다.

1. src/main/java: 이 경로는 애플리케이션의 소스 코드를 포함합니다.

2. src/main/resources: 이 경로는 애플리케이션에서 사용하는 리소스 파일들(예: .properties 파일, .xml 파일 등)을 포함합니다.

3. target/classes or build/classes: 이 경로는 소스 코드가 컴파일된 결과인 .class 파일들을 포함합니다.

4. target/dependency or build/libs: 이 경로는 애플리케이션의 라이브러리(dependencies)를 포함하는 JAR 파일들이 위치합니다.

따라서, 클래스패스는 단순히 src 디렉토리를 가리키는 것이 아니라, 프로젝트의 전체적인 구조를 포함하는 개념이라고 보면 됩니다.

Spring Boot DevTools가 자동 리스타트 기능을 수행할 때는, 클래스패스 내의 파일들이 변경되었는지를 감지하게 됩니다. 즉, src/main/java나 src/main/resources 디렉토리 내의 파일이 변경되면 애플리케이션이 자동으로 재시작됩니다.

캐시 설정 변경


Spring Boot DevTools는 개발 과정을 더욱 효율적으로 만들기 위해, 특히 템플릿 엔진이나 특정 속성 파일들에 대한 캐싱을 비활성화하는 기능을 제공합니다.

템플릿 엔진의 캐싱을 비활성화하면, 변경된 템플릿 파일이 즉시 반영됩니다. 캐싱이 활성화된 상태에서는, 템플릿 파일을 변경하더라도 애플리케이션을 재시작하지 않으면 변경 사항이 반영되지 않습니다. 하지만 DevTools를 사용하면 이러한 번거로움 없이 템플릿 변경 사항을 즉시 확인할 수 있습니다.

예를 들어, Thymeleaf와 FreeMarker 같은 일반적인 템플릿 엔진들의 캐싱은 DevTools를 통해 자동으로 비활성화됩니다. 이는 DevTools가 spring.thymeleaf.cache와 spring.freemarker.cache라는 속성의 기본값을 'false'로 설정하기 때문입니다.

또한, DevTools는 애플리케이션의 속성 파일에 대한 변경을 감지하고, 변경 사항이 있을 경우 자동으로 애플리케이션을 재시작하여 새로운 설정을 즉시 반영하도록 합니다. 이는 application.properties 또는 application.yml과 같은 속성 파일에 대한 변경을 통해 애플리케이션 설정을 즉시 변경하고 반영할 수 있게 해줍니다.

이렇게 캐시 설정 변경은 애플리케이션의 개발 과정을 더욱 빠르고 효율적으로 만들어주며, 개발자가 즉각적으로 코드 변경 사항을 확인할 수 있도록 해줍니다.

타임리프의 캐싱 메커니즘은 템플릿 파일의 "구문 분석된 결과"를 캐싱합니다.

구체적으로 말하자면, 템플릿 파일은 HTML, XML, CSS 등의 마크업 언어로 작성되어 있습니다. 이러한 파일을 읽고, 그 내용을 해석하고, 그 해석 결과를 사용하여 실제 HTML 페이지를 생성하는 과정을 구문 분석(parsing)이라고 합니다.

이 구문 분석 과정은 시간과 자원을 많이 소비하기 때문에, 한 번 구문 분석된 결과는 메모리에 저장해 두어 (즉, 캐싱하여) 이후에 같은 템플릿이 필요할 때는 빠르게 사용할 수 있게 합니다.

예를 들어, index.html이라는 템플릿 파일이 있다고 가정해 봅시다. 이 템플릿 파일을 처음 사용할 때, 타임리프는 이 파일을 읽고, 그 내용을 구문 분석합니다. 이 구문 분석 결과는 메모리에 저장되고, 이후에 index.html 템플릿이 또 필요할 때는 저장된 구문 분석 결과를 재사용합니다. 이렇게 함으로써 파일을 다시 읽고 구문 분석하는 데 드는 시간을 절약할 수 있습니다.

이게 바로 타임리프가 캐싱하는 내용입니다. 즉, 타임리프는 템플릿의 구문 분석 결과를 캐싱합니다. 그러나 다시 말하지만, 이것은 템플릿의 동적 내용을 캐싱하는 것이 아니라, 템플릿 파일의 구문 분석 결과만을 캐싱하는 것입니다. 동적 내용의 캐싱은 보통 웹 애플리케이션 프레임워크 또는 캐싱 서버 등의 외부 시스템에서 처리합니다.

구문 분석 결과 데이터 구조는 템플릿 파일의 각 요소와 속성, 그리고 이들이 서로 어떻게 연결되어 있는지에 대한 정보를 포함합니다. 이를 통해 타임리프는 템플릿 파일에 기술된 대로 동적 콘텐츠를 생성할 수 있습니다.

<!DOCTYPE html>
<html>
<head>
    <title>My Page</title>
</head>
<body>
    <h1 th:text="${title}">Welcome</h1>
    <p th:text="${content}">Content goes here</p>
</body>
</html>

타임리프는 이 템플릿 파일을 읽고 구문 분석하면서, 다음과 같은 정보를 메모리에 저장합니다.

문서는 HTML5 () 형식이다.
<html>, <head>, <title>, <body>, <h1>, <p> 등의 HTML 요소가 있고, 이들이 트리 형태로 서로 연결되어 있다.
<h1> 요소에는 th:text="${title}"이라는 타임리프 표현식이 있다. 이 표현식을 처리하면 실제 제목이 출력된다.
<p> 요소에도 th:text="${content}"이라는 타임리프 표현식이 있다. 이 표현식을 처리하면 실제 내용이 출력된다.

프로퍼티 기본값 오버라이드

property는 설정 값 또는 구성 요소를 참조하는 데 사용되는 키-값 쌍입니다. 프로그래밍 컨텍스트에서 이는 애플리케이션의 구성 정보를 의미하며, 주로 외부 파일(예: .properties 또는 .yml 파일)에 저장됩니다.

Spring Boot에서는 application.properties 또는 application.yml 파일에 애플리케이션 설정을 정의합니다.

예를 들어, 데이터베이스 연결 정보, 서버 포트, 로깅 설정 등을 포함할 수 있습니다.

다음은 application.properties 파일의 예입니다.

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=dbuser
spring.datasource.password=dbpass
server.port=8081

이러한 프로퍼티는 Spring Boot 애플리케이션에서 다양한 목적으로 사용됩니다. 그리고 이러한 프로퍼티의 값을 바꾸는 것이 오버라이드라고 합니다.

이에 대한 예로, 위에서 언급한 DevTools를 들 수 있습니다. DevTools는 개발 환경을 위해 몇몇 Spring Boot 프로퍼티의 기본값을 오버라이드합니다.

예를 들어, 템플릿 캐시를 비활성화하거나 애플리케이션을 자동으로 재시작하는 등의 설정을 변경합니다. 이를 통해 개발자가 코드를 변경하면 즉시 애플리케이션에 반영되도록 도와줍니다.

profile
_serendipity

0개의 댓글