본문 바로가기
server

멀티모듈에 한 방으로 적용되는 application.yml

by Younji! 2020. 6. 8.

멀티모듈에서 공통된 하나의 application property를 적용했던 과정을 포스팅합니다.

현재 운영하고 있는 애플리케이션은 아래와 같이 멀티 프로젝트로 구성돼있습니다.

멀티모듈 구조

모든 모듈은 core 를 의존하고 있기 때문에 core에 특정 도메인(A Domain)의 프로퍼티를 동일하게 가지고 있어야 합니다.

처음엔 모듈이 몇 개 되지 않아 모든 모듈의 프로퍼티에 작성해주었는데요. A Domain 에 추가되는 값들을 모든 모듈에서 관리하기란 쉽지 않았습니다.

다중 프로퍼티를 한 번만 기술하기 위해 두 가지 방법을 찾게 되었습니다.

spring.profiles.include

 

위와 같이 환경에 따라 하나의 파일로 정의해줍니다.

그리고 모듈마다 spring.profiles.include: core 로 명시해주면 해당 프로퍼티가 매핑이 됩니다.

귀찮게도 core에 종속적인 모듈이 생성될 때 해당 프로퍼티에 새로 생성된 모듈에 대한 프로퍼티를 명시를 해줘야합니다. 😨

property 하나 추가해도 체크해야 할 것을 최대한 간편하게 하는 목적이 크기 때문에 첫번째 방법은 잠시 넣어두겠습니다. 더 관리가 편한 방법을 찾아봅니다.

EnvironmentPostProcesser

두 번째는 EnvironmentPostProcesser로 프로퍼티를 매핑시켜줍니다.

스프링 부트 로딩 시 spring.factories 에서 키에 등록된 value를 모두 bean 값으로 등록시킵니다. 아래의 코드를 보면 정의된 EnvironmentPostProcessor를 수행시켜주면서 environment 마다 프로퍼티를 로드시켜줍니다.

EnvironmentPostProcesser 를 implements하여 아래와 같이 작성 후, spring.factories에도 등록해줍니다.

org.springframework.boot.env.EnvironmentPostProcessor=com.benx.weply.core.spring.config.CoreEnvironmentPostProcessor

{{module}}-{{profile}}.yml 형태로 작성하기 위해 아래와 같이 파일 포맷을 정해서 설정해주었습니다. 

@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
    String[] activeProfiles = environment.getActiveProfiles();
    for (String profile : activeProfiles) {
        addPropertySource(environment, "core-" + profile + YML);
    }
}

 

이로서 모든 모듈에 같이 사용되는 프로퍼티를 core 모듈에 설정해서 모든 모듈에서 EnvironmentPostProcesser를 통해 등록한 프로퍼티를 로드해서 사용하게 됩니다.

기존에 모든 모듈이 n개고 환경(local,dev,stage,prod)에 따라 분리한다는 가정이면, n*4 개의 프로퍼티에 파일에서 모든 모듈에서 의존성을 갖고 있는 한 모듈에 환경마다 추가해주게끔 변경한다면 4개의 파일만 관리하면 되겠습니다.

 

 

참조 URL

https://kingbbode.tistory.com/39
https://github.com/ihoneymon/multi-module

댓글