Spring Boot 프로필로 환경 관리하는 가이드 및 활용 팁
개발하다 보면 로컬, 개발 서버, 테스트 서버, 운영 서버 등 각 환경에 따라 설정값을 다르게 관리해야 할 일이 자주 생깁니다. 특히 데이터베이스 접속 정보만 해도 환경마다 따로 지정해 줘야 하죠.
개인 프로젝트나 사이드 작업에서는 이런 설정을 하나로 관리하는 경우가 많지만, 실제 서비스에 가까운 프로젝트나 협업 환경에서는 이를 분리하지 않으면 여러 문제가 발생할 수 있습니다.
Spring Boot 프로필 기능을 통해 이러한 환경별 설정을 깔끔하게 나눌 수 있습니다. 직접 한번 프로필을 설정해 보는 과정을 경험해 보는 것도 큰 도움이 될 거예요.

Spring Boot 프로필별 설정 파일 구성하기
properties 파일로 할 수도 있지만 실무에서는 대부분 yml 파일을 사용하기 때문에 yml 파일을 기준으로 작성했습니다. 실무에서 yml 파일을 많이 사용하는 이유가 궁금하다면 아래에 링크되어 있는 제가 예전에 썼던 글을 봐주세요. 보기 쉽게 썼어요.
src/main/resources/
├── application.yml # 공통 설정
├── application-local.yml # 로컬 환경 설정
├── application-dev.yml # 개발 환경 설정
├── application-qa.yml # 테스트 환경 설정
└── application-prod.yml # 운영 환경 설정
대부분의 프로젝트는 위와 같은 구조로 프로필별 설정 파일을 분리합니다. 이름이 다르거나 뭔가가 빠지거나 추가되거나 하는 정도의 차이입니다.
파일은 직접 생성하면 됩니다.
application.yml 예시
spring:
profiles:
active: local
server:
port: 8080
프로필에 상관없이 동일한 값이 들어가는 설정을 application.yml에 넣습니다. spring.profiles.active의 값을 변경해서 프로필을 손쉽게 바꿀 수 있습니다.
프로필별 application 설정 파일 예시
# application-local.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/myapp_dev
username: dev_user
password: dev_password
# application-dev.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/myapp_dev
username: dev_user
password: dev_password
# application-qa.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/myapp_qa
username: qa_user
password: qa_password
# application-prod.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/myapp_prod
username: prod_user
password: prod_password
DB 접속 정보같이 프로필별로 다른 값이 들어가야 하는 설정을 각 프로필 파일별로 넣습니다.
프로필 활성화 방법
# application.yml
spring:
profiles:
active: local
개발자가 로컬에서 확인할 때는 보통 application.yml에서 active 프로필 값을 변경해서 활성화합니다.
java -jar myapp.jar -Dspring.profiles.active=dev
배포 시에는 위와 같이 jar 파일 실행 시 JVM 시스템 프로퍼티로 지정하는 방법이 가장 일반적입니다. application.yml에 active 프로필이 다른 값으로 지정되어 있더라도 여기에서 지정한 프로필이 우선으로 적용됩니다.
단일 파일에서 프로필 구분하기
# 공통 속성
spring:
profiles:
active: dev
server:
port: 8080
# 프로필별 속성
---
spring:
config:
activate:
on-profile: dev
datasource:
url: jdbc:mysql://localhost:3306/myapp_dev
username: dev_user
password: dev_password
---
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://localhost:3306/myapp_prod
username: prod_user
password: prod_password
위와 같이 1개 파일에서 여러 프로필을 구분할 수도 있습니다. 권장되지 않는 방법이니 ‘이런 것도 있구나’하고 넘어가시면 됩니다.
@Profile 어노테이션
@Component
@Profile("local || dev") // 'local, dev' 프로필 활성화 시에만 빈 등록
public class DevLogger implements Logger {
public void log(String message) {
System.out.println("[DEV] " + message);
}
}
@Component
@Profile("qa") // 'qa' 프로필 활성화 시에만 빈 등록
public class DevLogger implements Logger {
public void log(String message) {
System.out.println("[QA] " + message);
}
}
@Component
@Profile("prod") // 'prod' 프로필 활성화 시에만 빈 등록
public class ProdLogger implements Logger {
public void log(String message) {
System.err.println("[PROD] " + message);
}
}
application.yml에서 커버할 수 없는 경우 @Profile 어노테이션 사용을 고려해 볼 수 있습니다. 빈 생성 시점에만 영향을 미친다는 것을 꼭 기억하고 사용해야 합니다. 대부분의 상황에서는 application.yml에서 다 커버 가능하므로 정말 어쩔 수 없을 경우에만 최소한으로 사용해야 합니다.
프로필 그룹
Spring Boot 2.4부터는 프로필 그룹이라는 걸 사용할 수 있습니다. 동일한 프로필 그룹끼리 공유하는 설정이 있고, 각자 다르게 가져가야 하는 값들은 프로필별로 따로 설정할 수 있습니다. 아래는 프로필 그룹을 유용하게 사용한 예시입니다.
# application-dev.yml
spring:
profiles:
include: database-h2, mock-services # dev 프로필 활성화 시 자동 포함
datasource:
url: jdbc:h2:mem:testdb
# application-prod.yml
spring:
profiles:
include: database-mysql, real-services # prod 프로필 활성화 시 자동 포함
datasource:
url: jdbc:mysql://prod-db:3306/mydb
# application-database-h2.yml
spring:
datasource:
driver-class-name: org.h2.Driver
username: sa
password:
# application-database-mysql.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: prod-secret
잘 쓰면 유용할 것 같고, 잘못 쓰면 괜히 복잡해지기만 할 것도 같습니다.
마무리
“application.yml에 공통 설정 밀어 넣고, 프로필별로 달라지는 값만 각 프로필별 yml 파일에 넣는다.” 이 정도만 알면 대부분 상황에서 충분하지만 프로필 그룹이나 @Profile 어노테이션, 배포 시 프로필 활성화 방법 등에 대해서도 미리 알고 있다면 언젠가 큰 도움이 될 수도 있습니다. 잘못된 내용이 있거나 프로필을 효과적으로 활용한 사례가 있다면 댓글로 공유해 주세요.