티스토리 뷰

개요

  • 서버리스 컨테이너 시대가 도래하면서 애플리케이션의 상태에 대한 관리가 중요해졌다. 과거에는 느슨하게 하드 코딩된 상수들도 이제는 적절하게 환경 변수를 받아 주입하도록 설정해야 안전하고 일관성 있는 컨테이너 관리가 가능하다. 이번 글에서는 Spring Boot에서 헷갈리기 쉬운 환경 변수 적용 우선순위 및 운영체제 환경 변수 관리 방법을 정리했다.

Spring Boot 환경 변수 적용 우선순위

  • Spring Boot 애플리케이션을 기동할 때 전달되는 환경 변수의 적용 우선순위는 아래와 같다. 높은 우선순위의 환경 변수가 전달되면, 아래 순위에서 동일한 환경 변수가 전달되어도 무시된다.
1. JVM 옵션: "-D--spring.profiles.active=local"

2. 운영체제 환경 변수: "SPRING_PROFILES_ACTIVE=local"

3. application-{profile}.yml
----------------------------
spring:
  profiles:
    active: local

4. application.yml
------------------
spring:
  profiles:
    active: local
  • 위 3, 4번은 애플리케이션의 상태를 소스 코드에 저장하므로 보안 관점에서 좋은 방법이 아니다. 2번 운영체제 환경 변수를 사용한 방법은 컨테이너에 상태를 전달하는 가장 보편적인 방법으로 권장한다. (아래 자세히 설명한다.)

Spring Boot 환경 변수 획득: Environment::getProperty()

  • Spring Boot의 모든 Spring Bean에서 적용된 환경 변수를 아래와 같이 획득하여 확인할 수 있다.
@Component
class FooComponent(
    val environment: Environment
) {
    val springProfilesActive: String = environment.getProperty("SPRING_PROFILES_ACTIVE") ?: "defaultValue"
}

Spring Boot 환경 변수 획득: @Value

  • @Value를 이용하여 앞서와 마찬가지로 Spring Boot의 모든 빈에서 적용된 환경 변수를 아래와 같이 획득하여 확인할 수 있다.
@Component
class FooComponent(
    @Value("\${spring.profiles.active}") val spring.profiles.active: String
) {
    ...
}

운영체제 환경 변수

  • 운영체제 환경 변수 관리 방식은 실제 운영 환경에서 가장 추천하는 방법이다. 소스 코드에 어떠한 application.yml 파일도 작성하지 않고, 보안으로 격리된 저장소에서 아래와 같이 환경 변수 파일을 형상 관리하고 CI/CD 프로세스에서 주입하면 가장 안전하게 관리할 수 있다.
$ nano foo-local.env
SPRING_APPLICATION_NAME=foo
SPRING_PROFILES_ACTIVE=local
  • 작성된 환경 변수 파일은 로컬 개발 환경에서 아래와 같이 적용할 수 있다.
$ nano run
#!/bin/bash
set -a; source foo-local.env; set +a
./gradlew bootRun

$ chmod +x run
  • IntelliJ IDEA 개발 환경에서는 EnvFile 플러그인을 설치하면 적용이 가능하다. Edit Run Configuration 메뉴에서 Enable EnvFile을 체크한 후 연동할 env 파일을 추가하면 된다.
  • 주입된 환경 변수는 코드 레벨에서 아래와 같이 획득할 수 있다. Spring Bean이 아닌 코드 전역에서 접근 가능하므로 매우 편리하다.
class Env {

    companion object {

        val SPRING_APPLICATION_NAME = System.getenv("SPRING_APPLICATION_NAME") ?: "foo"
        val SPRING_PROFILES_ACTIVE = System.getenv("SPRING_PROFILES_ACTIVE") ?: "local"
    }
}
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함