애플리케이션을 만들다보면, 개발환경과 실제 배포환경이 다른 경우는 비일비재하다.
대표적으로, 로컬 개발환경에서는 테스트를 위해 인메모리 DB를 사용할 수 있지만, 서비스 배포환경에서는 인메모리 DB를 잘 사용안한다. (DB가 다운되면 데이터가 다 날아가기때문에)
이렇듯, 개발환경과 배포환경의 분할이 필요할때, 어떻게 해야되는지 알아보자
application-dev.yml
처럼 ‘-(대시)’를 기준으로 프로파일명을 yml 파일 이름안에 포함하는 것이란걸 기억하자active : "dev"
이면, application.yml
기본이 실행되면서, 프로파일이, application-dev.yml
를 찾아 실행시켜준다. active : "test"
이면, 프로파일이, application-test.yml
를 찾아 실행시켜준다.spring:
profiles:
active: "dev"
--spring.profiles.active=dev
으로 지정해줄 수 가 있다.default
임을 알 수 있다.application-.yml
이 default
라는 것이다. 실제로 파일명을 application-.yml
으로 바꿔도 이 yml파일이 기본값으로 실행됨을 알 수 있다. -
(대시)는 구분자를 위한 것 뿐이다.active
된 프로파일이 없다면, 기본값으로 실행된다.--spring.profiles.default
가 기본값이다. 아무런 입력을 하지 않아도 적용된다.spring:
profiles:
default: "none"
default
yml파일에는 활성화 시킬 파일명령어만 입력해주면된다.(active에 여러개의 값이 들어 갈 수도 있다.)yml
파일도 역할에 따라 분할이 가능하다는 것이다.# 예시이다.
spring:
profiles:
active: "local", "common", "test"
물론
yml
분할도 너무 세분화가 많이 하게 되는 경우(Fine-Grained),
다소 번거로울 수 있는데(한줄이 점점 길어지는 현상이 일어남. 특히나, yml의 장점을 못살린다.)
이것을 해결해주는Group기능
도 제공해준다.
group:
을 추가해주고, group
이 되는 profile group명
과, 속하게되는 profile 구성원
을 입력해주면된다.# Group 예시
spring:
profiles:
group:
production: # Group 명
- "proddb" # profile 구성1
- "prodmq" # profile 구성2
# - 이하 생략
production
하나만 실행시키면 된다.--spring.profiles.active=production
을 입력해주면된다.profiles
즉, yml 파일이 있는데, 다른 yml
의 설정에서 일부만 필요한 경우에는 include
명령어를 통해 실행합니다.# Include 예시
spring:
profiles:
include:
- "common"
- "local"
yaml
이 실행되며, default yaml 설정이 제일 우선시 되며, 그 이후 default에 추가되지 않은 설정은 common
, local
순으로 우선시 되어 적용이 된다. yaml
을 대체하는 것 대신, 추가하여 사용할 수도 있다.언제 사용하게 될지 모르겠지만, 그래도 숙지는 해주자.
# application-oauth2.yml
spring:
profiles:
include: naver, kakao, google
---
spring:
profiles: naver
security:
oauth2:
client:
registration:
naver:
# client id, client-secret, redirect-uri, scope, client-name
provider:
naver:
# authorization_uri, token_uri, user-info-uri, user_name_attribute
---
spring:
profiles: kakao
security:
oauth2:
client:
registration:
naver:
# client id, client-secret, redirect-uri, scope, client-name
provider:
naver:
# authorization_uri, token_uri, user-info-uri, user_name_attribute
---
spring:
profiles: google
security:
oauth2:
client:
registration:
naver:
# client id, client-secret, redirect-uri, scope, client-name
provider:
naver:
# authorization_uri, token_uri, user-info-uri, user_name_attribute
spring.profiles
가 deprecated
되고 spring.config.activate.on-profile
로 변경됨어찌보면, 다들 스프링 부트 2.4이 되고나서 부터 spring.config.activate.on-profile
를 사용하라고 권장하지만, 공식문서에는 다음과 같이 적혀 있다.
애플리케이션을 설정할때, 가끔 특정한 조건에서는 지정된 yaml 집합만 활성화하는 것이 필요한 경우가 있을 텐데, 그때 사용하는 것이다. spring.config.activate.*
이다.
게다가, spring.config.activate.*
설정에는 2가지 종류가 있다.
on-profile
on-cloud-platform
둘 다 해당 파일만 사용하고 싶을 때 사용하는 것으로 큰 차이는 크게 없으며, on-cloud-platform
의 경우 cloud-platform 설정파일을 넣어주기만 하면 된다.
spring.profiles.active
랑 spring.config.activate.on-profile
은 같이 사용할 수 없다.# 잘못된 문서 예시
spring:
config:
activate:
on-profile: "prod"
profiles:
active: "metrics"
spring.config.activate.on-profile
에 여러개의 yml파일이 올 수 있는 지 확인해보자spring:
config:
activate:
on-profile: s3 # or s3, h2
spring:
profiles:
active: h2, s3
그럼 대체
spring.config.activate
의on-profile
은 언제 사용하는 것일까?
@Configuration(proxyBeanMethods = false)
, @Profile("프로파일명")
을 통해 부분적으로 적용도 가능하게 보인다.