Programming/Spring Boot

@Conditional 어노테이션의 기능과 확장(@ConditionalOnXxx)

Jan92 2023. 7. 18. 01:23
반응형

@Conditional 어노테이션의 기능과 확장

@Conditional Annotation

'@Conditional' 어노테이션은 Spring 4.0(released on 2013)부터 제공되기 시작했는데요.

@Configuration, @Component, @Bean 어노테이션과 함께 사용되며, 이름 그대로 특정 조건을 만족하는지를 구별하는 기능입니다.

직접 사용할 일이 많을 것 같지는 않았지만 spring boot 자동 구성에 중요한 역할을 하는 당, 흥미 있는 기능이라고 생각되어 정리해 보았습니다.

 

아래 내용에서는 @Conditional 어노테이션을 직접 구현 및 적용하여 조건에 따라 동작하는지 여부를 살펴보고, 스프링 부트에서 확장된 @ConditionalOnXxx 어노테이션 기능을 통해 자동 구성이 실행되는 부분에 대해 간단하게 살펴보겠습니다.

 

 


기본적인 구현(Condition interface)

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class SomethingCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String something = context.getEnvironment().getProperty("something");
        return "true".equals(something);
    }
}

(Condition 인터페이스를 구현한 SomethingCondition 클래스)

 

@Conditional 어노테이션을 적용하기 위해 조건을 판별할 클래스를 생성하는데, 해당 클래스는 예시와 같이 Condition interface를 구현해야 합니다.

 

Condition interface

Condition 인터페이스에는 boolean 타입을 반환하는 matches()라는 메서드가 선언되어 있는데요.

클래스에서 구현된 matches 메서드가 조건에 만족하여 true를 반환하면 동작하고, false를 반환하면 동작하지 않습니다.

(해당 메서드의 파라미터로 들어오는 ConditionContext에는 스프링 컨테이너, 환경정보 등이 담겨있으며, AnnotatedTypeMetadata에는 어노테이션 메타 정보가 담겨 있습니다.)

 

* SomethingCondition 클래스에서는 환경 정보(자바 시스템 속성, 환경 변수)에 'something=true'가 있을 때만 동작하는 조건을 지정하였습니다.

 

 

예시 프로젝트 구조

* 해당 예시 프로젝트의 구조이며, something 패키지는 메인 메서드가 존재하는 example 패키지와 따로 분리되어 있습니다.

 

 

@RestController
public class SomethingController {

    @GetMapping("/something")
    public String something() {
        return "Something!";
    }
}

(SomethingController)

 

@Configuration
@Conditional(SomethingCondition.class)  // 전체 구성 클래스를 포함하거나 제외
public class SomethingConfig {

    @Bean
    @Conditional(SomethingCondition.class)  // 단일 빈에 대해 선언
    public SomethingController somethingController() {
        return new SomethingController();
    }
}

(@Conditional 어노테이션을 적용한 SomethingConfig 클래스)

 

이어서 @Conditional 어노테이션을 선언하는 부분입니다.

선언 방법은 예시 코드와 같이 클래스에 대해 해당 어노테이션을 선언하여 전체 구성 클래스를 포함하거나 제외할 수 있으며, 클래스 내부의 단일 빈에 대해서도 선언할 수 있습니다.

 

 

***

여기까지 작업이 된 경우, 프로젝트 실행 시 환경 정보로 SomethingCondition에서 설정한 'something=true'를 포함하여 실행하게 되면 SomethingController가 빈으로 등록되며, something 환경 정보가 존재하지 않거나 값이 true가 아닐 경우 SomethingController가 빈으로 등록되지 않습니다.

 

 


확장된 기능 @ConditionalOnXxx

@ConditionalOnXxx

스프링 부트는 스프링의 기능인 @Conditional(org.springframework.context.annotation)의 기능을 확장한 @ConditionalOnXxx(org.springframework.boot.autoconfigure.condition) 기능을 제공하는데요.

 

확장된 각각의 기능들에 대해 살펴보면 아래와 같습니다.

 

 

@ConditionalOnBean / @ConditionalOnMissingBean

: 해당 Bean이 존재하면 진행 / 해당 Bean이 존재하지 않으면 진행

 

@ConditionalOnClass / @ConditionalOnMissingClass

: 해당 Class가 존재하면 진행 / 해당 Class가 존재하지 않으면 진행

 

@ConditionalCloudPlatform

: 지정된 클라우드 플랫폼 환경일 때 진행 

 

@ConditionalOnExpression

: SpEL(Spring Expression Language) 표현식의 결과에 따라 진행

 

@ConditionalOnJava

: 애플리케이션이 실행 중인 JVM 버전이 일치하는 경우 자동 설정 등록

 

@ConditionalOnJndi

: JNDI를 사용할 수 있고 특정 위치에 있으면 진행

 

@ConditionalOnWebApplication / @ConditionalOnNotWebApplication

: 프로젝트가 웹 애플리케이션이면 진행 / 프로젝트가 웹 애플리케이션이 아니면 진행

 

@ConditionalOnSingleCondidate

: 지정한 Bean이 등록되어 있고 단일 후보자 지정이 가능할 때 진행

 

@ConditionalOnProperty

: 환경 속성이 있고 지정한 값을 가진 경우에 진행

 

@ConditionalOnResource

: 지정된 리소스가 클래스 경로에 있을 때 진행

 

 


Spring Boot 자동 구성이 동작하는 부분

JdbcTemplateAutoConfiguration

스프링 부트 자동 구성이 동작하는 많은 부분 중 하나인 JdbcTemplateAutoConfiguration입니다.

위에서 살펴본 @Conditional의 확장 기능인 @ConditionalOnClass, @ConditionalOnSingleCondidate 어노테이션이 사용된 것을 볼 수 있는데요.

 

 

org.springframework.boot.autoconfigure.AutoConfiguration.imports

org.springframework.autoconfigure.AutoConfiguration.imports 파일을 살펴보면 JdbcTemplateAutoConfiguration 외에도 스프링 부트 자동 구성을 위한 총 146개의 AutoConfiguration이 존재하는 것을 볼 수 있습니다.

 

해당 내용을 찾아보면서 스프링 부트의 자동 구성이 동작하는 원리도 궁금하여 정리하고 있는데요. 한 번에 정리하기에는 내용이 많아 추가로 기록하여 아래 링크 남겨두도록 하겠습니다.

 

 

 

< Spring Boot 자동 구성 동작 원리 >

2023.07.21 - [Programming/Spring Boot] - Spring Boot 자동 구성 AutoConfiguration 동작 원리 파헤치기

 

 

< 참고 자료 >
https://www.baeldung.com/spring-conditional-annotations

(해당 포스팅은 김영한 님의 ‘스프링 부트 - 핵심 원리와 활용' 강의와 위 참고 자료를 참고하여 정리한 내용입니다.)

반응형