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 를 주고 값으로 프로파일 명을 주어도 된다.
이제 적용 범위에 대해 알아본다.
-
@Configuration 즉 설정 클래스
-
@Bean 즉 빈 객체 메서드
-
@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{
}
다음으로, 표현식에 대해 알아본다.
-
& --and를 의미
-
| --or를 의미
-
! --not을 의미
자바구조와 같다. @Profile 에노테이션의 속성 값에 지정하여 조건을 걸 수 있다.
! 은 해당프로파일이 비활성화 상태일 경우 활성화되는 것을 의미한다
@Profile("!test")//!는 해당 프로필이 활성화 되지않을 경우 활성화
public class TestBookRepository implements Repository{
}
오늘 공부는 여기까지!
'springframework' 카테고리의 다른 글
springframeworko.s.w IoC 핵심기술. MessageSource (0) | 2020.08.21 |
---|---|
o.s.w IoC 핵심기술. @PropertySource (0) | 2020.08.20 |
o.s.w IoC 핵심기술. @Bean 의 @Scope (0) | 2020.08.20 |
Junit (0) | 2020.08.17 |
인텔리J 기반 스프링 프로젝트 생성 (0) | 2020.08.12 |