💡 개요
Spring에서 실제 배포 환경과 로컬 환경 등 각각 다른 설정을 적용해야 할 때 사용할 수 있는 @Profile과 @ActiveProfiles에 대해 정리해 보자.
📕 @Profiles
@Profiles 어노테이션은 주로 특정 빈을 활성화시킬 때 사용한다.
그렇기 때문에 @Configuration 이나 @Componet, @Service, @Repository 와 함께 사용한다.
다음은 실제 배포 환경에서만 사용해야 할 빈의 예시 코드이다.
@Profile("prod")
@Component
public class ProdDataSource implements DataSource {
// 운영 환경 전용 데이터 소스 설정
}
만약 현재 활성화된 프로필이 test나 dev라면 ProdDataSource 는 빈 객체로 등록되지 않는다.
📕 @ActiveProfiles
@ActiveProfiles 어노테이션은 테스트 코드 동작 시, 어떤 프로필을 사용할지 설정할 때 사용한다.
그렇기 때문에 주로 @SpringBootTest와 함께 사용된다.
@SpringBootTest
@ActiveProfiles("test")
public class ServiceTest {
@Autowired
private Service service;
@Test
public void test() {
// 'test' 프로필이 활성화된 상태에서 실행
}
}
🚀 @ActiveProfiles과 application.yml의 관계
@ActiveProfiles는 테스트에서 특정 프로필을 강제로 활성화하는 역할을 한다.
즉, application.yml의 spring.profiles.active 설정과 상관없이 테스트 코드에서 지정한 프로필을 사용한다.
@SpringBootTest
@ActiveProfiles("test")
public class ServiceTest {
@Autowired
private DataSource dataSource;
@Test
public void test() {
// 'test' 프로필이 활성화된 상태에서 실행
}
}
application.yml에서 spring.profiles.active=dev 인 경우
위 테스트 코드를 실행할 때, 기본 프로필이 dev인 경우엔 DevDataSource가 주입되어야 하지만, @ActiveProfiles 이 "test" 로 설정되어 있기 때문에 TestDataSource 가 주입된다.
즉, @ActiveProfile은 활성화된 프로필보다 우선순위가 더 높기 때문에 테스트에서는 @ActiveProfiles가 application.yml의 설정을 무시하고, 지정한 프로필을 활성화한다.
📕 프로필 활성화
참고로 프로필을 활성화시킬 땐 application.yml을 통해 설정할 수도, 명령어를 사용해 설정할 수 있다.
터미널에서 명령어를 사용해 활성화 프로필 설정
java -jar -Dspring.profiles.active=dev myapp.jar
application.yml에서 기본 프로필 설정
spring:
profiles:
active: dev
application.yml에서 여러 개의 프로필 설정
# 기본 설정
server:
port: 8080
---
# dev 환경 설정
spring:
profiles: dev
server:
port: 8081
---
# prod 환경 설정
spring:
profiles: prod
server:
port: 9090
그리고 application.yml (기본 프로필), application-dev.yml(dev 프로필), application-prod.yml(prod 프로필) 와 같이 파일명으로 프로필 별 환경변수를 설정할 수 있다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.03.02 - Thread 조정 (종료) (1) | 2025.03.02 |
---|---|
[개발 일기] 2025.03.01 - Redis 직렬화 (1) | 2025.03.01 |
[개발 일기] 2025.02.26 - Dangling quantifier '+’ 에러 (0) | 2025.02.26 |
[개발 일기] 2025.02.25 - 전략 패턴 (0) | 2025.02.25 |
[개발 일기] 2025.02.24 - == 연산자 vs Objects.isNull() (0) | 2025.02.24 |