Spring은 사용하려는 프로파일을 정의하여 상황에 따라 컴포넌트에 대한 등록 및 제외를 결정할 수 있다.

@Profile({"dev", "!kr"})

이라고 프로파일을 정의하면 조건식은 dev or !kr 이 되어 dev 혹은 kr 에 대해서 선언되어 있지 않으면 반드시 실행되는 상황이 발생한다.

이런 상황을 피할 수 있는 방법으로 Spring 4.0에서 추가된 @@Conditional 을 사용하는 방법이 있다. 이와 관련한 질문은 How to conditionally declare Bean when multiple profiles are not active? 를 살펴보면 고민하고 있는 유사한 내용과 답변을 볼 수 있다.

간단한 해결책은 Condition을 구현하는 것이다. 다음과 같이 간단하게 dev and !kr을 만족하는 조건식을 작성해보자.

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class PrdAndIgnoreKrProfileCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().acceptsProfiles("prd") && !context.getEnvironment().acceptsProfiles("kr");
}
}

위의 클래스를 사용하여

@Profile({"dev", "!kr"})
//을 대신하여
@Conditional(PrdAndIgnoreKrProfileCondition.class)
// 으로 정의하면 dev and !kr 조건식이 적용가능해진다.


  1. azz 2019.04.17 08:53

    only dev 와 dev and !kr과 어떤게 다른건가요? 같아보이는데.

    • 실행환경 프로파일로 사용한 dev
      로케일 프로파일로 사용한 kr

      dev 하나만 사용하는 환경이라면 kr은 큰 의미가 없죠.

      로케일 프로파일로 vn, ph, jp 등을 사용하는 상황에서 한국 로케일 관련한 활성화를 막을 필요가 있을 때 필요합니다.

      or 조건에서는 어느 한쪽만 맞아도 true가 되어 활성화되지만 and 조건에서는 두 가지 조건이 모두 맞아야 활성화됩니다.

+ Recent posts