src/main/resources 디렉토리를 효율적으로 관리하기 (feat. Maven / Gradle)
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값을 넘겨주면 동작에는 이상이 없지만 환경별로 적용해야 할 리소스 파일들이 많아지면 코드를 한눈에 보기 힘들어진다. 그런데 환경별로 디렉토리를 분리하면 환경별로 적용해야할 리소스 파일들이 많아져도 디렉토리별로 구분이 되있어서 코드를 한눈에 보기가 수월해진다.