1. 개요

이 짧은 사용방법(예제)에서는 @ConditionalOnProperty 어노테이션 의 주요 목적에 대해 설명 합니다.

먼저 @ConditionalOnProperty무엇인지에 대한 약간의 배경 지식으로 시작하겠습니다 . 그런 다음 작동 방식과 제공하는 기능을 이해하는 데 도움이 되는 몇 가지 실용적인 예를 살펴보겠습니다.

2. @ConditionalOnProperty 의 목적

일반적으로 Spring 기반 애플리케이션을 개발할 때 구성 속성의 존재와 값에 따라 조건부로 일부 빈생성 해야 할 수도 있습니다 .

예를 들어 속성 값을 "prod" 또는 "test"로 설정했는지 여부에 따라 프로덕션 또는 테스트 데이터베이스를 가리키도록 DataSource을 등록할 수 있습니다 .

다행히도 이를 달성하는 것은 언뜻 보기에 그리 어렵지 않습니다. Spring 프레임워크는 이러한 목적을 위해 정확하게 @ConditionalOnProperty 어노테이션을 제공합니다 .

간단히 말해서 @ConditionalOnProperty 는 환경 속성이 있고 특정 값이 있는 경우에만 Bean 등록을 가능하게 합니다. 기본적으로 지정된 속성은 정의되어야 하며 false 와 같지 않아야 합니다 .

이제 @ConditionalOnProperty 어노테이션 의 목적에 익숙해 졌으므로 작동 방식을 자세히 살펴보겠습니다.

3. 실제 @ConditionalOnProperty 어노테이션

@ConditionalOnProperty 사용을 예시 하기 위해 기본 알림 시스템을 개발할 것입니다. 지금은 간단하게 하기 위해 이메일 알림을 보내려고 한다고 가정해 보겠습니다.

먼저 알림 메시지를 보내는 간단한 서비스를 만들어야 합니다. 예를 들어 NotificationSender 인터페이스를 고려하십시오 .

public interface NotificationSender {
    String send(String message);
}

다음으로 이메일을 보내기 위한 NotificationSender 인터페이스 구현을 제공하겠습니다 .

public class EmailNotification implements NotificationSender {
    @Override
    public String send(String message) {
        return "Email Notification: " + message;
    }
}

이제 @ConditionalOnProperty 어노테이션 을 사용하는 방법을 살펴보겠습니다 . 하자의 구성 NotificationSender의 속성 경우에만로드됩니다 같은 방법 Bean notification.service이 정의된다 :

@Bean(name = "emailNotification")
@ConditionalOnProperty(prefix = "notification", name = "service")
public NotificationSender notificationSender() {
    return new EmailNotification();
}

우리가 볼 수 있듯이 접두사이름 속성은 확인해야 하는 구성 속성을 나타내는 데 사용됩니다 .

마지막으로 퍼즐에서 마지막으로 누락된 조각을 추가해야 합니다. application.properties 파일 에서 사용자 정의 속성을 정의해 보겠습니다 .

notification.service=email

4. 고급 구성

이미 배웠 듯이 @ConditionalOnProperty 어노테이션을 사용하면 구성 속성의 존재 여부에 따라 조건부로 빈을 등록할 수 있습니다.

그러나 우리는 이 어노테이션으로 그 이상을 할 수 있습니다 . 자, 탐구해보자!

예를 들어 SMS 알림을 보낼 수 있는 서비스와 같은 다른 알림 서비스를 추가한다고 가정해 보겠습니다.

그렇게 하려면 다른 NotificationSender 구현 을 만들어야 합니다.

public class SmsNotification implements NotificationSender {
    @Override
    public String send(String message) {
        return "SMS Notification: " + message;
    }
}

두 가지 구현이 있으므로 @ConditionalOnProperty사용하여 조건부 로 올바른 NotificationSender을 로드하는 방법을 살펴보겠습니다 .

이를 위해 어노테이션은 haveValue 속성을 제공 합니다. 아주 흥미롭게도 이것은 특정 빈이 Spring 컨테이너에 추가되기 위해 속성이 가져야 하는 값을 정의합니다 .

이제 컨텍스트에서 SmsNotification 구현 을 등록하려는 조건을 지정해 보겠습니다 .

@Bean(name = "smsNotification")
@ConditionalOnProperty(prefix = "notification", name = "service", havingValue = "sms")
public NotificationSender notificationSender2() {
    return new SmsNotification();
}

haveValue 속성을 사용하여 notification.servicesms 로 설정된  경우에만 SmsNotification 을 로드하려는 것을 분명히 했습니다 .

그 언급이의 가치 @ConditionalOnProperty는 라는 또 다른 속성이 matchIfMissing을 . 이 속성은 속성을 사용할 수 없는 경우 조건이 일치해야 하는지 여부를 지정합니다 .

이제 모든 조각을 모아서 모든 것이 예상대로 작동하는지 확인하는 간단한 테스트 케이스를 작성해 보겠습니다.

@Test
public void whenValueSetToEmail_thenCreateEmailNotification() {
    this.contextRunner.withPropertyValues("notification.service=email")
        .withUserConfiguration(NotificationConfig.class)
        .run(context -> {
            assertThat(context).hasBean("emailNotification");
            NotificationSender notificationSender = context.getBean(EmailNotification.class);
            assertThat(notificationSender.send("Hello From Baeldung!")).isEqualTo("Email Notification: Hello From Baeldung!");
            assertThat(context).doesNotHaveBean("smsNotification");
        });
}

5. 결론

이 짧은 사용방법(예제)에서는 @ConditionalOnProperty 어노테이션 을 사용하는 목적을 강조했습니다 . 그런 다음 실제 예제를 통해 조건부로 Spring 빈을 로드하는 방법을 보여주었습니다.

항상 그렇듯이 이 사용방법(예제)의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .

Generic footer banner