본문 바로가기
Spring/Spring-detail

@Conditional 을 이용해 특정 조건일 때만 사용

by YoonJong 2024. 2. 22.
728x90

@Conditional

특정 조건이 참인 경우에만 빈에 등록해야하는 상황에 사용할 수 있습니다.

 

Condition 인터페이스를 상속받아 구현해 사용합니다.

반환타입은 boolean 값입니다.

@FunctionalInterface
public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

 

 

@Slf4j
public class MemoryCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // -Doption=dev
        String memory = context.getEnvironment().getProperty("option");
        log.info("memory={}",memory);
        return "dev".equals(memory );
    }
}

option이라는 속성을 설정하고 속성의 값이 dev 이면 참을 반환합니다.

 

@Configuration
@Conditional(MemoryCondition.class) // 해당 결과가 참이어야 빈으로 등록.
public class MemoryConfig {

    @Bean
    public MemoryController memoryController() {
        return new MemoryController(memoryFinder());
    }

    @Bean
    public MemoryFinder memoryFinder() {
        return new MemoryFinder();
    }
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {

    /**
     * All {@link Condition} classes that must {@linkplain Condition#matches match}
     * in order for the component to be registered.
     */
    Class<? extends Condition>[] value();

}

@Conditional 을 사용하며 condition 인터페이스를 구현한 클래스를 입력합니다.

해당 결과가 참이어야 빈으로 등록하며, VM 옵션에서 값이 참이 아니라면 해당 빈은 등록되지 않습니다.

 

해당 방법처럼 설정하면 됩니다.

 

 

참고 : 김영한님 인프런 스프링부트 강의 

728x90

댓글