티스토리 뷰

Spring Boot 프로젝트를 생성 후 .java파일을 제외한 애플리케이션 개발 시 필요한 리소스 파일을 src/main/resources 디렉토리 하위에 위치해두는데 대표적으로 application.properties(yml) 파일이 있다.

 

그리고 application.properties(yml) 파일에는 애플리케이션이 배포 될 환경별로 환경에 맞는 값을 세팅해두거나 (ex. DB정보) 로깅용 xml 파일을 세팅해두는데 이러한 리소스 파일들을 효율적으로 관리하는 방법에 대해 알아보자.


참고로 이 방법은 필자가 개인적으로 생각했을 때 효율적이라고 판단되서 작성하는 것..

프로젝트 환경

  • Spring Boot
  • Maven
  • Gradle

예제

src/main/resources 디렉토리와 src/main/resources-${profile} 디렉토리를 생성하고 각 디렉토리 하위에 application.yml 파일과 application-${profile}.yml 파일을 생성하였다.

 

이렇게 구성하기 위해서는 Maven 및 Gradle에서는 다음과 같은 설정을 해줘야 한다.

Maven

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
        <resource>
            <directory>src/main/resources-${profile}</directory>
        </resource>
    </resources>
</build>
<profiles>
    <profile>
        <id>local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <profile>local</profile>
        </properties>
    </profile>
    <profile>
        <id>development</id>
        <properties>
            <profile>development</profile>
        </properties>
    </profile>
    <profile>
        <id>stage</id>
        <properties>
            <profile>stage</profile>
        </properties>
    </profile>
    <profile>
        <id>production</id>
          <properties>
            <profile>production</profile>
        </properties>
    </profile>
</profiles>

 

Gradle

def profile = project.hasProperty("profile") ? project.property("profile").toString() : "local"

sourceSets {
    main {
        java {
            srcDirs = ["src/main/java"]
        }
        resources {
            srcDirs = ["src/main/resources", "src/main/resources-${profile}"]
        }
    }
}

위 설정에 대해 간단히 설명드리자면 애플리케이션을 패키징할 때 Profile값을 세팅하고 하면 해당 Profile에 맞는 리소스 파일만 빌드를 할 수 있다. 기본 Profile값은 local로 해두었다.

 

Maven은 mvn clean install -P profile명 명령어로 빌드하면된다.

  • 빌드 시 test를 skip 하고싶다면 mvn clean install -P profile -Dmaven.test.skip=true 값을 넣어주면 된다.

 

Gradle은 gradle clean build -Pprofile=profile명 명령어로 빌드하면된다.

  • 빌드 시 test를 skip 하고싶다면 gradle clean build --exclude-task test -Pprofile=profile 명령어로 빌드하면된다.

 

위와같이 구성하면 다음과 같은 장점이 있다.

장점

  • 환경별로 공통적으로 적용하고자 할 때는 src/main/resources에 있는 application.yml에 정의하고 환경별로 다르게 적용하고자 할 때는 src/main/resources-${profile}에 있는 application-${profile}.yml에 정의할 수 있어서 관리에 용이해진다.
  • src/main/resources 디렉토리 하위에 application-${profile}.yml을 만들어도 되지만 그렇게 하게되면 development 환경에 배포할 때 local, stage, production yml파일들도 함께 빌드되서 불필요한 파일이 배포된다
    분리를 하게되면 애플리케이션을 development profile로 패키징할 때 공통으로 적용할 리소스파일과 development 환경에 적용할 리소스파일만 빌드할 수 있다.
  • 디렉토리를 분리하지 않아도 spring.profiles.active 변수로 profile값을 넘겨주면 동작에는 이상이 없지만 환경별로 적용해야 할 리소스 파일들이 많아지면 코드를 한눈에 보기 힘들어진다. 그런데 환경별로 디렉토리를 분리하면 환경별로 적용해야할 리소스 파일들이 많아져도 디렉토리별로 구분이 되있어서 코드를 한눈에 보기가 수월해진다.
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함