# application.yml
app:
name: MyApplication
version: 1.0
features:
enableFeatureX: true
enableFeatureY: false
#kotlin - 클래스는 위의 설정 값으로 매핑됨
@ConfigurationProperties("app")
class AppProperties {
lateinit var name: String
lateinit var version: String
lateinit var features: Features
class Features {
var enableFeatureX: Boolean = false
var enableFeatureY: Boolean = false
}
}
#spring 컨텍스트에서 관리: 이 클래스는 Spring이 애플리케이션 컨텍스트에서 관리하는 빈으로 등록되며, @Autowired 또는 생성자 주입 방식으로 다른 곳에서 사용할 수 있음
@RestController
class AppController(val appProperties: AppProperties) {
@GetMapping("/app-info")
fun getAppInfo(): Map<String, Any> {
return mapOf(
"name" to appProperties.name,
"version" to appProperties.version,
"features" to mapOf(
"enableFeatureX" to appProperties.features.enableFeatureX,
"enableFeatureY" to appProperties.features.enableFeatureY
)
)
}
}
1. 기본적인 파일 구조: Spring Boot는 기본적으로 application.yml 파일을 프로젝트의 설정 파일로 사용. 이 파일은 애플리케이션 전반에 걸쳐 설정을 정의할 수 있으며, 여러 환경별로 프로파일을 분리해 사용 가능
2. 프로파일별 설정: 각 환경(예: dev, prod, test)에 맞는 설정을 별도로 정의하려면 application-{profile}.yml 파일을 사용할 수 있음
환경 변수 및 외부 설정 적용
Spring Boot는 환경 변수나 시스템 속성도 설정에 사용 가능이를 통해 애플리케이션 실행 시 특정 값(예: 데이터베이스 URI, API 키 등)을 외부에서 주입 가능.
spring:
database:
name: TEST_DB
url: ${DATABASE_URI}
# DATABASE_URI라는 환경 변수를 불러와 사용
키 관리 서비스 (예: Azure Key Vault)와 연동
1. Key Vault 설정: 만약 Azure Key Vault 같은 비밀 관리 서비스를 사용한다면, Spring Boot에서 application.yml에서 키의 이름을 지정하고 해당 키를 Key Vault에서 가져옴
• application.yml에서 Key Vault의 값을 참조하는 방법:
azure:
keyvault:
uri: https://my-vault-name.vault.azure.net/
datasource:
url: ${database-uri}
# database-uri라는 키가 keyvault에 value와 저장되어 있어야함
2. Key Vault 연동 설정: Key Vault에서 값을 불러오기 위해 Spring Boot Starter와 Azure Key Vault 설정을 추가
# .gradle
dependencies {
implementation("com.azure.spring:azure-spring-boot-starter-keyvault-secrets:${version}")
}
3. 자동으로 키 가져오기: Spring Boot는 application.yml 파일 내에서 ${}로 감싸진 변수를 감지하고, 해당 변수를 시스템 환경 변수나 Key Vault 같은 외부 소스에서 자동으로 불러옴. Azure Key Vault에서 해당 값을 읽어오는 로직은 Azure Key Vault Starter가 자동으로 처리합니다.
설정 값 우선 순위
Spring Boot는 설정 값을 여러 소스에서 가져올 수 있음
1. 커맨드라인 인수 (--spring.profiles.active=prod)
2. 자바 시스템 속성 (-Dspring.profiles.active=prod)
3. OS 환경 변수 (DATABASE_URI=jdbc:mysql://localhost:3306/mydb)
4. application-{profile}.yml 또는 application.yml 파일
5. 하드코딩된 기본값 (코드 내에서 설정한 값)
1. 커맨드라인 인수 (Command-line Arguments) - 애플리케이션 실행 시, 명령 프롬프트에서 함께 전달하는 인수를 의미
커맨드라인 인수는 애플리케이션 실행 시에 설정 값을 직접 전달할 수 있는 가장 강력한 방법. 다른 방법들에 비해 우선 순위가 가장 높음.
#example
java -jar myapp.jar --spring.profiles.active=prod
java -jar myapp.jar --spring.datasource.url=jdbc:mysql://localhost:3306/mydb --spring.datasource.username=myuser --spring.datasource.password=mypassword
장점:
• 필요에 따라 다양한 설정을 런타임에 쉽게 변경 가능.(개발, 테스트를 위해 특정 프로파일 활성화 할 때 사용 가능)
• 애플리케이션 코드나 구성 파일을 수정하지 않고도 동작을 제어할 수 있음.
단점:
• 모든 실행 시 마다 인수를 제공해야 함.
2. 자바 시스템 속성 (Java System Properties)
자바 시스템 속성은 -D 플래그를 통해 애플리케이션 실행 시에 JVM 레벨에서 설정을 전달할 수 있는 방법.
#example
java -Dspring.profiles.active=prod -jar myapp.jar
장점:
• 자바 시스템 속성을 사용해 애플리케이션의 설정을 JVM 레벨에서 통합 관리 가능.
• 배포 환경에서 쉽게 설정 가능.
단점:
• JVM 실행 시에만 적용되므로, 설정 변경을 위해서는 다시 실행해야 함.
3. OS 환경 변수 (OS Environment Variables)
환경 변수는 운영 체제에서 설정할 수 있는 값으로, 애플리케이션 외부에서 관리할 수 있는 방법. 이 방식은 시스템 전역적으로 설정된 값을 사용할 수 있어 서버 환경이나 컨테이너 환경에서 자주 사용.
e.g) Docker 컨테이너 내부에서 애플리케이션 실행 시, OS 환경 변수 설정하여 전달 가능
# Dockerfile 예시
FROM openjdk:17-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/myapp.jar
COPY ${JAR_FILE} app.jar
# 환경 변수 정의
ENV DATABASE_URI=jdbc:mysql://dbserver:3306/mydb
ENV SPRING_PROFILES_ACTIVE=prod
# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app.jar"]
#################################################
docker run -e DATABASE_URI=jdbc:mysql://dbserver:3306/mydb -e SPRING_PROFILES_ACTIVE=prod -p 8080:8080 myapp:latest
4. application-{profile}.yml 또는 application.yml 파일
다양한 환경(개발, 테스트, 운영 등)에 맞춰 application-{profile}.yml 파일을 사용하여 프로파일별 설정을 적용
5. 하드코딩된 기본값 (Hard-coded Default Values)
애플리케이션 코드 내부에서 설정 값을 직접 하드코딩하는 방법. 이 방식은 설정이 전혀 주어지지 않았을 때 기본적으로 사용될 값을 정의하는 데 사용.
Q. application.yml / application-dev.yml / application-dev-krc.yml 이 있으면 profile이 dev일 때 환경 변수 값을 어떤 파일에서 읽어올까?
- 기본 파일(application.yml): 항상 먼저 로드. 여기에 정의된 설정은 모든 프로파일에 공통적으로 적용.
- 프로파일별 파일(application-dev.yml): spring.profiles.active=dev로 설정된 경우, application-dev.yml 파일이 로드 그리고 application.yml 파일에서 설정된 값을 덮어씀
- 세부 프로파일 파일(application-dev-krc.yml): 만약 spring.profiles.active=dev-krc로 설정되어 있으면 application-dev-krc.yml 파일이 추가로 로드. 이 파일은 application.yml과 application-dev.yml에서 정의된 설정을 덮어씀
Q. 환경 변수에서 value를 불러오기 위한 방법
- @ConfigurationProperties 어노테이션: @ConfigurationProperties는 특정 설정 파일(application.yml 또는 application.properties)의 키-값 쌍을 자동으로 객체에 매핑. 괄호 안에 있는 "app"은 application.yml에서 설정 키의 접두어(prefix)를 의미.
# application.yml
app:
name: MyApplication
version: 1.0
features:
enableFeatureX: true
enableFeatureY: false
// 클래스에 매핑: @ConfigurationProperties로 선언된 클래스는 위의 설정값을 자동으로 매핑
@ConfigurationProperties("app")
class AppProperties {
lateinit var name: String
lateinit var version: String
lateinit var features: Features
class Features {
var enableFeatureX: Boolean = false
var enableFeatureY: Boolean = false
}
}
//Spring 컨텍스트에서 관리: 이 클래스는 Spring이 애플리케이션 컨텍스트에서 관리하는 빈으로 등록되며, @Autowired 또는 생성자 주입 방식으로 다른 곳에서 사용할 수 있음
@RestController
class AppController(val appProperties: AppProperties) {
@GetMapping("/app-info")
fun getAppInfo(): Map<String, Any> {
return mapOf(
"name" to appProperties.name,
"version" to appProperties.version,
"features" to mapOf(
"enableFeatureX" to appProperties.features.enableFeatureX,
"enableFeatureY" to appProperties.features.enableFeatureY
)
)
}
}
- environment.getRequiredProperty(key) : Spring Framework에서 Environment 객체를 사용하여 애플리케이션의 환경 설정 속성(property)을 가져오는 메서드. 지정된 key 값을 사용하여 환경 변수, 시스템 속성, 또는 application.yml이나 application.properties 같은 외부 설정 파일에서 값을 가져옴. 만약 해당 key가 존재하지 않으면 IllegalStateException을 던져 오류를 발생. 즉, 이 메서드는 필수적으로 값이 존재해야 하는 경우에 사용되며, 만약 존재하지 않으면 애플리케이션 실행을 중단시키는 방식으로 동작
- @Value 어노테이션 :
@Value("${my.custom.property}")
private val myCustomProperty: String;
'개발' 카테고리의 다른 글
AWS transit gateway (0) | 2024.11.25 |
---|---|
SSE 이벤트 푸쉬로 불필요한 polling 제거하기 (2) | 2024.10.23 |
지속 가능한 소프트웨어 (0) | 2024.08.15 |
0. HTTP란? (1) | 2024.07.28 |
Typescript Custom Decorator (0) | 2024.02.03 |