-
프로필과 외부 설정을 사용해서 각 환경마다 설정값을 다르게 적용하는데, 설정값이 다른 정도가 아니라 각 환경마다 서로 다른 빈을 적용해야하는 상황이 있을 때도 있다.
로컬 개발에서는 로직이 수행되지만 결제가 되지 않고, 운영 환경에서는 실제 결제까지 되는 기능을 예제로 작성할 것이다.
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에 따라서 운영 결제, 로컬 결제가 설정된다.
'스프링 > 스프링부트' 카테고리의 다른 글
헬스 정보 - health (0) 2023.10.01 액츄에이터와 액츄에이터 엔드포인트 (0) 2023.10.01 YAML (0) 2023.09.30 @ConfigurationProperties - 외부 설정 사용 (0) 2023.09.30 @Value - 외부 설정 사용 (0) 2023.09.30