Web/Spring&Spring Boot

[Maven] profile이용한 배포 환경별(local, dev, prod) 빌드 설정

균지니 2023. 3. 5. 02:15

 

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 아래로 복사되는 것을 볼 수 있습니다.

이상 코딩하는 지니였습니다. 감사합니다.