Spring 멀티모듈 프로젝트에서 환경변수 설정하는 최적의 정리

궁금하면 500원·2025년 2월 3일

미생의 스프링

목록 보기
32/48

Spring 멀티모듈 프로젝트, 환경변수 설정 어떻게 할까요?🧐

오늘은 Spring 기반 멀티모듈 프로젝트에서 효율적인 환경변수 관리 방법을 소개합니다!

🏗️ 멀티모듈 프로젝트에서 환경변수 설정의 필요성

멀티모듈 프로젝트는 독립적인 모듈을 조합하여 확장성과 유지보수성을 높입니다.
하지만 각 모듈이 다른 환경에서 실행되므로, 체계적인 환경변수 관리가 필수적입니다.

⚙️ 환경변수 설정 방법 비교

Spring에서는 @Profile과 @PropertySource를 활용하여 프로필별 환경변수를 로드할 수 있습니다.
이를 통해 개발, 테스트, 운영 환경에 맞는 설정을 유연하게 적용할 수 있습니다.

🔎 최종 선택: @Profile + @PropertySource 조합

@Profile과 @PropertySource 조합을 활용하여 프로필별 환경변수를 효과적으로 관리했습니다.
이 방식은 유지보수성을 높이면서도 명확한 환경 구분을 가능하게 한다 생각합니다.

Spring 멀티모듈 프로젝트의 환경변수 설정 전략

💡 리뷰어 한줄평

대규모 Spring 기반 서비스를 개발하다 보면 코드의 재사용성과 유지보수성을 위해 멀티모듈 구조를 채택하게 됩니다.

하지만 모듈이 늘어날수록 환경변수 관리의 복잡도도 함께 증가하게 됩니다.

이 포스팅에서는 멀티모듈 프로젝트에서 환경변수를 효율적으로 관리하는 방법들을 비교 분석하고, 실제 프로젝트에 적용할 수 있는 최적의 전략을 제시하고자 합니다.

멀티모듈 프로젝트의 환경변수 관리 문제

멀티모듈 프로젝트에서 환경변수 관리시 다음과 같은 문제들을 마주치게 됩니다.

  1. 모듈 간 중복된 환경변수 설정
  2. 환경(개발/스테이징/운영)별 설정값 관리의 어려움
  3. 새로운 모듈 추가시 환경변수 설정 누락 위험
  4. 설정 파일 위치와 네이밍 컨벤션 표준화 부재

이러한 문제들을 해결하기 위해 Spring에서 제공하는 4가지 주요 환경변수 설정 방법을 살펴보겠습니다.

환경변수 설정 방법 비교 분석

1. spring.config.import 방식

spring:
  config:
    import:
      - 'classpath:module-config.yml'

장점

  • 설정 파일 포함 관계가 명시적
  • yml 파일 이름 제약이 없어 자유로운 구성 가능

단점

  • 각 애플리케이션마다 필요한 설정 파일을 모두 명시해야 함
  • 설정 누락 위험이 높음

2. spring.profiles.include 방식

spring:
  profiles:
    include: module-profile

장점

  • 프로필 기반으로 환경변수 파일을 자동 로드
  • 설정 파일 통합 관리 용이

단점

  • application-{profile}.yml 네이밍 규칙 강제
  • 프로필 충돌 가능성 존재

3. @PropertySource 단독 사용

@Configuration
@PropertySource("classpath:/config/module-config.properties")
class ModuleConfig

장점

  • 모듈별 설정 파일 분리가 명확
  • 설정 파일 위치 커스터마이징 자유도 높음

단점

  • properties 파일만 지원
  • 설정 클래스 추가 작성 필요

4. @Profile + @PropertySource 조합

@Configuration
class ProfileConfig {
    @Configuration
    @Profile("dev")
    @PropertySource("classpath:/config/dev.properties")
    class DevConfig
    
    @Configuration
    @Profile("prod")
    @PropertySource("classpath:/config/prod.properties")
    class ProdConfig
}

장점

  • 환경별 설정 분리가 명확
  • 설정 파일 관리가 체계적
  • 유지보수성과 확장성이 우수

단점

  • 환경별 설정 클래스 추가 필요
  • 초기 설정 비용이 다소 높음

최적의 환경변수 관리 전략

실무 경험을 바탕으로, @Profile과 @PropertySource를 조합한 방식을 추천합니다.
그 이유는 다음과 같습니다.

1. 명확한 책임 분리

  • 환경별로 독립된 설정 파일 관리
  • 모듈별 설정의 응집도 향상

2. 유지보수 용이성

  • 설정 변경시 영향 범위가 명확
  • 실수로 인한 설정 누락 방지

3. 확장성

  • 새로운 환경 추가가 용이
  • 모듈 확장시 설정 구조 재사용 가능

4. 설정 오류 조기 발견

  • 컴파일 타임에 설정 파일 존재 여부 확인
  • 런타임 설정 오류 최소화

실제 적용 예시

// 모듈별 설정 기본 구조
src/main/resources/
  ├── config/
  │   ├── database/
  │   │   ├── dev.properties
  │   │   └── prod.properties
  │   └── redis/
  │       ├── dev.properties
  │       └── prod.properties

// 데이터베이스 설정
@Configuration
class DatabaseConfig {
    @Configuration
    @Profile("dev")
    @PropertySource("classpath:/config/database/dev.properties")
    class DevConfig
    
    @Configuration
    @Profile("prod")
    @PropertySource("classpath:/config/database/prod.properties")
    class ProdConfig
}

// Redis 설정
@Configuration
class RedisConfig {
    @Configuration
    @Profile("dev")
    @PropertySource("classpath:/config/redis/dev.properties")
    class DevConfig
    
    @Configuration
    @Profile("prod")
    @PropertySource("classpath:/config/redis/prod.properties")
    class ProdConfig
}

구현시 주의사항

1. 설정 파일 구조화

  • 목적별로 디렉토리 구조화
  • 명확한 네이밍 컨벤션 수립

2. 중복 설정 방지

  • 공통 설정은 별도 파일로 분리
  • 상속 구조를 활용한 설정 재사용

3. 보안 고려사항

  • 민감한 정보는 외부 설정 관리
  • 환경변수나 암호화 처리 활용

4. 테스트 용이성

  • 테스트용 설정 프로필 구성
  • 설정 변경이 용이한 구조 유지

결론

멀티모듈 프로젝트의 환경변수 관리는 서비스의 안정성과 유지보수성에 직접적인 영향을 미치는 중요한 요소입니다.

@Profile과 @PropertySource를 조합한 방식은 초기 설정 비용이 다소 높을 수 있으나, 장기적인 관점에서 프로젝트의 확장성과 유지보수성을 크게 향상시킬 수 있습니다.

이러한 설정 전략은 단순히 기술적인 선택이 아닌, 프로젝트의 아키텍처와 운영 효율성에 직접적인 영향을 미치는 중요한 의사결정입니다.

각 프로젝트의 특성과 팀의 상황을 고려하여 최적의 전략을 선택하시기 바랍니다.

참고자료

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글