springframework

springframeworko.s.w IoC 핵심기술. @Profile

Jungsoomin :) 2020. 8. 20. 01:16

ApplicationContext 즉 스프링 컨테이너는 많은 인터페이스를 상속하고 있는데, 이 중에 눈여겨 볼 기능은, Properties 와 Environment 이다.

 

ApplicationContext가 상속하는 많은 인터페이스 중 EnvironmentCapable 인터페이스에 지정된 Profile에 대해 알아본다

 

Profile이란, 즉 Bean 들의 묶음을 의미한다

고 보면 된다. 스프링의 프로파일은 실제 기능, 테스트, 알파, 베타, 개발 등 여러 상황에 따라 Bean들의 설정을 나누어 사용할 때 용이하다.

 

ApplicationContext 객체의 getDefaultProfile() 메서드를 사용하면 어떤 프로파일이든  기본적으로  적용되는 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())); // 기본 프로파일

    }

 

@Profile 에노테이션의 속성값에 고유 이름을 줄 수 있으며, 주게되면 해당 @Configuration , 즉 빈 설정 클래스 는 고유한 이름을 가진 Profile(빈들의 묶음)이 된다.

 

package me.soomin.demospring51;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Profile("test")
// 설정클래스에 @Profile 의 이름을 정해놓으면  해당 프로파일에서만 사용되는 빈 설정클래스가 된 것이다
public class TestConfig {

    @Bean
    public Repository repository(){
        return new TestBookRepository();
    }
}

해당 프로파일 일떄에만 사용할 설정 클래스로, 해당 프로파일을 활성화하고 어플리케이션을 구동하지 않으면  Profile을 적용한 설정클래스는 적용되지않게된다.. 적용되지 않았으므로 프로파일을 호출하지 않으면, 빈들도 등록되지 않게 되어, 주입받거나 관리될 수 없다.


프로파일을 액티브하려면 어떻게 해야할까? 인텔리 제이 환경에서는 Edit  Configuration 의 Environment 텝의 VM Option 에

-Dspring.profiles.active="프로파일명" 을 기재하거나 Active Profiles 탭에 프로파일명을 기재하면된다.

 

웹 어플리케이션의 경우 web.xml 디스패처 서블릿 설정 안

          <Init-param> 태그의 자식태그에 spring.profiles.active 을 이름으로 주고 value 로 활성화할 프로필 명 을 주면 되겠다.

<servlet>
	<servlet-name>디스패처<...
    <servlet-class>o.s.w.web.servlet.DispatcherServlet<...
   
   <init-param>
   	<param-name>contextConfigLocation<...
    	<param-value>.....<..
   </init-param> 
   
   <init-param>
   	<param-name>ContextClass<...
        <param-value>.....<....
   </init-param>
   
   <init-param>
   	<param-name>spring.profiles.active<...
        <param-value>프로파일명<..
   <init-param>
   
 <이하생략
   

이도 여의치 않을 경우 ApplicationContext객체의 getEnvironment().setActiveProfiles() 메서드의 매개변수 값으로 활성화할 프로필 명을 가변인자로 주면된다.

 

아니면 System.serProperty("spring.profiles.active","프로파일명") 이나 환경변수 이름spring.profiles.active 를 주고 값으로 프로파일 명을 주어도 된다.

 

 


이제 용 범위에 대해 알아본다. 

  1. @Configuration 즉 설정 클래스

  2. @Bean 즉 빈 객체 메서드

  3. @Component 즉 빈객체 생성 스캔 대상

이렇게 된다.

@Configuration
@Profile("test")
// 설정클래스에 @Profile 의 이름을 정해놓으면  해당 프로파일에서만 사용되는 빈 설정클래스가 된 것이다
public class TestConfig {

    @Bean
    @Profile("test")
    public Repository repository(){
        return new TestBookRepository();
    }
}
@Repository
@Profile("test")
public class TestBookRepository implements Repository{
}

다음으로, 표현식에 대해 알아본다.

  1.  & --and를 의미

  2.  | --or를 의미

  3. ! --not을 의미

자바구조와 같다. @Profile 에노테이션의 속성 값에 지정하여 조건을 걸 수 있다.

 

! 은 해당프로파일이 비활성화 상태일 경우 활성화되는 것을 의미한다

@Profile("!test")//!는 해당 프로필이 활성화 되지않을 경우 활성화
public class TestBookRepository implements Repository{
}

 

오늘 공부는 여기까지!