@Profile
@Profile을 활용하면 각 환경에 맞는 스프링 빈을 등록할 수 있어 로컬 개발 환경에서는 가짜 결제 기능을 제공하는 빈을, 운영 환경에서는 실제 결제 기능을 제공하는 빈을 등록할 수 있습니다. 이를 위해 각 환경에 맞는 프로필을 설정하고, 해당 프로필에 따라 필요한 빈을 정의할 수 있습니다. 예를 들어 로컬 환경에서는 @Profile("local")을 사용하여 가짜 결제 서비스를 구현하고, 운영 환경에서는 @Profile("prod")을 사용하여 실제 결제 서비스를 구현하는 방식으로 설정할 수 있습니다.
해당 예시를 간단하게 코드로 구현해보겠습니다.
Pay 관련 인터페이스
public interface PayClient {
void pay(int money);
}
DI를 적극 활용하기 위해 인터페이스를 사용
로컬에서 사용할 가짜 결제 기능
@Slf4j
public class LocalPayClient implements PayClient {
@Override
public void pay(int money) {
log.info("로컬 환경에서 결제 money={}", money);
}
}
운영 환경에서 사용할 결제 기능
@Slf4j
public class ProdPayClient implements PayClient {
@Override
public void pay(int money) {
log.info("운영 환경에서 결제 money={}", money);
}
}
간단한 서비스 계층
@Service
@RequiredArgsConstructor
public class OrderService {
private final PayClient payClient;
public void order(int money) {
payClient.pay(money);
}
}
간단한 구현이라서 서비스 계층만 있습니다.
결제 관련 환경 설정
@Slf4j
@Configuration
public class PayConfig {
@Bean
@Profile("default")
public LocalPayClient localPayClient() {
log.info("LocalPayClient 빈 등록");
return new LocalPayClient();
}
@Bean
@Profile("prod")
public ProdPayClient prodPayClient() {
log.info("ProdPayClient 빈 등록");
return new ProdPayClient();
}
}
- @Profile 애노테이션을 사용하면 해당 프로필이 활성화된 경우에만 빈을 등록합니다.
- default 프로필(기본값)이 활성화 되어 있으면 LocalPayClient 를 빈으로 등록합니다.
- prod 프로필이 활성화 되어 있으면 ProdPayClient 를 빈으로 등록합니다.
간단한 주문 서비스 실행 클래스
@Component
@RequiredArgsConstructor
public class OrderRunner implements ApplicationRunner {
private final OrderService orderService;
@Override
public void run(ApplicationArguments args) throws Exception {
orderService.order(1000);
}
}
프로필 변경 방법
1. 설정 파일에서 변경(application.properties or application.yml )
spring.profiles.active=prod
2. IDE에서 옵션 추가
Edit Configurations에서 사진 처럼 옵션 값 추가
❗❗커맨드 라인 인수와 JVM 옵션 명령어는 서로 다르므로, 사용할 때 주의가 필요합니다❗❗
3. Jar 실행 시 옵션 추가
java -jar xxx.jar --spring.profiles.active=prod // 커맨드 라인 옵션 인수를 사용하여 프로필 설정
java -jar xxx.jar -Dspring.profiles.active=prod // JVM 속성을 추가하여 프로필 설정
4. 테스트 코드에서 변경
@ActiveProfiles 애노테이션은 테스트 클래스에서 사용되며, 해당 테스트가 실행될 때 활성화할 Spring 프로필을 지정하는 데 사용됩니다.
@ActiveProfiles("prod")
public class ProfileTest {
}
결론
@Profile을 사용하면 각 환경별로 외부 설정 값을 분리하는 것뿐만 아니라, 등록되는 스프링 빈도 분리할 수 있습니다. 이를 통해 개발, 테스트, 운영 환경에서의 유연한 설정과 관리를 할 수 있습니다.
'Spring' 카테고리의 다른 글
[Spring Boot] 액추에이터(Actuator) 정리 (2) | 2024.10.16 |
---|---|
[Spring Boot] spring.jpa.open-in-view is enabled by default 경고 메시지 (1) | 2024.10.15 |
[Spring Boot] 다양한 외부 설정 방법 #2 - Environment (2) | 2024.10.13 |
[Spring Boot] 다양한 외부 설정 방법 #1 (2) | 2024.10.13 |
[Sprign Boot] Auto Configuration 정리 - @Conditaional (2) | 2024.10.10 |