SpringBoot - Gradle에 정의되어있는 정보 가져오기

dragonappear·2022년 7월 4일
0

Spring & SpringBoot

목록 보기
11/11


출처

제목: "[Spring boot 에서 gradle 에 정의되어있는 정보 가져오기]"
작성자: github.io(nevercaution)
작성자 수정일: 2018년05월20일 
링크: https://nevercaution.github.io/spring-boot-use-gradle-value/
작성일: 2022년7월4일

글 작성 계기

  • 개발하고 있는 프로젝트의 엔티티에 실행되고 있는 어플리케이션의 버전을 주입하고 싶다. DB에 등록되는 객체의 버전 정보를 넣어주면 장애가 발생 이후 DB에 Insert되는 객체들을 Version으로 확인할 수 있기 때문이다.
  • 뿐만 아니라 프로젝트에서 버그가 발생했을 때 로그에 버전 정보를 심을 수 있다면 어떤 특정 버전부터 발생했는지 여부를 쉽게 알 수 있다. 버전을 파악할 수 있으면 버그 발생 시점을 좀 더 유연하게 알 수 있을 것 같아 위 출처의 글을 보고 쓰게 되었다.

Gradle ext info

build.gradle

ext {
	appVersion = '1.0.0-SNAPSHOT'
	projectName = "backend-business"
}

발생할 장애 알림은 SLACK을 사용하는데, 어떤 에러가 발생했을 때 현재 배포되어 있는 버전을 함께 표시해주면 해당 에러가 어떤 버전에서 최초 발생했는지 추적이 가능하다.

Code

공식문서 부분을 참고해서 작성하였다.

  • build.gradle에 정의되어있는 값들을 사용하기 위해선 다음과 같이 설정해주면 된다.
  • 공식문서에서 주석을 달아놓은 부분이 있는데, SimpleTemplateEngine 에서는 $ 를 파싱하는 부분에서 충돌이 발생할 수 있어 별도의 처리를 해야 한다고 명시되어 있다.
    • 참고로 이 부분에서 실제 프로젝트에 적용시킬 때 문제가 있었다. 단순히 expand(project.properties)만 하게 되면 모든 설정 파일을 가져가게 된다.
  • 파일들에 $ 를 사용했다면 파싱을 하다가 깨질 수 있으니 escape 처리를 해주어야 하는데, 현재 상황은 내가 필요한 설정 파일만 가져가면 되기 때문에 내가 원하는 파일들만 expand 하도록 하자.
  • 별도의 처리를 하지 않으면 에러를 내며 processResources 에서 작업이 멈춘다.
:processResources FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':processResources'.
> Could not copy file '/path/to/file/error.ftl' to '/path/to/file/build/resources/main/error.ftl'.

filesMatching 로 원하는 파일 포멧만 하도록 감싸주자. (실제 이 부분에서 적용하다가 에러를 발생해서 모든 $escape 처리를 할까 하다가 그건 좀 아닌것 같아 아래와 같이 처리했다.)

build.gradle

processResources {
	filesMatching('**/application-common.yml') {
		expand(project.properties)
	}
}

application.yml

ext.appVersion: ${ext.appVersion}
ext.projectName: ${ext.projectName}

적용

EntityVersionListener

@Component
public class EntityVersionListener {

    @Value("${ext.appVersion}")
    private String appVersion;

    @PrePersist
    public void prePersist(BaseEntity baseEntity) {
        baseEntity.setVersion(appVersion);
    }

    @PreUpdate
    public void preUpdate(BaseEntity baseEntity) {
        baseEntity.setVersion(appVersion);
    }
}

동작 원리

  • 설정과 사용방법은 간단하다.
  • 핵심은 build.gradle 에서 명시해준 expand(project.properties) 의 동작인데 build 를 하게 되면 다음의 동작을 수행한다.
$ ./build
Executing task 'build'...

:bootBuildInfo
:compileJava
:processResources   <- here!
:classes
:bootJar
:jar SKIPPED
:assemble
:compileTestJava
:processTestResources NO-SOURCE
:testClasses
:test
:check
:build
  • 빌드 동작에서 컴파일을 하고 resource 파일들을 모아서 만들어주는데, application-common.yml에 명시되어 있는 ext 관련 값들을 매핑시켜줄때 gradle에 명시되어 있는 값들로 채워준다.
  • 빌드가 완료된 후 build/resources/main/application.yml 파일을 보면 매핑된 값들로 채워져 있는 것을 볼 수 있다.

application.yml

ext.appVersion: 1.0.1-SNAPSHOT
ext.projectName: backend-business

위에서 작성한 코드가 위와 같이 바뀌어 있음을 확인할 수 있다.

0개의 댓글