ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메이븐과 연동해서 스프링 프로파일 설정하기
    Spring 2013. 3. 12. 00:00


    요즘 만들고 있는 애플리케이션이 워낙 많은 Heap 사용량을 요구하는 관계로다가 개발자 PC에서 VM을 올리는게 점점 힘들어지는 상황이다. ㅠ.ㅠ 서버에 올라가면 7g 정도가 필요하고 개발자 PC에서도 최소 4~5g정도가 필요하다. 뭐… 그러니 두말하면 잔소리지만 32bit OS에서는 돌아가지도 않는다.


    처음에는 개발자 모드에 맞춰서 적은(?)양의 heap만 사용해서 별다른 문제가 없었는데 본격적으로 서버 배포를 하는 단계에 이르렀기 때문에 메이븐과 스프링의 프로파일을 연동해서 개발자용과 서버 배포용으로 스프링 설정을 분리하기로 했다. ky군이 몇 시간 작업해서  jenkins에서 자동 배포시 프로파일 적용해서 배포되도록 하니 서버 배포를 별로 신경 쓸 게 없다. :)   


    기존에 사용하고 있던 메이븐 설정(settings.xml)에서 프로파일을 여러 개로 나눠서 관리하고 있었기 때문에 이 프로파일 설정에 맞춰서 스프링 프로파일 설정도 같이 적용되도록 했다. 다음은 우리가 사용하고 있는 settings.xml파일에서 프로파일 설정 부분이다.


    <profiles>

            <!-- 로컬 환경 프로필 -->

            <profile>

                <id>xxxx-local</id>

                <properties>

                    <server.mode>local</server.mode>

                </properties>

            </profile>


            <!-- 개발서버 환경 프로필 -->

            <profile>

                <id>xxxx-dev</id>

                <properties>

                    <server.mode>dev</server.mode>

                </properties>

            </profile>


            <!-- 준상용서버 환경 프로필 -->

            <profile>

                <id>xxxx-preal</id>

                <properties>

                    <server.mode>preal</server.mode>

                </properties>

            </profile>


            <!--운영서버 배포용 -->

            <profile>

                <id>xxxx-real</id>

                <properties>

                    <server.mode>real</server.mode>

                </properties>

            </profile>

    <activeProfiles>

            <activeProfile>xxxx-local</activeProfile>

    </activeProfiles>


    보시다시피 총 4개의 프로파일을 사용하고 있고, 기본은 local 프로파일이다. 이걸 스프링 프로파일에 적용하려면 메이픈 프로파일을 스프링으로 카피해야 하는데 이를 위해서 maven-resource-plugin과  스프링의 ApplicationContextInitializer 인터페이스를 사용했다.


    public class XXApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {


        /**

         * {@inheritDoc}

         */

       @Override

        public void initialize(ConfigurableApplicationContext applicationContext) {

            Properties config = loadConfigProperties();

            String activeProfile = config.getProperty("profiles.active");

             //설정파일에서 읽어온 프로파일 값을;스프링에 설정한다.

            applicationContext.getEnvironment().setActiveProfiles(activeProfile) 

                      

        }


        /**

         * @return

         */

        private Properties loadConfigProperties() {

            PropertiesFactoryBean bean = new PropertiesFactoryBean();

            bean.setLocation(new ClassPathResource("config.xml"));

            bean.setLocalOverride(true);

           

            try {

                bean.afterPropertiesSet();

                return bean.getObject();

            } catch (IOException e) {

                e.printStackTrace();

            }

            return null;

        }


    }


    먼저 ApplicationContextInitializer의 구현체를 만들고 이를 web.xml에 등록하면 스프링이 해당 구현체의 intialize메서드를 호출해준다. 그러면 Initialize 메서드에서 maven-resource-plugin을 통해서 config.xml에 복사된 메이븐 프로파일 값을 읽어서 applicationContext.getEnvironment().setActiveProfiles() 메서드에 프로파일 값을 설정하도록 했다.


    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

    <properties>

        <entry key="profiles.active">${server.mode}</entry>

    </properties>



    config.xml은 위와 같이 생겼고, web.xml에는 다음과 같이 등록하면 된다.


    <context-param>

            <param-name>contextInitializerClasses</param-name>

            <param-value>com.xxxx.xxxx.xx.web.util.XXApplicationContextInitializer</param-value>

    </context-param>


    이렇게 하면 작업 끝이다. 프로파일 설정에 따라 해당 구역안에 빈 설정이 로딩된다.


    <beans profile="local">

            <bean ...>

     </beans>

        

    <beans profile="dev,preal,real">

            <bean ...>     

    </beans>


    마지막으로 이 작업을 훌흉히 해준 ky군에게 땡큐다.^^


    'Spring' 카테고리의 다른 글

    스프링 리모팅(Spring Remoting)  (0) 2012.01.30
Designed by Tistory.