스프링/스프링부트
@Profile
chanhee01
2023. 9. 30. 22:10
프로필과 외부 설정을 사용해서 각 환경마다 설정값을 다르게 적용하는데, 설정값이 다른 정도가 아니라 각 환경마다 서로 다른 빈을 적용해야하는 상황이 있을 때도 있다.
로컬 개발에서는 로직이 수행되지만 결제가 되지 않고, 운영 환경에서는 실제 결제까지 되는 기능을 예제로 작성할 것이다.
PayClient 인터페이스
public interface PayClient {
void pay(int money);
}
LocalPayClient.class - 로컬 환경
@Slf4j
public class LocalPayClient implements PayClient{
@Override
public void pay(int money) {
log.info("로컬 결제 money={}", money); // 실제 결제 x
}
}
ProdPayClient.class - 운영 환경
@Slf4j
public class ProdPayClient implements PayClient {
@Override
public void pay(int money) {
log.info("운영 결제 money={}", money);
}
}
로컬에서는 실제 결제되지 않고, 운영에서만 실제로 결제된다는 가정 하에 log를 찍어본다.
OrderService.class
@Service
@RequiredArgsConstructor
public class OrderService {
private final PayClient payClient;
public void order(int money) {
// 주문 로직 생략
payClient.pay(money);
}
}
주문을 하는 로직은 생략하고 payClient.pay를 호출하는 로직이다.
PayConfig.class
@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();
}
}
Configuration에 빈을 등록하는데, 두 개 다 등록하면 원하는 대로 설정이 되지 않는다.
@Profile 어노테이션을 사용해서 설정을 할 수 있는데 괄호 안에 default를 입력하면 프로필이 설정되지 않으면 default 값으로 LocalPayClient가 빈으로 등록된다.
@Profile("prod")라고 설정하면 prod라는 프로필을 설정하면 ProdPayClient가 빈으로 등록된다.
실행을 해보면 profile에 따라서 운영 결제, 로컬 결제가 설정된다.