본문 바로가기
Spring

[Spring Boot] 다양한 외부 설정 방법 #4 - @Profile

by 개미가되고싶은사람 2024. 10. 15.

@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을 사용하면 각 환경별로 외부 설정 값을 분리하는 것뿐만 아니라, 등록되는 스프링 빈도 분리할 수 있습니다. 이를 통해 개발, 테스트, 운영 환경에서의 유연한 설정과 관리를 할 수 있습니다.