Spring 3.1 Profile Abstraction

Spring 3.1에 추가된 Profile Abstraction은 환경별/단계별 Context를 바인딩 할 수 있도록 지원한다.

예를 들면, 개발(DEV), 테스트(STG), 운영(PRD) 단계별로 각자 다른 배포 전략이나 프로세스로 관리되던 ApplicationContext를 Profile 기능을 통해 좀 더 편리한 프로세스를 정립할 수 있다.

1. Profile 설정

Profile 설정은 applicationContext XML의 profile element 또는 @Profile Annotation으로 설정될 수 있다.

예 1) applicationContext.xml

...
 
<!-- 개발환경용 DataSource -->
<beans profile="DEV">
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ds-dev"/>
</beans>
 
<!-- 테스트 환경용 DataSource -->
<beans profile="STG">
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ds-stg"/>
</beans>
 
...

예 2) @Profile Annotation

--- for DEV
 
@Configuration
@Profile("DEV")
public class DevelopmentDataSourceConfig {
 
    @Bean
    public DataSource dataSource() throws Exception {
        Context ctx = new InitialContext();
        return (DataSource) ctx.lookup("java:comp/env/jdbc/ds-dev");
    }
 
}
 
 
--- for STG
 
@Configuration
@Profile("STG")
public class StagingDataSourceConfig {
 
    @Bean
    public DataSource dataSource() throws Exception {
        Context ctx = new InitialContext();
        return (DataSource) ctx.lookup("java:comp/env/jdbc/ds-stg");
    }
 
}

2. Profile 활성화

Profile 활성화는 web.xml, JVM Property, @ActiveProfiles Annotation 또는 ApplicationContext를 직접 획득하여 활성화할 수 있다.

예 3) web.xml

1) context-param
 
<!-- Context Parameter로 Profile 활성화 -->
<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>DEV</param-value>
</context-param>
 
 
---
2) servlet init-param
 
<!-- DispatcherServlet의 초기화 Parameter로 Profile 활성화 -->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/config/spring/context-*.xml</param-value>
    </init-param>
    <init-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>DEV</param-value>
    </init-param>    
    <load-on-startup>1</load-on-startup>
</servlet>

참고로 ApplicationContext를 Web용과 ROOT로 분리하여 관리할 경우, 해당 Profile을 전역으로 활성화하기 위해서는 <context-param>으로 정의하여 사용한다. DispatcherServlet의 초기화 파라메터로 사용할 경우, 해당 Profile은 Web Application Context 영역에서만 적용된다.

예 4) JVM Property

java ... -Dspring.profiles.active=DEV

예 5) Using ApplicationContext

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();

ctx.getEnvironment().setActiveProfiles("DEV");
ctx.load("classpath:/config/spring/context-\*.xml");
ctx.refresh();

예 6) @ActiveProfiles

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/config/spring/context-common.xml")
@ActiveProfiles("DEV") public class EmployeeServiceTest { ... }

실제로 각 Phase별 TestCase 작성 필요시, @ActiveProfiles Annotation이 유용하게 사용될 수 있다.

Tags:

Updated:

Comments