본문 바로가기
Spring

[Sprign Boot] Auto Configuration 정리 - @Conditaional

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

목차

     

    Auto Configuration

    Auto Configuration은 주로 자동 설정, 자동 구성  두 용어로 번역되어 사용됩니다.

     

    자동 설정

    Configuration이라는 단어가 컴퓨터 용어에서는 환경 설정, 설정이라는 뜻으로 자주 사용됩니다. Auto Configuration은 빈들을 자동으로 등록해서 스프링이 동작하는 환경을 자동으로 설정해주기 때문에 자동 설정이라는 용어도 맞습니다.

     

    자동 구성

    Configuration이라는 단어는 구성, 배치라는 뜻도 있습니다.
    예를 들어서 컴퓨터라고 하면 CPU, 메모리등을 배치해야 컴퓨터가 동작합니다. 이렇게 배치하는 것을 구성이라 합니다. 스프링도 스프링 실행에 필요한 빈들을 적절하게 배치해야 합니다. 자동 구성은 스프링 실행에 필요한 빈들을 자동으로 배치해주는 것이다.

     

    자동 설정, 자동 구성 두 용어 모두 맞는 말이다. 자동 설정은 넓게 사용되는 의미이고, 자동 구성은 실행에 필요한 컴포넌트 조각을 자동으로 배치한다는 더 좁은 의미에 가깝습니다.

     

    @Conditaional

    스프링 부트 자동 구성에서 중요한 애노테이션으로 이름 그대로 특정 조건을 만족하는가 하지 않는가를 구별해  빈 등록을 제어할 수 있는 애노테이션입니다. @Conditional에 대해서 알기전에 Condition 인터페이스에 대해서 알면 좋아서 한 번 코드를 보겠습니다.

     

    Condition 인터페이스

    @FunctionalInterface
    public interface Condition {
    
    	boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
    
    }
    • matches(): true 를 반환하면 조건에 만족해서 동작하고, false 를 반환하면 동작하지 않습니다.
    • ConditionContext : 스프링 컨테이너, 환경 정보등을 담고 있습니다.
    • AnnotatedTypeMetadata : 애노테이션 메타 정보를 담고 있습니다.

     

    @Conditional의 다양한 기능

    스프링은 @Conditional 관련해서 더 편리하게 사용하게 할 수 있도록 많은 @ConditionalOnxxx를 제공합니다.  대표적인 애노테이션을 소개해보겠습니다.

    @Configuration
    @ConditionalOnProperty(name = "memory", havingValue = "on")
    public class MemoryConfig {
        @Bean
        public MemoryController memoryController() {
            return new MemoryController(memoryFinder());
        }
    
        @Bean
        public MemoryFinder memoryFinder() {
            return new MemoryFinder();
        }
    }

    @ConditionalOnProperty로 환경 정보가 memory=on 이라는 조건에 맞으면 동작하고, 그렇지 않으면 동작하지 않습니다.

     

    @ConditionalOnXxx를 가지고 자동 구성 설정을 동적으로 설정할 수 있습니다.

     

    @ConditionalOnXxx 다양한 예시

    @ConditionalOnClass / @ConditionalOnMissingClass

    • @ConditionalOnClass: 지정한 클래스가 존재할 경우 동작
    • @ConditionalOnMissingClass: 지정한 클래스가 존재하지 않을 경우 동작

    @ConditionalOnBean / @ConditionalOnMissingBean

    • @ConditionalOnBean: 지정한 빈이 등록되어 있을 경우 동작
    • @ConditionalOnMissingBean: 지정한 빈이 등록되어 있지 않을 경우 동작

    @ConditionalOnWebApplication / @ConditionalOnNotWebApplication

    • @ConditionalOnWebApplication: 웹 애플리케이션일 경우 동작
    • @ConditionalOnNotWebApplication: 웹 애플리케이션이 아닐 경우 동작

    @ConditionalOnProperty: 환경 정보가 특정 조건을 만족할 경우 동작

    @ConditionalOnResource: 지정한 리소스가 존재할 경우 동작

    @ConditionalOnExpression: SpEL(스프링 표현 언어) 표현식이 만족할 경우 동작

     

    더 자세한 내용은 아래 공식 문서를 참고해주세요!!

     

    ConditionalOnXxx 공식 문서

    https://docs.spring.io/spring-boot/reference/features/developing-auto-configuration.html#features.developing-auto-configuration.condition-annotations

     

    참고자료

    [1]  스프링 부트 핵심 원리와 활용 - 김영한