@Condotional 어노테이션이란 ?

컴포넌트의 Bean 등록 여부에 조건을 달 수 있게 해주는 어노테이션

 

스프링은 IOC컨테이너에 객체를 Bean으로 등록하여 사용하는데,

@Component로 선언된 클래스는 모두 Bean으로 등록되는데 여기에 조건부를 달 수 있다

ex. A경우에 등록을 하되, B경우에는 등록하지 않도록 설정 가능

 

Spring에서 추가기능의 설정파일을 읽고 해당되는 POJO에서 bean을 IOC컨테이너에 등록한다

이때 설절파일을 조건부로 읽는다면 필요할 때만 IOC컨테이너에 Bean 등록 가능하다

@Condotional 사용해야하는데 Condition 인터페이스의 구현체를 만들어야 한다

 

ex.

@Conditional(TomcatWebServerConfig.TomcatCondition.class)
public class TomcatWebServerConfig {
    @Bean("tomcatWebServerFactory")
    public ServletWebServerFactory servletWebServerFactory(){
        return new TomcatServletWebServerFactory();
    }

    static class TomcatCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return true;
        }
    }
}
@MyAutoConfiguration
@Conditional(JettyWebServerConfig.JettyCondition.class)
public class JettyWebServerConfig {
    // 톰캣과 두 개 이름이 동일할 경우 충동한다고 스프링 컨테이너가 초기화할 때 에러 발생 할 수 있으므로
    // 이름 구분해주기
    @Bean("JettyWebServerFactory")
    public ServletWebServerFactory servletWebServerFactory(){
        return new JettyServletWebServerFactory();
    }

    static public class JettyCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return false;
        }
    }
}

@Condition은 엘리먼트를 꼭 하나 등록해줘야하는데

그 엘리먼트 타입은 무조건 condition이라는 인터페이스를 구현한 클래스여야한다.

 

@Condition(xxxCondition.class)는 xxxCondition의 matches 메소드의 return값을 받아 컴포넌트 스캔 여부 판단

Boolean으로 return 해주면 되는데 true면 bean으로 등록 false면 IOC컨테이너에 Bean으로 등록되지 않는다

 

예시를 보면 Tomcat은 true를 반납하고 Jetty는 false를 반납하고 있으므로 Tomcat 서버가 실행된다.

 

 

 

이 외.

@SpringBootApplication : Component Scan 기능을 가지고 있음

@ComponentScan : 하위 디렉토리에 위치한 @Component로 명시된 Bean으로 등록하는 기능

@Configration : 이것 또한 @Component. 하위디렉토리에 설정 클래스를 위치시킨다

 

 

 

 

 

 

 

 

 

 

+ Recent posts