본문 바로가기
Dev/Spring Framework

『Spring Boot』 application.yml과 Profile

by 세대교체 2024. 12. 28.

 

전 프로젝트에서는 "Profile 별로 모든 설정"을 각각 관리했는데 이번 프로젝트에서는 "공통 설정 + Profile별 설정"을 분리해서 관리한다. 프로젝트마다 환경을 다루는 방법에 차이가 존재하는데 이번 기회에 "공통 설정 + Profile별 설정"에 대해 알아볼 겸 정리하려 해 본다.

 

 

application.yml과 Profile

application.yml 혹은 application.propertiesSpring Boot 애플리케이션 구동 시 자동으로 로드되는 구성 파일이다.

Key-Value 혹은 yml 포맷을 통해 애플리케이션에서 사용할 설정 값을 정의한다.

설정 값 예시
서버 포트
DB 접속 정보
로그 레벨 설정
외부 API Token 정보

 

 

application-{profile}.yml

일반적으로 운영(Prod), 개발(Dev), 로컬(Local) 환경별로 서로 다른 설정이 필요할 경우, application-{profile}.yml 형식으로 파일을 구성한다.

예시
application-local.yml
application-dev.yml
application-prod.yml

 

Spring Boot가 구동되면 우선 공통 설정 파일(application.yml)을 먼저 읽어 들이고, 이후 활성화된 Profile(application-{profile}.yml)을 덮어쓰는 방식으로 설정을 완료한다.

 

우선순위

1. Jar 내부의 application.yml

2. Jar 내부의 application-{profile}.yml

3. Jar 외부의 application.yml

4. Jar 외부의 application-{profile}.yml

 

 

profile 별 환경설정 분리 시 장단점

Profile 별로 모든 설정을 각각 관리

장점 단점
Profile 별로 설정이 완전히 분리되어 있어 독립적인 설정 보장을 받기 쉽다. 공통 설정(예: 서버 포트, 로깅 레벨, Swagger 설정) 등이 변경되었을 때, 모든 Profile 파일에서 중복된 내용을 일일이 수정해야 한다.
  설정 항목이 많아질수록 유지보수가 번거롭다.

 

 

 

공통 설정 + Profile별 설정 분리 관리 방법

공통 설정을 단 한 곳(application.yml)에서만 변경하면 되므로 유지보수가 편리하고, 각 Profile이 달라야 하는 설정만 추가로 관리할 수 있다.

 

application.yml + application-{profile}.yml

공통 설정 파일 Profile별 설정 파일
application.yml, 모든 환경에서 공통적으로 사용되는 설정을 정의 application-{profile}.yml, 환경에 따라 달라지는 설정만 정의
서버 포트, 로깅 설정, Swagger, 배너 등 DB 연결 정보, 외부 API 엔드포인트, 보안 토큰 등

 

 

@Value 사용 예시

@Value 어노테이션을 이용하면 설정 파일에 정의된 Key를 직접 읽어 필드에 주입할 수 있다.

 

위 클래스는 Spring의 Bean으로 등록해야 하므로 @Component 어노테이션을 선언해야 하며, 설정 Key가 잘못되면(Spring Boot가 찾아낼 수 없으면) 애플리케이션 구동 시점에 에러가 발생할 수 있다.

 

 

@ConfigurationProperties 사용 예시

@ConfigurationProperties(prefix = "message.api")를 활용하면 객체 형태로 설정을 한꺼번에 바인딩할 수 있다.

 

 

공통 설정 로드테스트

application-dev.yml을 활성화하여 테스트할 경우 @ActiveProfiles("dev")를 사용한다.

 

 

spring.config.import

Spring Boot 2.4부터 spring.config.import 속성을 이용해 별도의 설정 파일(.properties 등)을 추가로 불러올 수 있다.

 

dev-config.properties 파일에 외부 API 호출 정보를 정의할 수 있다.