2026-03-15

Spring Cloud Config로 MSA 설정 관리 중앙화하기 — 설정 반영 10분에서 1분으로

왜 설정 관리가 문제였나

헬스케어 플랫폼을 MSA로 설계하면서 서비스가 늘어났다. Edge API, Core API, Admin API, Partner API — 각 서비스마다 application.yml을 들고 있었고, 환경(dev/prod)까지 고려하면 관리해야 할 설정 파일이 기하급수적으로 늘어났다.

문제는 설정 하나 바꿀 때마다 각 서버에 들어가서 수동으로 반영해야 했다는 점이다. 서버가 4대면 4번 반복. 환경별로 하면 8번. 서버당 약 10분이 걸리니까, 단순 설정 변경에 거의 1시간을 쓰는 셈이었다.

Spring Cloud Config Server 도입

해결책은 설정을 중앙 저장소 한 곳에서 관리하는 것이었다. Spring Cloud Config Server를 도입했다.

구조

Git Repository (설정 파일 저장소)

Spring Cloud Config Server (중앙 설정 서버)

각 마이크로서비스 (Config Client)

핵심 설정

Config Server 쪽:

# config-server/application.yml
spring:
  cloud:
    config:
      server:
        git:
          uri: ${CONFIG_REPO_URI}
          default-label: main
          search-paths: '{application}'

각 서비스(Client) 쪽:

# core-api/application.yml
spring:
  config:
    import: configserver:${CONFIG_SERVER_URI}
  application:
    name: core-api
  profiles:
    active: ${SPRING_PROFILES_ACTIVE:dev}

이렇게 하면 각 서비스가 부팅할 때 Config Server에서 자기 이름(core-api)과 프로파일(dev/prod)에 맞는 설정을 자동으로 가져온다.

환경별 프로파일 분리

Git 저장소 구조를 이렇게 잡았다:

config-repo/
├── core-api/
│   ├── application.yml          # 공통
│   ├── application-dev.yml      # 개발
│   └── application-prod.yml     # 운영
├── admin-api/
│   ├── application.yml
│   ├── application-dev.yml
│   └── application-prod.yml
├── edge-api/
│   └── ...
└── partner-api/
    └── ...

공통 설정은 application.yml에, 환경별 차이만 application-{profile}.yml 넣었다. DB 접속 정보, Redis 호스트, 외부 API 키 같은 것들이 환경별로 달라지는 대표적인 항목이다.

설정 변경 반영 과정

이전에는:

  1. 각 서버 SSH 접속

  2. 설정 파일 수정

  3. 서비스 재시작

  4. 다음 서버로 이동... (반복)

지금은:

  1. Git 저장소에서 설정 파일 수정 + push

  2. Config Server가 변경 감지

  3. 각 서비스에 /actuator/refresh 호출 (또는 서비스 재시작)

설정 반영 시간이 서버당 약 10분에서 전체 1분 이내로 단축되었다. Git으로 관리하니까 변경 이력 추적, 롤백도 자연스럽게 된다.

운영에서 겪은 이슈

Config Server 장애 시

Config Server가 죽으면 서비스가 부팅할 때 설정을 못 가져온다. 이건 spring.cloud.config.fail-fast=false + retry 설정으로 대응했다. 이미 부팅된 서비스는 마지막으로 받은 설정을 캐시하고 있어서 영향 없다.

민감 정보 관리

DB 비밀번호 같은 건 Git에 평문으로 넣으면 안 된다. 우리는 환경변수로 주입하는 방식을 택했다:

spring:
  datasource:
    password: ${DB_PASSWORD}

Config Server가 ${} 플레이스홀더를 서빙하고, 각 서비스의 실행 환경에서 실제 값을 주입한다.

결과

항목BeforeAfter
설정 반영 시간서버당 ~10분전체 1분 이내
설정 변경 이력없음Git 히스토리
환경별 관리서버마다 수동프로파일로 자동 분리
롤백수동 복원git revert

MSA에서 서비스가 3~4개만 넘어가도 설정 관리는 반드시 중앙화해야 한다. Spring Cloud Config는 Spring 생태계에서 가장 자연스러운 선택이고, Git 기반이라 러닝 커브도 낮다. 다만 Config Server 자체의 고가용성은 별도로 챙겨야 한다.

관련 글

벡터 유사도 기반