[Spring Boot] Spring Profiles

Spring Boot

Language :

일반적으로 서버 개발 환경은 Local, Dev, Staging, Product로 이루어져 있다.

각 환경에 따라 데이터베이스 연결이나 토큰 등 설정값이 다르기 때문에 다중 환경에 대한 관리는 필수적이다.

Spring Boot에서는 Profiles를 통해 다중 환경을 관리할 수 있다.

프로파일(Profile) 설정 파일

개발 환경에 따른 설정값들을 모아놓은 파일이다.

resources 폴더 내에 위치하며 application.properties 또는 application.yml 파일로 관리한다.

Project
└ src
   └ main
      └ resources
         └ application.yml

설정 파일명 규칙

application-{profile_name}.properties
application-{profile_name}.yml

설정 방법 1. 프로파일별 설정 파일 생성

application.yml

  • 모든 프로필에 공통적으로 들어가는 변수들을 설정한다.
  • spring.profiles.active에 활성화할 profile_name을 지정한다. 예제에서는 시스템 환경 변수를 읽어와서 설정하도록 했다.
spring:
    profiles:
        active: ${BACKEND_MODE}
server:
    port: 8081
  • 예시) .env 파일에 시스템 환경 변수를 설정 (Docker)
BACKEND_MODE=dev

application-dev.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/dico
    driver-class-name: com.mysql.jdbc.Driver
    username: test_user
    password: test_pwd
api:
  base-url: http://localhost/api/v1/auth
  token: 9OySm75tZHjg3jUTgaE

application-stage.yml

spring:
  datasource:
    url: jdbc:mysql://stage-mysql:3306/dico
    driver-class-name: com.mysql.jdbc.Driver
    username: stage_user
    password: stage_pwd
api:
  base-url: https://example.com/api/v1/auth
  token: 80Xycvd9DlrNC7xM5Rz

application-prod.yml

spring:
  datasource:
    url: jdbc:mysql://prod-mysql:3306/dico
    driver-class-name: com.mysql.jdbc.Driver
    username: prod_user
    password: prod_pwd
api:
  base-url: https://example.com/api/v1/auth
  token: Qr8yYKNI0wASP7wjUCz

이 경우 stage와 prod 파일은 .gitignore 설정해서 GitHub에 올라가지 않게 하고, CI/CD를 통해 관리하여 보안성을 높일 수 있다.

설정 방법 2. 설정 파일 하나로 각 프로파일 관리

application.yml

  • 한 파일 안에서 '---' 으로 프로파일을 구분하여 작성한다.
spring:
  profiles:
    active: ${BACKEND_MODE}
---

spring:
  config:
    activate:
      on-profile: dev
# ... dev 설정값들
---

spring:
  config:
    activate:
      on-profile: stage
# ... stage 설정값들
---

spring:
  config:
    activate:
      on-profile: prod
# ... prod 설정값들

설정 방법 3. 프로파일 하나만 사용

application.yml

  • 환경별로 다른 설정값들은 시스템 환경 변수로 설정한다.
  • OS 시스템 환경 변수를 전부 생성해줘야 한다는 단점이 있다.
server:
    port: 8081
spring:
  datasource:
    url: ${MUSQL_URL}
    driver-class-name: com.mysql.jdbc.Driver
    username: ${MYSQL_USER}
    password: ${MYSQL_PASSWORD}
api:
  base-url: ${API_BASE_URL}
  token: ${API_TOKEN}

바인딩 방법 (Bean Property Annotation)

@Profile 사용

  • 정의된 프로파일이 활성화되어 있으면 해당 컴포넌트(Component)가 빈(Bean)에 등록 된다.
  • 동적 바인딩으로, 런타임(프로그램이 실행되고 동작하는 단계) 시에 동작한다.
import org.springframework.context.annotation.Profile
import org.springframework.stereotype.Service

@Service
@Profile("dev") // 프로파일 dev가 활성화되면 빈 등록된다.
class DevMailerServiceImpl : MailerService { }

@Service
@Profile("stage") // 프로파일 stage가 활성화되면 빈 등록된다.
class StageMailerServiceImpl : MailerService { }

@Service
@Profile("prod") // 프로파일 prod가 활성화되면 빈 등록된다.
class ProdMailerServiceImpl : MailerService { }
@Service
class HelpService(
    private val mailerService: MailerService  // 활성화된 프로파일에 따라 MailerService 구현체가 달라진다.
) { }

@Value 사용

  • 활성화된 프로파일에 설정된 값을 변수에 주입한다.
  • 정적 바인딩으로, 컴파일(소스 코드를 실행 가능한 형태로 변환하는 단계) 시점에 동작한다.
  • 예제에서는 프로파일이 dev가 활성화되어 있으므로 변수 token에 'Qr8yYKNI0wASP7wjUCz'이 주입된다.
@Component
class ApiProvider(
    @Value("\${api.base-url}") private val baseUrl: String,
    @Value("\${api.token}") private val token: String
) {

Reference

https://www.springcloud.io/post/2022-09/spring-boot-profiles

민갤

Back-End Developer

백엔드 개발자입니다.