Spring Boot 고급 시리즈 4화 – 프로파일 기반 구성 전략 완전 정복
Spring Boot의 @Profile, application-{profile}.yml, 외부 설정 등 다양한 프로파일 기반 구성 전략을 정리합니다. 운영 환경 분리에 따른 실무 적용 예제도 포함되어 있습니다.
Spring Boot는 다양한 실행 환경(개발, 테스트, 스테이징, 운영 등)에 맞춰 설정을 유연하게 분리하고 적용할 수 있도록 프로파일(Profile) 기능을 제공합니다. 실무에서는 이 기능을 얼마나 잘 활용하느냐에 따라 프로젝트의 유지보수성과 안정성이 크게 달라집니다. 이번 글에서는 프로파일을 기반으로 한 구성 전략을 심층적으로 파헤쳐봅니다.
1. 프로파일이란 무엇인가?
Spring의 프로파일은 조건부 Bean 등록 및 설정 파일 분리를 가능하게 해주는 기능입니다.
예를 들어, 개발 환경에서는 H2 DB, 운영 환경에서는 MySQL을 사용해야 할 경우, 각 환경에 맞는 설정을 분리하여 관리할 수 있습니다.
@Configuration
@Profile("dev")
public class DevDataSourceConfig {
// 개발용 설정
}
@Configuration
@Profile("prod")
public class ProdDataSourceConfig {
// 운영용 설정
}
활성화된 프로파일에 따라 해당 Bean만 등록되며, 그 외 설정은 무시됩니다. 이는 복잡한 설정 충돌을 피할 수 있는 실용적인 전략입니다.
2. 프로파일 별 application 설정 분리
Spring Boot는 기본적으로 application.yml 또는 application.properties 파일을 사용합니다. 여기에 다음과 같이 환경별 설정을 분리할 수 있습니다:
application.yml
application-dev.yml
application-prod.yml
application-test.yml
application.yml 내부에 아래와 같이 공통 및 프로파일별 include 구성이 가능합니다.
spring:
profiles:
active: dev
group:
dev:
- common
- local-db
prod:
- common
- prod-db
이 방식은 복잡한 환경 설정을 그룹 기반으로 유연하게 구성할 수 있도록 해주며, 유지보수에 큰 이점을 줍니다.
3. 프로파일 활성화 방법
다양한 방식으로 프로파일을 활성화할 수 있습니다.
- application.yml
- spring: profiles: active: dev
- JVM 옵션
- -Dspring.profiles.active=prod
- 환경 변수
- SPRING_PROFILES_ACTIVE=prod
- 테스트 코드에서 직접 지정
- @ActiveProfiles("test") public class MyServiceTest { ... }
각 방식은 목적과 환경에 따라 다르게 사용되며, 컨테이너 기반 배포 시에는 환경 변수를 통해 동적으로 설정하는 방법이 가장 선호됩니다.
4. 실무 적용 시 고려 사항
- YAML 파일 과도 분리 주의: 환경별로 파일이 너무 많아지면 관리가 어려워집니다. 공통 설정과 차이점만 분리하는 전략이 효과적입니다.
- 프로파일 누락 테스트: default 프로파일이나 fallback 구성이 없을 경우, 프로파일 미지정 시 애플리케이션이 비정상적으로 동작할 수 있습니다.
- CI/CD 연동 고려: GitHub Actions, Jenkins 등에서 환경 변수 자동 주입 구조를 설계해두면 편리합니다.
5. 실전 예시: 운영환경 안전장치 구성
운영 환경에서는 종종 다음과 같은 안전 장치를 구성합니다.
@PostConstruct
public void checkEnvironment() {
if (!Arrays.asList(env.getActiveProfiles()).contains("prod")) {
throw new IllegalStateException("프로덕션 환경에서만 실행 가능");
}
}
이 코드는 특정 작업이 운영 환경에서만 수행되도록 제한하는 로직입니다. 실수로 개발 환경에서 실행되는 것을 방지합니다.
6. 테스트 환경의 격리 전략
테스트 시에는 application-test.yml을 분리하고, 테스트 전용 DB 및 서비스 모킹 설정을 포함합니다.
Spring Boot 3.x 이후부터는 테스트 컨테이너 연동이나 TestConfiguration 등 고급 전략도 적극 활용됩니다.
맺으며
Spring Boot의 프로파일 기능은 단순한 개발 편의성을 넘어서, 실질적인 운영 환경 안전성 확보 및 유지보수성 향상에 핵심적인 역할을 합니다.
단순히 설정 파일을 나눈다는 수준이 아니라, 전략적인 구성과 테스트 전략까지 포함하여 통합적으로 설계하는 것이 중요합니다.