본문 바로가기
Spring

[Spring] Environment - Profile

by dbjh 2019. 12. 29.
반응형

이번 글에서는 ApplicationContext가 가지고 있는 기능 중 Enviroment의 Profile 이라는 기능에 대해 알아보도록하자.

Profile이란, 간단하게 말하면 Bean들의 묶음이다. 메이븐에도 프로파일기능이 있고 스프링에 있는 프로파일은 환경을 나타낸다. 실제로 실무에서는 실서버, 테스트서버, 개발서버등 서버마다 환경이 다른 경우가 있는데, 각 서버에 Bean의 필요유무를 따져서 Profile 기능을 사용하면 되는 것이다. 어떤 Bean이 필요하고 어떤 Bean이 필요없는지를 상황에 맞게 적용할 수 있는 기능이 바로 Profile이다. 

ApplicationContext.class
// 코드중략

public interface ApplicationContext extends EnvironmentCapable,ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

// 코드중략

}

IOC 컨테이너인 ApplcationContext를 살펴보면 많은 인터페이스를 구현하고 있는데, 그 중에서 EnvironmentCapable의 Profile 기능을 살펴보도록 하자.

1. Profile 확인하기

EnvironmentCapable 인터페이스의 getEnvironment() 메소드를 호출하면 Environment 객체를 얻을 수 있다.

Environment.class
// 코드중략

public interface EnvironmentCapable {
    Environment getEnvironment();
}

 

테스트를 위해 일단, 아래와 같이 소스코드를 작성하도록 하자.

BeanRunner.java
// 코드중략

@Component
public class BeanRunner implements ApplicationRunner {

    @Autowired
    ApplicationContext ctx;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Environment environment = ctx.getEnvironment();
        System.out.println(Arrays.toString(environment.getActiveProfiles()));
    }
}

위와 같이 코드를 작성하고 실행하면,

빈 값 출력

빈 배열값이 출력되는 것을 확인 할 수 있다. 현재는 아무런 Profile도 설정해주지 않았기 때문에 그렇다.
기본적으로 default로 설정되어 있기 때문에, BeanRunner 클래스의 run 메소드를 아래와 같이 수정하여 default profile을 확인하도록 하자.

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Environment environment = ctx.getEnvironment();
        System.out.println(Arrays.toString(environment.getActiveProfiles()));
        System.out.println(Arrays.toString(environment.getDefaultProfiles()));
    }

그런 후에 다시 실행해보면,

default 출력

default 문자열이 출력되는 것을 확인할 수 있다. 아무런 설정이 없을때 적용되는 Profile인 것이다.

Bean으로 등록하기 위한 클래스에 Profile 관련하여 아무런 설정을 해주지 않으면 기본 Profile로 정해진다. 그래서 @Component 어노테이션을 명시해준 클래스는 항상 Bean으로 등록이 되었던 것이다.

이제 Profile 설정을 할건데, 먼저 Configuration을 이용하여 Profile 설정을 해보도록하자. 만약 Configuration에 대해 잘모른다면, 아래 링크를 참고하자.

 

[Spring] Spring Bean 설정 방법 - Java Config

이전 글에는 XML Config를 이용하여 Spring Bean 설정 하는 법을 진행하였다. 이 글에서는 Java Config 설정 방식에 대해 알아보려고 하는데, 기본적인 클래스가 필요 하기 때문에 혹시라도 이전 글인 XML Config..

dbjh.tistory.com


2. Profile 정의하기 - Configuration + @Profile

Profile 정의 방법 중 한가지는 Configuration 클래스에 @Profile 어노테이션을 명시해주는 방법이다.

아래의 디렉토리 구조 및 코드를 보도록하자.

현재 디렉토리구조

Single.java
public class Single {
}

 

TestConfiguration.java
// 코드중략

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

    @Bean
    public Single single() {
        return new Single();
    }

}

 

BeanBunner.java
// 코드중략

@Component
public class BeanRunner implements ApplicationRunner {

    @Autowired
    Single single;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(single);
    }
}

 

위와 같이 TestConfiguration 클래스의 메소드로 single()을 선언하고 @Bean 설정을 해두었다. 원래대로 라면 Single 객체를 Bean으로 등록하여 주입한다. 하지만, @Profile("test")를 명시해 줌으로써 "test"라는 profile로 어플리케이션을 실행하지 않는 이상, 해당 Bean은 사용할 수 없다. 실제로 주입이 안되는지 실행해보도록 하자.

Single Bean을 찾지 못하는 결과

확인해보니, Single Bean을 찾지 못하는 것을 알 수 있다. 혹시몰라 @Profile 어노테이션을 지우고 어플리케이션을 실행해보면 문제없이 Bean 주입이 되는 것을 확인할 수 있다.

그렇다면 Profile 설정은 어떻게 할까? Profile을 정의하는 방법 한가지를 더 알아보기전에 Profile 환경을 설정하는 환경을 알아보도록하자.


3. Profile 환경 설정하기

Profile 환경을 설정하는 방법은 두가지가 있는데, IDE에서 설정 값을 입력하여 환경을 적용해주는 방법이다.

여기서는 intelliJ IDE에서 설정하는 방법으로 진행할 것이다.

우선, 상단 Run 버튼 좌측에 어플리케이션 설정을 누르도록하자.

런버튼 좌측 어플리케이션 설정

그런 후에 아래와 같이 해당 부분에 "프로파일명"을 입력해주면 된다. 여기서는 test profile을 적용할 것이기 때문에 <test>라고 입력해주고 OK 버튼을 클릭하도록하자.

Active profiles 항목에 "test" 입력

그런후에 어플리케이션을 다시 시작하면,

Single Bean이 주입된 결과

Bean 주입이 정상적으로 이루어진 것을 확인할 수 있다.

만약 위처럼 Active Profiles를 입력할 수 있는 기능이 없다면,
아래와 같이 VM options에 <-Dspring.profiles.active="test">라고 명시해도 똑같이 동작한다.

VM options에 -Dspring.profiles.active="test" 입력

위와 같이 IDE로 설정할 수 있는 방법은 두가지가 있다.

이제 Profile을 정의하는 방법 한가지를 더 알아보도록 하자. 


4. Profile 정의하기 - Bean Class + @Profile

Java Configuration에서 Bean을 등록하는 방법은 번거로움이 있기때문에 @ComponentScan을 이용한다고 했다.
그렇다면, @ComponentScan을 유지하면서 Profile을 정의하는 것이 좋지 않을까? 당연히 그 역시도 Spring에서는 지원을 해준다. 바로 Bean으로 등록할 클래스에 @Profile 어노테이션을 명시해주는 방법이다.

아래의 디렉토리 구조 및 코드를 살펴보도록 하자.

현재 디렉토리 구조

 

Single.java
@Component
@Profile("test")
public class Single {
}

 

위의 구조처럼 TestConfiguration.java 파일을 삭제하고 Single 클래스에 @Profile("test")를 명시해준 후에 어플리케이션을 실행하면,

정상적으로 주입된 Single Bean

이상없이 Bean 주입이 되는 것을 확인할 수 있다. 혹시라도 확인해 보고 싶다면, 어플레케이션 설정에서 Profile 환경 설정을 초기화하고 테스트해보도록하자. Bean 주입이 안되는 것을 확인할 수 있다.

추가적으로 Profile 정의방식에는 간단한 문법이 적용이되는데, 아래와 같이 적용할 수 있다.

// prod가 아니면 Bean 등록
@Profile("!prod")


// prod가 아니면서 test이면 Bean 등록
@Profile("!prod & test")


// prod이면서 test이면 Bean 등록
@Profile("prod | test")

// !(not)
// &(and)
// |(or)

 

지금까지 환경에 따라 생성되는 Bean을 컨트롤 할 수 있는 Environment의 Profile 기능에 대해 알아봤다.
다음 글에서는 Environment의 Property에 대해 알아보도록하자.

 

내용 출처

반응형

'Spring' 카테고리의 다른 글

[Spring] MessageSource  (0) 2020.01.18
[Spring] Environment - Property  (0) 2020.01.07
[Spring] Bean의 스코프  (0) 2019.12.29
[Spring] @Component와 컴포넌트 스캔  (0) 2019.12.17
[Spring] @Autowired 및 Bean 라이프 사이클  (0) 2019.12.15

댓글