해당 글에서는 Spring Boot 환경에서 Dotenv 오픈소스 라이브러리를 이용하여서 .env 파일을 불러오거나 .env 파일을 yml 파일 형태로 매핑하여 불러오는 방법에 대해 알아봅니다.
1) Spring Boot Dotenv
💡 Spring Boot Dotenv - Java와 Kotlin에서 .env 파일을 쉽게 로드하여 환경 변수처럼 사용할 수 있게 해주는 오픈소스 라이브러리를 의미합니다. - 즉, 프로젝트의 루트 경로에 .env 파일 내에 KV 형태로 변수를 두고 환경 변수로써 사용하는 방식입니다. - Spring Boot 내에서는 Node 환경과 다르게 .env 파일을 직접 읽어올 수 없고 대신 OS 환경 변수, application.properties, yaml 등을 읽어 올 수 있습니다.
💡 application.yml - 해당 과정은 .env 파일을 .properties 형식으로 읽어 들이기 위한 설정입니다. - config.import : 외부 설정 파일을 애플리케이션 설정에 추가로 로드를 하겠음을 지정합니다. - optional:file:.env[.properties] : 1. optional: 해당 파일이 없어도 에러 없이 무시하고 애플리케이션을 계속 실행합니다. 2. file:.env[.properties]: .env 파일을 .properties 형식으로 해석해서 읽겠다는 의미입니다.
spring:
application:
name: spring-boot-dotenv
# 해당 부분 추가
config:
import: optional:file:.env[.properties]
2) Spring Boot Dotenv 환경설정 및 활용 - 1: .env 파일 정보 가져오기
💡 Spring Boot Dotenv 환경설정 및 활용 - 1: .env 파일 정보 가져오기
- 해당 부분에서는 .env 파일을 즉시 읽어서 각각의 값을 불러오는 과정입니다.
1. 프로세스 확인
💡 프로세스 확인 1. Spring Boot 서버를 실행합니다 - 서버 실행 이후 @Configuration 어노테이션으로 설정 정보가 세팅이 됩니다.
- 사용자 지정한 DotEnvCofig.java 파일 내에 함수가 실행이 됩니다. 1.1. DotEnvConfig 생성자로 Dotenv 클래스를 불러와서 로드를 수행하여서 dotenv 멤버변수에 세팅을 합니다. 1.2. dotenv() 함수로 구성한 값을 Bean에 등록을 합니다 - Spring Boot 서버가 실행이 완료가 되었을 때 값은 모두 세팅이 된 상태가 됩니다.
3. 사용자가 특정 URI로 접근을 합니다. - 접근을 하는 Controller 내에서는 생성자로 Dotenv를 생성합니다. 그리고 생성한 생성자의 Dotenv의 객체의 .get()메서드를 통해서 .env 키 값을 넣고 값을 조회합니다. - 최종적으로 데이터가 조회가 됩니다.
2. DotEnvConfig
💡 DotEnvConfig
- DotEnvConfig 생성자로 Dotenv 클래스를 불러와서 로드를 수행하여서 dotenv 멤버 변수에 세팅을 합니다. - dotenv() 함수로 구성한 값을 Bean에 등록을 합니다
package com.adjh.springbootdotenv.config;
import io.github.cdimascio.dotenv.Dotenv;
import jakarta.annotation.PostConstruct;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* DotEnv 환경설정
*
* @author : leejonghoon
* @fileName : DotEnvConfig
* @since : 25. 12. 01.
*/
@Configuration
public class DotEnvConfig {
private final Dotenv dotenv;
/**
* DotEnv 로드 및 데이터 조회
*/
public DotEnvConfig() {
this.dotenv = Dotenv.configure()
.ignoreIfMalformed()
.ignoreIfMissing()
.load();
}
@Bean
public Dotenv dotenv() {
return this.dotenv;
}
}
3. 데이터 불러오기
💡 데이터 불러오기
- Bean에 등록된 Dotenv 클래스를 생성자로 불러옵니다. 그리고 생성한 생성자의 Dotenv의 객체의 .get()메서드를 통해서 .env 키 값을 넣고 값을 조회합니다. - 최종적으로 데이터가 조회가 됩니다.
3) Spring Boot Dotenv 환경설정 - 2: .env 파일을 yaml 파일 내 매핑(@Value 로드)
💡 Spring Boot Dotenv 환경설정 - 2: .env 파일을 yaml 파일 내 매핑(@Value 로드)
- 해당 처리과정은 .env 파일 내에 값을 불러와서 yaml 파일 내에 ${”키”} 값 형태로 매핑을 하여, 최종적으로 yaml 파일 자체를 코드 내에서 이용하는 방식입니다. - 해당 방식을 이용하면 .env만을 사용하는 방식에 반해 yaml 파일 내에 명시된 값을 기반으로 관리가 편리해지고, 중앙화를 하여서 키 값을 관리할 수 있다는 점입니다. 각각의 값을 가져오는 @Value 어노테이션을 활용하여 조회합니다.
1. 프로세스
💡프로세스 확인
1. Spring Boot 서버를 실행합니다 2. 서버 실행 이후 @Configuration 어노테이션으로 설정 정보가 세팅이 됩니다. - 사용자 지정한 DotEnvCofig.java 파일 내에 함수가 실행이 됩니다. 1. 정적블록(static{})을 이용하여서 클래스가 처음 로딩될 때 한 번만 실행하도록 합니다. 2. Dotenv 객체를 로드해 옵니다. 3. DotEnv 로드된 값을 기반으로 순회하여 properties 값 세팅합니다.
- Spring Boot 서버가 실행이 완료가 되었을 때, 값은 application.yml 파일 내에 모두 세팅이 된 상태입니다.
3. 사용자가 특정 URI로 접근을 합니다. - @Value를 통해서 매핑된 yml 파일 내에 application.yml 파일 내의 속성을 각각 조회합니다. - 최종적으로 데이터가 조회가 됩니다.
2. application.yml
💡 application.yml
- .env 키 값과 동일한 값으로 각각을 불러옵니다.
spring:
application:
name: spring-boot-dotenv
# 해당 부분 추가
config:
import: optional:file:.env[.properties]
# env 파일의 key값 참조
custom:
appEnv: ${APP_ENV}
dbHost: ${DB_HOST}
dbUser: ${DB_USER}
testKey: ${TEST_KEY}
💡 [참고] .env 파일
3. DotenvConfig
💡 DotenvConfig
- 사용자 지정한 DotEnvCofig.java 파일 내에 함수가 실행이 됩니다.
1. 정적블록(static{})을 이용하여서 클래스가 처음 로딩될 때 한 번만 실행하도록 합니다. 2. Dotenv 객체를 로드해옵니다.DotEnv 로드된 값을 기반으로 순회하여 System.setProperty를 통해서 값을 세팅합니다.
- Spring Boot 서버가 실행이 완료가 되었을 때, 값은 application.yml 파일 내에 모두 세팅이 된 상태입니다.
package com.kids.schole.config;
import io.github.cdimascio.dotenv.Dotenv;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
/**
* DotEnv 환경설정
*
* @author : leejonghoon
* @fileName : DotEnvConfig
* @since : 25. 12. 01.
*/
@Configuration
public class DotEnvConfig {
static {
/*
* DotEnv 로드 및 데이터 조회
*/
Dotenv dotenv = Dotenv.configure()
.ignoreIfMalformed()
.ignoreIfMissing()
.load();
/*
* DotEnv 로드된 값을 기반으로 순회하여 properties 값 세팅
*/
dotenv.entries().forEach(entry ->
System.setProperty(entry.getKey(), entry.getValue())
);
}
}
4. Controller
💡 Controller - @Value를 통해서 매핑된 yml 파일 내에 application.yml 파일 내의 속성을 각각 조회합니다. - 최종적으로 데이터가 조회가 됩니다.
4) Spring Boot Dotenv 환경설정 - 2: .env 파일을 yaml 파일 내 매핑(Properties 로드)
💡 Spring Boot Dotenv 환경설정 - 2: .env 파일을 yaml 파일 내 매핑(Properties 로드)
- 해당 처리과정은 .env 파일 내에 값을 불러와서 yaml 파일 내에 ${”키”} 값 형태로 매핑을 하여, 최종적으로 yaml 파일 자체를 코드 내에서 이용하는 방식입니다. - 해당 방식을 이용하면 .env만을 사용하는 방식에 반해 yaml 파일 내에 명시된 값을 기반으로 관리가 편리해지고, 중앙화를 하여서 키 값을 관리할 수 있다는 점입니다. - 각각의 값을 가져오는 @ConfigurationProperties 매핑하여 yml 파일 값을 객체의 멤버 변수로 매핑하여서 조회합니다.
1. 프로세스
💡 프로세스 확인
1. Spring Boot 서버를 실행합니다
2. 서버 실행 이후 @Configuration 어노테이션으로 설정 정보가 세팅이 됩니다.
- 사용자 지정한 DotEnvCofig.java 파일 내에 함수가 실행이 됩니다. 2.1. 정적블록(static{})을 이용하여서 클래스가 처음 로딩될 때 한 번만 실행하도록 합니다. 2.2. Dotenv 객체를 로드해 옵니다. 2.3. DotEnv 로드된 값을 기반으로 순회하여 properties 값 세팅합니다.
- Spring Boot 서버가 실행이 완료가 되었을 때, 값은 application.yml 파일 내에 모두 세팅이 된 상태입니다. 3. 사용자가 특정 URI로 접근을 합니다.
- @Value를 통해서 매핑된 yml 파일 내에 application.yml 파일 내의 속성을 각각 조회합니다. - 최종적으로 데이터가 조회가 됩니다.
2. application.yml
💡 application.yml
- .env 키 값과 동일한 값으로 각각을 불러옵니다.
spring:
application:
name: spring-boot-dotenv
# 해당 부분 추가
config:
import: optional:file:.env[.properties]
# env 파일의 key값 참조
custom:
appEnv: ${APP_ENV}
dbHost: ${DB_HOST}
dbUser: ${DB_USER}
testKey: ${TEST_KEY}