Dev Environment in Maven

m2eclipse를 사용하게 되면서 maven에 흠뻑 빠져들고 있다. 다른 팀원이 전혀 TDD에 관심이 없는 상황에서 Dev 환경이 없는 것은 꽤 불편하다.

Dev 환경의 필요성?

Dev 환경은 필요한 이유는 전적으로 TDD를 따르지 않기 때문이다. dev 환경이 필요성은 필요하다. Local에서 디버깅하는 환경운 test환경과도 다르고 운영 환경과도 다르다.

TDD를 따르지 않으면 Dev환경이 너무 아쉽다. Grails에서 지원하던 Dev 환경이 너무 아쉽다. 개발 환경의 설정을 배포시 매번 수정하는 것도 꽤나 번거로운 작업인데다가 실수의 연속이다.

Maven Profile

Maven에는 Profile 개념이 있다. mvn실행시 선택적으로 설정을 적용할 수 있게 해준다. 간단한 Profile을 설정은 다음과 같습니다. dev, prod를 profile로 만들어 보자:

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>prod</id>
    </profile>
</profiles>

activeByDefault를 이용해서 profile을 선택하지 않으면 dev profile이 선택되도록 설정한다.

다음과 같이 profile을 선택하여 실행할 수 있다:

mvn build -Pdev # dev profile로 실행한다. -Pdev를 생략해도 dev profile로 실행된다.
or
mvn build -Pprod # prod profile로 실행한다.

Maven directory layout

이제 entry point는 만들었으니 dev를 위한 directory layout을 추가한다.

다음과 같으 profile을 만든다:

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <version>1.5</version>
                    <executions>
                        <execution>
                            <id>build-helper-add-source</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>add-source</goal>
                            </goals>
                            <configuration>
                                <sources>
                                    <source>${basedir}/src/dev/java</source>
                                </sources>
                            </configuration>
                        </execution>
                        <execution>
                            <id>build-helper-add-resource</id>
                            <phase>generate-resources</phase>
                            <goals>
                                <goal>add-resource</goal>
                            </goals>
                            <configuration>
                                <resources>
                                    <resource><directory>${basedir}/src/dev/resources</directory></resource>
                                </resources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>prod</id>
    </profile>
</profiles>

prod profile에서는 maven default를 사용한다.

dev profile

하지만 dev profile에서는 soruce directory에 /src/main/java와 /src/dev/java를 사용하고 resource directory에 /src/main/resources와 /src/dev/resources를 사용한다.

build-helper-maven-plugin를 이용해서 Maven Directory Layout에 간단히 directory를 추가할 수 있다. 기존의(Maven의) 것을 변경하려면 build/sourceDirctory나 build/resources를 사용해야 한다.

이제 자신만의 Convention을 만들어서 사용하면 된다.

결론

지금 추가한 dev, prod는 maven의 main, test와 수평적인 관계가 아니다. main과 test는 maven에서 제공하는 아주 복잡한 phase와 goal들이 연관돼 있다.

예를 들어 다음과 같은 조합을 만들 수 있다:

  • dev + main - service mocking, dev db등의 설정을 main의 설정과 별도로 유지할 수 있다.
  • dev + test - /src/dev에 있는 source와 resource를 활용하여 테스트를 진행할 수 있지만, 별로 유용하지 않다.
  • prod + main - maven과 defualt와 완전 동일하므로 생략한다.
  • prod + test - maven과 defualt와 완전 동일하므로 생략한다.

이번 글에서는 Maven Profile을 이용해서서 dev 환경을 구성하는 방법을 소개하였다. 나중에, 사용해보고 경험이 축적되면 Convention도 정리해보고 싶다.