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에 따라서 운영 결제, 로컬 결제가 설정된다.