1. 프로파일이란?
- 스프링 프로파일은 애플리케이션의 실행 환경별로 다른 설정을 적용할 수 있게 해주는 메커니즘입니다.
- 개발, 테스트, 운영 등 각 환경에 맞는 설정과 빈을 구성할 수 있습니다.
2. 프로파일의 용도
- 환경별 데이터베이스 설정 분리 (개발 DB, 운영 DB)
- 외부 서비스 연동 설정 관리 (테스트용 Mock, 실제 API)
- 로깅 레벨 환경별 구성
- 캐시 설정 분리
- 모니터링 도구 환경별 활성화
3. 프로파일 활성화 방법
- 프로파일 활성화 방법은 다음과 같이 여러 가지가 있습니다
- 또한 다중 프로파일 활성화가 가능합니다.
- 활성화된 프로파일이 없으면 기본 프로파일이 활성화됩니다.
- 기본 프로파일의 이름은 default이며,
spring.profiles.default
Environment 속성을 사용하여 기본 프로파일의 이름을 변경할 수 있습니다.
- 기본 프로파일의 이름은 default이며,
3.1 환경 변수로 지정
export SPRING_PROFILES_ACTIVE=dev,local
3.2 JVM 아규먼트로 지정
java -jar -Dspring.profiles.active=dev myapp.jar
3.3 application.yml에서 지정
spring:
profiles:
active: dev
3.4 @ActiveProfiles 어노테이션
@ActiveProfiles
어노테이션으로 프로파일을 활성화 할 수 있습니다.
// 테스트에서 사용
@SpringBootTest
@ActiveProfiles("test")
class MyTest {
// ...
}
// Configuration에서 사용
@Configuration
@ActiveProfiles("dev")
public class AppConfig {
// ...
}
4. 프로파일 설정 파일 구성
4.1 파일 명명 규칙
- 스프링 부트는 프로파일별 설정 파일을 자동으로 감지하고 로드하는 규칙을 가지고 있습니다.
- 기본 설정 파일:
- application.properties 또는 application.yml
- 모든 환경에서 공통으로 사용되는 기본 설정을 여기에 작성합니다.
- 특정 프로파일이 활성화되면 해당 프로파일의 설정이 이 기본 설정을 덮어씁니다.
- 프로파일별 설정 파일:
application-{profile}.properties
또는application-{profile}.yml
{profile}
부분에 실제 프로파일 이름이 들어갑니다.- 예: development 프로파일을 활성화하면
application-development.yml
이 로드됩니다.
- 설정 로드 우선순위:
- 프로파일 설정 파일이 기본 설정 파일보다 우선순위가 높습니다.
- 예: dev 프로파일 활성화시
application-dev.yml
의 설정이application.yml
의 동일 설정을 덮어씁니다.
src/main/resources/
├── application.yml # 공통 설정
├── application-dev.yml # 개발 환경
├── application-prod.yml # 운영 환경
└── application-test.yml # 테스트 환경
4.2 설정 파일 작성 방법
4.2.1 단일 파일 방식
# 기본 설정
server:
port: 8080
---
# dev 프로파일 설정 시작
spring:
config:
activate:
on-profile: dev
server:
port: 8081
---
# prod 프로파일 설정 시작
spring:
config:
activate:
on-profile: prod
server:
port: 443
- YAML 파일에서
spring.config.activate.on-profile
은 문서 구분자(---
)와 함께 사용하여 프로파일별 설정 블록을 구분합니다. - 이렇게 하나 의 YAML 파일 안에서 여러 프로파일의 설정을 관리할 수 있습니다.
spring.config.activate.on-profile
에 명시된 프로파일이 활성화되면 해당 블록의 설정이 적용됩니다.
- 문서 구분자(
---
) 사용 필수입니다. - 각 블록의 시작에
spring.config.activate.on-profile
지정합니다. - 프로파일 미지정 블록은 공통 설정으로 적용됩니다.
4.2.2 분리 파일 방식 (application-dev.yml)
spring:
datasource:
url: jdbc:h2:mem:testdb
username: sa
password:
5. @Profile 어노테이션 활용
@Profile
어노테이션은 특정 프로파일이 활성화됐을 때만 빈을 등록하거나 설정을 활성화하는 조건부 구성을 가능하게 합니다.- 모든 @Component, @Configuration 또는 @ConfigurationProperties는 @Profile로 표시하여 언제 로드될지 제한할 수 있습니다.
5.1 클래스 레벨 적용
@Configuration
@Profile("dev")
public class DevConfig {
// ...
}
- dev 프로파일에서만 이 설정 클래스의 모든 빈이 등록됨.
5.2 메소드 레벨 적용
@Configuration
public class DatabaseConfig {
@Bean
@Profile("dev")
public DataSource devDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.build();
}
}
- dev 프로파일에서만 이 devDataSource 빈이 등록됨.
5.3 프로파일 표현식
- @Profile은 논리 연산자를 사용한 복잡한 조건 설정이 가능합니다
@Profile("!prod") // prod가 아닌 경우
@Profile("dev & local") // dev와 local 모두 활성화된 경우
@Profile("dev | stage") // dev나 stage 중 하나라도 활성화된 경우
6. 프로파일 우선순위
- ServletConfig 파라미터
- ServletContext 파라미터
- JNDI (java:comp/env/spring.profiles.active)
- JVM 시스템 프로퍼티 (-Dspring.profiles.active)
- 환경 변수 (SPRING_PROFILES_ACTIVE)
- application.yml의 spring.profiles.active
7. 프로파일 추가하기(spring.profiles.include
)
- 레퍼런스
- 때로는 기존 활성 프로파일을 대체하지 않고 추가하는 속성이 유용한 경우가 있습니다.
spring.profiles.include
속성은spring.profiles.active
속성으로 활성화된 프로파일 위에 활성 프로파일을 추가하는 데 사용할 수 있습니다.- 추가된 프로파일은 모든
spring.profiles.active
프로파일보다 먼저 추가됩니다.
7.1 주의사항
# ❌ 불가능 - application-dev.yml 같은 프로파일 특정 파일에서
spring:
profiles:
include: common # 이렇게 사용 불가
---
# ❌ 불가능 - 프로파일 특정 문서 블록에서
spring:
config:
activate:
on-profile: dev
profiles:
include: common # 이렇게 사용 불가
---
# ✅ 가능 - application.yml의 기본 문서에서
spring:
profiles:
include: common # 이렇게 사용 가능
spring.profiles.include
는 전역적으로 항상 포함되어야 하는 프로파일을 정의하는 용도이기 때문에, 특정 프로파일이 활성화될 때만 동작하는 조건부 설정에서는 사용할 수 없습니다.