Spring | 프로파일별 조건을 사용해서 구성하기

DoItDev·2022년 1월 20일
0
post-thumbnail

Overview

스프링을 사용을 하다보면 우리는 @profile 이라는 어노테이션을 마주치게 될 것 이다.
이것을 언제 사용을 하지 .. ? 라는 분들도 있고 Profile 어노테이션을 사용을 해본 경험이 있을 것이다.
필자의 경우 프로젝트를 진행을 하다보니 많이 사용한 경험이 있었다.

@Profile의 경우 주로 Configuration class 에서 주로 사용을 했었다.즉, 요구상황 별로 사용하는 설정파일이 달랐었다. 한 예로 어떤 A라는 프로젝트에는 a라는 설정 클래스가 작동이 되어야 된다. 하지만 B라는 프로젝트에는 a라는 설정 클래스가 작동이 되지 않아야 했었다.

그렇때 @Profile 어노테이션을 사용을 했다. 아래의 코드 처럼 어노테이션을 사용을 할 수 있다. method layer 에서도 작동이 되었다. 물론 단순한 method 가 아닌 bean 을 주입을 할때 사용을 했었다.


@Profile("test")
@Configuration
public class TestConfiguration {
}

@Conditional

@Profile 에서도 조건을 줄 수 가 있었다. !,|,& .. 자바에서 사용하는 조건처럼 사용이 가능했었는데 조금더 직관적인 부분이 필요하다고 생각이 들었다.

단순한게 위의 @Profile을 사용을 하면 간단하게 해결이 됬던 문제였다. 그렇지만 다른 방법이 있지 않을 까? 라는 단순한 호기심이 생기게 되었다..

그렇게 찾은 어노테이션이 @Conditional 이다. 이게 뭐야 할 수 있다. 하지만 사용법은 간단하다


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

public class DxDevProfile implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().acceptsProfiles("local") ||
                context.getEnvironment().acceptsProfiles("dev") ||
                context.getEnvironment().acceptsProfiles("prod");
    }

}

기본적으로 위와 같은 Condition 을 상속 받은 클래스 하나가 필요하다. 그리고 상속을 받아서 오버라이드 해서 matches 를 재정의 해주면 된다.

위의 코드로 설명을 하면 local 혹은 dev 혹은 prod 가 있으면 실행이 되게 하였다.

이것을 적용하려면

@Conditional(DxDevProfile.class)

@Conditional 어노테이션을 사용을 해서 프로파일 별로 조건을 상세하게 주는 것이 가능하다.

profile
Back-End Engineer

0개의 댓글