복붙노트

[SPRING] 테스트 환경과 프로덕션 환경에 따라 스프링 주입을 어떻게 제어합니까?

SPRING

테스트 환경과 프로덕션 환경에 따라 스프링 주입을 어떻게 제어합니까?

필자는 웹 애플리케이션을 테스트 환경에 배포 할 CI 상황을 설정하고 있습니다. 이 테스트 환경에서는 앱에서 사용되는 비즈니스 객체를 실제 객체의 모의 객체로 만들고 싶습니다. mock은 정적 테스트 데이터를 반환합니다. 나는이 테스트를 사용하여 내 ui를 다시 테스트합니다. 나는 Spring을 사용하여 이러한 비즈니스 객체 종속성의 주입을 제어한다. 그것은 스트럿츠 2 응용 프로그램입니다.

제 질문은 메이븐과 관련이 있다고 생각합니다. Maven 빌드를 사용하여 mock 주입 또는 실제 주입을위한 스프링 구성을 빌드할지 여부를 결정하는 가장 좋은 방법은 무엇입니까? 이것은 Maven 프로파일에 유용합니까? 다른 대안들?

해결법

  1. ==============================

    1.Spring 자체는 프로파일 지원 (3.1 이상 사용), 웹 애플리케이션의 경우 context.xml을 사용하여 web.xml의 여러 환경에 대한 활성 프로파일을 설정할 수 있습니다.

    Spring 자체는 프로파일 지원 (3.1 이상 사용), 웹 애플리케이션의 경우 context.xml을 사용하여 web.xml의 여러 환경에 대한 활성 프로파일을 설정할 수 있습니다.

    <context-param>
       <param-name>spring.profiles.default</param-name>
       <param-value>test</param-value>
    </context-param>
    

    편집 : Maven & Jenkins의 경우 다음과 같이 빌드 작업에 대한 매개 변수를 설정할 수 있어야합니다.

    먼저 Maven이 태그 안에있는 pom.xml에 다음을 추가하여 xml 리소스를 필터링하도록합니다 (이 예에서는 xml로 끝나는 파일 만 필터링되고 다른 것은 필터링되지 않습니다).

        <resources>
            <resource>
                <directory>src/main/webapp</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/webapp</directory>
                <filtering>false</filtering>
                <excludes>
                    <exclude>**/*xml</exclude>
                </excludes>
            </resource>
        </resources> 
    

    그런 다음 web.xml의 컨텍스트 매개 변수를 매개 변수화합니다.

    <context-param>
       <param-name>spring.profiles.default</param-name>
       <param-value>${env.SPRINGPROFILE}</param-value>
    </context-param>
    

    그런 다음 Jenkins의 빌드 작업을 매개 변수화하여 SPRINGPROFILE (예 : test 또는 prod)에 대해 원하는 문자열 매개 변수를 설정합니다. https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Build

  2. ==============================

    2.웹 응용 프로그램 아티팩트 (CI / Hudson 지원과 함께 여러 환경 [prod, test, dev]에 대한 아티팩트를 생성하기위한 권장 사항은 무엇입니까?)를 사용하여 모든 것을 수행하는 것은 좋지 않은 생각 일 수 있습니다. 여러 가지 메커니즘을 사용하여 다양한 컨텍스트에 대한 Spring 주입 구성이 다른 WAR 파일을 생성 할 수 있지만 WAR 생성물은 빌드 할 때마다 동일해야합니다.

    웹 응용 프로그램 아티팩트 (CI / Hudson 지원과 함께 여러 환경 [prod, test, dev]에 대한 아티팩트를 생성하기위한 권장 사항은 무엇입니까?)를 사용하여 모든 것을 수행하는 것은 좋지 않은 생각 일 수 있습니다. 여러 가지 메커니즘을 사용하여 다양한 컨텍스트에 대한 Spring 주입 구성이 다른 WAR 파일을 생성 할 수 있지만 WAR 생성물은 빌드 할 때마다 동일해야합니다.

    WAR에서 컨피규레이션을 추출하기 위해 Spring 3의 외부 속성 파일에서 재정의 값을 가져 오는 기능을 사용했습니다. 필자는 비즈니스 개체의 기본값 (즉, 생산)을 정의합니다. 그리고 속성 파일의 존재 여부를 확인하도록 spring을 구성합니다. 응용 프로그램이 테스트 환경에 있고 모의 주입이 필요할 때 배포 할 것입니다. 해당 등록 정보 파일이 있으면 값이 대신 입력됩니다. 다음은 스프링 설정 파일의 관련 비트입니다.

    <!-- These are the default values -->
        <util:properties id="defaultBeanClasses">
        <prop key="myManagerA">com.myco.ManagerAImpl</prop>
        <prop key="myManagerB">com.myco.ManagerBImpl</prop>
    </util:properties>
    
    <!-- Pull in the mock overrides if they exist. -->
    <context:property-placeholder 
        location="file:///my/location/mockBeans.properties"
        ignore-resource-not-found="true"
        properties-ref="defaultBeanClasses"/>
    
    <!-- The beans themselves. -->  
    <bean id="managerA" class="${myManagerA}"/>
    <bean id="managerB" class="${myManagerB}"/>
    

    다음은 외부 "mockBeans.properties"파일의 내용입니다.

    #Define mock implementations for core managers
    myManagerA=com.myco.ManagerAMockImpl
    myManagerB=com.myco.ManagerBMockImpl
    

    이것은 잘 작동합니다. 원한다면 mockBeans.properties 파일을 실제 WAR에 포함시킬 수도 있지만 실제 위치에는 포함 할 수 없습니다. 그런 다음 테스트 환경 태스크도 스프링 구성 설정이 가리키는 위치로 이동합니다. 또는 모의 속성을 전혀 다른 프로젝트에 둘 수 있습니다.

  3. from https://stackoverflow.com/questions/13093346/how-do-i-control-spring-injections-that-vary-between-the-test-environment-and-th by cc-by-sa and MIT license