[Maven] profile이용한 배포 환경별(local, dev, prod) 빌드 설정
pom.xml profile, build 속성을 이용해 배포 환경별(local, dev, prod) 설정 및 Maven Build 방법에 대해 알아보겠습니다.
프로젝트 환경
- Project : Maven Project
- java : 1.8
- Spring : 4.3.x
- Packaging : war
- IDE : IntelliJ
1.환경별 리소스 폴더 구분
메인 폴더 하위에 환경별 리소스 폴더를 만들고 각 환경에 맞는 설정 파일을 생성합니다.
개발자 서버 환경(local), 개발 서버 환경(dev), 운영 서버 환경(prod) 총 3가지로 환경에 따라 구분합니다.
- src/main/resources-local
- src/main/resources-dev
- src/main/resources-prod
🚨src/main/resources 폴더는 무엇인가요?
src/main/resources 폴더는 xml 및 속성 파일과 같은 리소스 파일을 포함하도록 되어 있습니다. spring framework maven 또는 gradle의 표준 레이아웃이며, 일반적으로 스프링 프로젝트 생성 시 기본적으로 구성되어 있습니다. 해당 src/main/resources 폴더를 개발자 서버 환경(local)으로 정의하는 경우도 많습니다. 저의 경우는 환경별로 폴더명을 구분하면 가시성 확보에 이점을 느껴 실제론 총 4가지로 나눴습니다. src/main/resources과 src/main/resources-local 폴더를 동일하게 로컬 환경으로 설정해두고 상황에 따라 resources는 개인 테스트용으로 활용하기도 합니다. 굳이 나눌 필요성이 없다 생각하시면 resources(로컬) , resources-dev(개발), resources-prod(운영)으로 구분해도 무방합니다! (스테이징 서버도 존재한다면 src/main/resources-stage로 추가해 주시면 됩니다. 인프라 환경별 및 프로젝트 아키텍처가 케바케이기 때문에 프로젝트에 맞게 구성해 주시면 됩니다.)
- Maven 표준 레이아웃 (기본 구조)
maven-project-root
|-- src
| |-- main
| | |-- java // Java 소스 코드
| | |-- resources // 리소스 파일 (프로퍼티 파일, XML 파일 등)
| | |-- webapp // 웹 애플리케이션 관련 리소스 (JSP, HTML, CSS, JavaScript 등)
| |-- test
| |-- java // 테스트용 Java 소스 코드
| |-- resources // 테스트 리소스 파일
|-- target // 빌드 결과물이 생성되는 디렉토리
|-- pom.xml // Maven 프로젝트 설정 파일
- Gradle 표준 레이아웃 (기본 구조)
- Gradle을 사용하는 프로젝트에서도 Maven과 유사하게 'src/main/resources' 디렉터리가 주로 사용됩니다.
gradle-project-root
|-- src
| |-- main
| | |-- java // Java 소스 코드
| | |-- resources // 웹 애플리케이션 관련 리소스 파일 (프로퍼티 파일, XML 파일 등, HTML, CSS, JavaScript 등)
| |-- test
| |-- java // 테스트용 Java 소스 코드
| |-- resources // 테스트 리소스 파일
|-- build // 빌드 결과물이 생성되는 디렉토리
|-- build.gradle // Gradle 프로젝트 설정 파일
2. pom.xml 설정
메이븐 프로젝트에서는 pom.xml 설정 파일의 profile속성을 이용하여 빌드 시 외부에서 넣어주는 파라미터를 기준으로 설정 파일을 참조하게 하여 환경별로 다른 설정 파일을 선택하도록 해줄 수 있습니다. 설정 방법은 아래와 같습니다.
2.1 pom.xml에 profiles 추가
profile id와 properties.environment 설정 (환경별 구분)
위에서 환경별로 리소스 폴더를 다르게 생성했습니다. 빌드 시 외부에서 넣어주는 파라미터 토대로 환경별 리소스가 참조되기 위해서는 pom.xml의 profiles 속성을 환경별로 설정해야 합니다.
- profiles.profile.id와 profiles.profile.properties.environment 속성 추가
- id와 environment가 환경별과 동일해야 합니다. (src/main/resources-{환경별})
<profiles>
<!-- local: 로컬개발 (기본 값) -->
<profile>
<id>local</id>
<activation>
<!--<activeByDefault>true</activeByDefault>-->
</activation>
<properties>
<environment>local</environment>
</properties>
</profile>
<!-- dev: 개발 -->
<profile>
<id>dev</id>
<properties>
<environment>dev</environment>
</properties>
</profile>
<!-- prd: 운영 -->
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
profile을 설정해 주면 인텔리제이에서 Profiles 폴더와 설정한 profile.id가 나타납니다. id명과 동일하게 설정값을 생성해 줍니다.
2.2 pom.xml에 build 추가
resource.directory 와 resource.filtering 설정 (환경별 참조)
환경별 리소스 폴더에 참조되어 빌드될 수 있도록 설정을 해줍니다. 리소스 경로를 지정해 주고 리소스 폴더 하위의 설정파일들 내에서 환경값을 참조할 수 있게 설정해 줍니다.
- build.resources.resource.directory와 build.resources.resource.filterting 속성 추가
- 2.1에서 설정한 profile.environment 환경별 설정값과 동일해야 합니다. (src/main/resources-${environment})
${environment} 속성은 pom.xml에 정의된 profile.properties.environment 속성 값으로 environment 변수입니다. Maven 빌드 시 외부에서 넣어주는 파라미터 값과 환경별 리소스를 매핑하기 위해 ${environment} 구문을 사용하여 포함할 속성값에 대한 참조를 리소스 파일에 넣습니다. 환경별 리소스 파일에 빌드 시에만 제공할 수 있는 값을 포함할 수 있도록 filterting 속성을 다음의 리소스 디렉터리에 대해 true로 설정하면 됩니다.
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<!-- 환경별 리소스 포함 -->
<resource>
<directory>src/main/resources-${environment}</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
3. 배포 환경별 빌드
3.1 IntelliJ IDE
원하는 배포 환경 체크 후 Lifecycle 항목에서 ⚙️install 클릭하여 빌드해 줍니다. 인텔리제이 경우 pom.xml profiles 설정값과 Maven 설정창의 Profiles 값이 자도으로 매핑됩니다. 아주 편리합니다.
🚨src/main/resources를 개발환경으로 설정한 경우
기본 리소스로 빌드하고자 한다면 pom.xml 에서 profile의 activateByDefault 속성에 true를 설정해 줍니다.
<!-- local: 로컬개발 (기본 값) -->
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment>local</environment>
</properties>
</profile>
3.2 Eclipse IDE
Run Configuration 설정창에서 Maven Build를 환경별로 Goals 항목에 설정해 줍니다.
- local build
- goals : clean install -P local
- dev build
- goals : clean install -P dev
- prod build
- goals : clean install -P prod
🚨src/main/resources를 개발환경으로 설정한 경우
goals : clean install로 세팅해 줍니다. base path가 src/main/resources 이기 때문에 해당 resources 폴더 안 설정파일을 빌드하게 됩니다.
마무리
메이븐 빌드를 하면 resources 아래의 파일과 폴더들이 myapp/target/classes 아래로 복사되는 것을 볼 수 있습니다.
이상 코딩하는 지니였습니다. 감사합니다.