[Spring Boot] Spring Profiles
Spring Boot일반적으로 서버 개발 환경은 Local, Dev, Staging, Product로 이루어져 있다.
각 환경에 따라 데이터베이스 연결이나 토큰 등 설정값이 다르기 때문에 다중 환경에 대한 관리는 필수적이다.
Spring Boot에서는 Profiles를 통해 다중 환경을 관리할 수 있다.
프로파일(Profile) 설정 파일
개발 환경에 따른 설정값들을 모아놓은 파일이다.
resources 폴더 내에 위치하며 application.properties 또는 application.yml 파일로 관리한다.
text
Project
└ src
└ main
└ resources
└ application.yml
설정 파일명 규칙
text
application-{profile_name}.properties
text
application-{profile_name}.yml
설정 방법 1. 프로파일별 설정 파일 생성
application.yml
- 모든 프로필에 공통적으로 들어가는 변수들을 설정한다.
- spring.profiles.active에 활성화할 profile_name을 지정한다. 예제에서는 시스템 환경 변수를 읽어와서 설정하도록 했다.
yml
spring:
profiles:
active: ${BACKEND_MODE}
server:
port: 8081
- 예시) .env 파일에 시스템 환경 변수를 설정 (Docker)
text
BACKEND_MODE=dev
application-dev.yml
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
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
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
- 한 파일 안에서 '---' 으로 프로파일을 구분하여 작성한다.
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 시스템 환경 변수를 전부 생성해줘야 한다는 단점이 있다.
yml
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)에 등록 된다.
- 동적 바인딩으로, 런타임(프로그램이 실행되고 동작하는 단계) 시에 동작한다.
kotlin
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 { }
kotlin
@Service
class HelpService(
private val mailerService: MailerService // 활성화된 프로파일에 따라 MailerService 구현체가 달라진다.
) { }
@Value 사용
- 활성화된 프로파일에 설정된 값을 변수에 주입한다.
- 정적 바인딩으로, 컴파일(소스 코드를 실행 가능한 형태로 변환하는 단계) 시점에 동작한다.
- 예제에서는 프로파일이 dev가 활성화되어 있으므로 변수 token에 'Qr8yYKNI0wASP7wjUCz'이 주입된다.
kotlin
@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