• Feed
  • Explore
  • Ranking
/
/
    아키텍처

    멀티모듈에서 환경변수 구성 방법

    멀티모듈에서 환경변수 적용하기
    아키텍처
    테
    테리
    2025.03.31
    ·
    7 min read

    application.yml 파일이란

    스프링에서 application.yml 을 사용해서 환경 변수 값을 적용할 수 있다.

    기본 설정의 application의 파일은 src/main/resources에 위치하고, 설정이 변경될 때 마다 *.jar파일 생성을 위해 빌드를 다시해줘야 한다.

    profile 별 yml 구성 방법

    개발 환경(dev), 샌드박스 환경(sandbox), 베타 환경(beta), 운영 환경(prod) 등 각 환경 마다 환경 변수의 값이 다르게 설정되어야 하는 경우가 있다. 이러한 경우 Spring 애플리케이션을 실행시킬 때, -Dspring.profiles.active=dev와 같이 프로필 활성화 옵션을 주고 실행시킨다. 이 옵션은 애플리케이션 실행 시, 활성화 할 프로필이 dev라는 말이고, 개발 환경을 위한 환경변수를 설정하기 위한 옵션이다. 그렇다면 각 환경 별로 yml 파일을 어떻게 구성할까? 아래와 같은 방식들로 profile 별로 환경 변수를 구성할 수 있다.

    application 파일 자체에 profile 정보를 주거나, 실행시 profile의 정보를 주면 profile에 해당하는 파일을 읽어서 프로세스가 실행된다.

    1. application-{profile}.yml

    네이밍 컨벤션을 application-{profile}.yml 형태로 파일로 생성하면 그에 맞는 설정 파일을 읽어온다.

    |_external-api 모듈
    |  |_main/resources
    |     |_application-api-dev.yml 
    |     |_application-api-prod.yml 
    |_domain-rds 모듈
    |  |_main/resources
    |     |_application-rds-dev.yml 
    |     |_application-rds-prod.yml 

    다음과 같이 yml 파일 구성되어 있을 때, -Dspring.profiles.active=dev 로 실행시키면 application-api-dev.yml, application-rds-dev.yml 의 환경변수가 설정된다.

    2. spring.config.active.on-profile: {profile}

    하나의 yml 파일 내부에서 여러개의 profile 별로 환경변수를 작성하는 방식이다.

    --- 를 작성하면 각 profile을 구분지을 수 있다.

    spring.config.active.on-profile 를 작성하지 않으면 모든 profile에 동일하게 적용되는 환경 변수 값이다.

    # 모든 profile에 적용되는 환경 변수 값
    server:
      port: 8080
    
    ---
    # local 환경에 적용되는 환경 변수 값
    spring:
      config:
        activate:
          on-profile: local
    
    backend:
      base-url: http://localhost:8080
    
    ---
    # dev 환경에 적용되는 환경 변수 값
    spring:
      config:
        activate:
          on-profile: dev
    
    backend:
      base-url: *
    

    다른 모듈의 yml 가져오기 (spring.profiles.include)

    a 모듈이 b 모듈을 의존할 경우, a 모듈은 b 모듈에 있는 yml 파일을 가져와서 환경 변수를 주입 받아야 한다. 다양한 방법들이 존재하지만 나는 spring.profiles.include 방식을 사용했다.

    실행하려는 애플리케이션의 application.yml에 spring.profiles.include 값으로 특정 프로필을 명시한다면 그 프로필이 포함되고, 포함된 프로필에 해당하는 yml 파일을 불러오게 된다.

    • a 모듈(실행하려는 애플리케이션) > application.yml

    spring:
      profiles:
        include:
          - api
          - s3
          - rdb
          - redis
    • b 모듈 > application-rdb.yml

    spring:
      config:
        activate:
          on-profile: dev
      datasource:
        url: *
        username: *
        password: *
        driver-class-name: *
    ...
    
    ---
    
    spring:
      config:
        activate:
          on-profile: prod
      datasource:
        url: *
        username: *
        password: *
        driver-class-name: *
    ...

    위와 같이 작성하면, a 모듈은 include에 명시된 application-api.yml, application-s3.yml, application-rdb.yml, application-redis.yml 파일을 읽어온다. 이때, 자신이 의존(참조)하고 있는 모듈의 yml 파일만 읽어온다.

    이때, -Dspring.profiles.active=dev로 실행하면 읽어온 yml 파일들 중 모든 환경에서 적용되는 환경변수와 on-profile: dev 인 환경 변수들이 적용된다.

    실행 과정은 다음과 같다.

    1. a 모듈에서 기본으로 읽어오는 application.yml 을 통해 api, s3, rdb, redis 라는 프로필이 포함된다.

    2. a 모듈은 b 모듈을 참조하고 있다.

    3. rdb 라는 프로필이 포함되었으니, naming convention에 부합하는 b 모듈의 application-rdb.yml 파일을 환경변수 설정을 위해 읽어온다.

    해당 방식은 내가 의존하고 있는 다른 모듈들의 yml을 다 include 해줘야 하고, naming convention을 모두 application-${프로필 이름}.yml 로 통일해야 한다는 단점이 존재한다.

    이러한 단점을 해결하기 위해 모듈들의 yml을 모두 자동으로 scan 하도록 구성하는 라이브러리인 spring-boot-custom-yaml-importer 이 존재한다. 해당 라이브러리를 사용하면 resources/config/custom-*.yml 으로 작성된 yml 파일을 모두 로드해준다고 한다.

    여담이지만, 프로젝트 진행 중 다른 모듈이여도 같은 application.yml 파일명을 사용하면 충돌이 나서 값을 제대로 못 읽어오는 문제가 있었다.

    참고

    Externalized Configuration :: Spring Boot
    https://docs.spring.io/spring-boot/reference/features/external-config.html#features.external-config
    Spring 기반 멀티모듈 프로젝트 환경변수 설정 방법 | 카카오페이 기술 블로그
    Spring 기반 멀티모듈 프로젝트에서 환경변수 설정은 어떻게 하는 것이 좋을까요? 여러 가지 방법 중 프로젝트 구성에 도움이 될 만한 방법들을 모아봤습니다.
    https://tech.kakaopay.com/post/spring-multi-module-environment-variable/
    Spring 기반 멀티모듈 프로젝트 환경변수 설정 방법 | 카카오페이 기술 블로그






    - 컬렉션 아티클