On managing configuration

2025. 3. 4. 12:12Spring Microservice

🚀 Spring Cloud Configuration Server를 활용한 설정 관리 및 복잡성 해결

🎯 마이크로서비스 환경에서 설정 관리의 중요성

마이크로서비스는 빠르게 배포되고 실행될 수 있어야 하며, 최소한의 인간 개입으로 설정이 적용될 수 있어야 합니다.

수동 설정이 문제가 되는 이유

  • 사람이 직접 설정을 수정하면 설정 편차(Configuration Drift) 가 발생할 가능성이 높음
  • 예상치 못한 장애 발생 가능성이 커짐
  • 확장성 문제로 인해 빠르게 배포 및 운영하는 데 장애 요소가 됨

이 문제를 해결하기 위한 4가지 원칙
1️⃣ Segregate (분리)

  • 설정 정보는 애플리케이션 코드와 완전히 분리되어야 함
  • 설정 파일이 서비스 인스턴스에 포함되지 않아야 하며, 환경 변수나 중앙 설정 저장소에서 읽어야 함

2️⃣ Abstract (추상화)

  • 설정 정보는 직접 파일을 읽는 방식이 아니라, REST API 기반의 설정 서비스에서 가져오는 방식이 되어야 함

3️⃣ Centralize (중앙 집중화)

  • 마이크로서비스가 많아질수록 설정 저장소를 최소화해야 관리가 쉬움
  • 분산된 설정 파일이 아니라, 단일 중앙 저장소에서 관리해야 함

4️⃣ Harden (강화)

  • 설정 저장소는 고가용성(HA, High Availability)과 이중화(Redundancy)가 보장되어야 함
  • 설정이 외부에 존재하면 설정 저장소가 장애 시 서비스 전체가 영향을 받을 수 있음 → 이중화 필요

📌 설정을 코드와 분리하면 새로운 외부 의존성이 생기므로, 설정 데이터도 버전 관리가 필요함!

🛠 마이크로서비스 설정 관리 아키텍처

📌 마이크로서비스 부트스트래핑 과정

📌 아래 단계에서 마이크로서비스가 설정 정보를 로드함

1️⃣ 마이크로서비스 인스턴스가 시작되면, 설정 정보를 읽기 위해 설정 서비스에 요청
2️⃣ 실제 설정 데이터는 설정 저장소(예: Git, 데이터베이스, Key-Value Store 등)에 저장
3️⃣ 설정 변경은 빌드 및 배포 파이프라인을 통해 적용
4️⃣ 설정 변경 시, 서비스가 이를 감지하고 자동으로 반영

출처: Spring Microservices in Action 2nd Edition

 

🔥 설정 관리 시스템의 구현 방법

📌 오픈소스 기반 설정 관리 솔루션 비교

프로젝트 설명 특징

etcd Go 언어 기반, 서비스 디스커버리 및 Key-Value 저장소 역할 빠르고 확장 가능, CLI 기반, 설정 변경 시 즉시 반영
Eureka Netflix 개발, 마이크로서비스 디스커버리 및 설정 관리 지원 동적 클라이언트 리프레시 가능
Consul HashiCorp 개발, 서비스 디스커버리 + Key-Value 저장소 빠르고 DNS 통합 가능, 하지만 기본적으로 동적 리프레시 미지원
Zookeeper Apache 프로젝트, Key-Value 저장소 및 분산 락 기능 지원 가장 오래된 솔루션, 설정 관리에도 사용 가능하지만 복잡함
Spring Cloud Configuration Server Spring 기반의 설정 관리 서버 Spring Boot와 강력한 통합 지원, Git 및 Vault 연동 가능

Spring Cloud Configuration Server 선택 이유
✔ 설정 서버 구축이 매우 간단하고, Spring Boot 애플리케이션과 원활하게 통합 가능
✔ 다양한 백엔드 스토리지(Git, Vault, 파일 시스템 등)를 활용 가능
✔ Git과 HashiCorp Vault와 직접 통합할 수 있음

출처: Spring Microservices in Action 2nd Edition

 

🔧 Spring Cloud Configuration Server 구현

1️⃣ 설정 서버 (Spring Cloud Config Server) 구축

  1. spring-cloud-config-server 의존성 추가
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-config-server</artifactId>
</dependency>
  1. @EnableConfigServer 추가
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}
  1. application.yml에서 설정 원본(Git 등) 지정
server:
  port: 8888  # 설정 서버 포트

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/my-config-repo  # 설정이 저장된 Git 저장소
          default-label: main

📌 이제 설정 서버가 Git에서 설정을 가져와 제공할 수 있음

2️⃣ 마이크로서비스 클라이언트 설정

  1. 클라이언트 서비스에 spring-cloud-starter-config 의존성 추가
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  1. bootstrap.yml에서 설정 서버 지정
spring:
  application:
    name: licensing-service
  cloud:
    config:
      uri: http://localhost:8888  # 설정 서버 주소
  1. 클라이언트 애플리케이션이 시작되면, 설정 서버에서 자동으로 설정을 로드

📌 설정 서버의 데이터 확인

curl http://localhost:8888/licensing-service/default

 

3️⃣ HashiCorp Vault를 활용한 보안 설정

민감한 정보(예: DB 비밀번호, API 키)는 Vault를 활용하여 보안 강화

spring:
  cloud:
    config:
      server:
        vault:
          uri: https://vault.example.com
          authentication: TOKEN
          token: my-secret-token

민감한 정보는 Git이 아니라 보안이 강화된 저장소에서 관리해야 함!

🏆 Spring Cloud Configuration Server 도입 효과

문제 Config Server 사용 시 해결

설정 변경 시 코드 배포 필요 설정 변경 후 애플리케이션 재배포 없이 즉시 반영
설정 관리가 복잡함 중앙 집중식 관리로 설정 일관성 유지
보안 문제 발생 가능 민감한 데이터 암호화 및 보안 저장소 활용 가능
설정 변경 후 서비스 재시작 필요 클라이언트가 자동으로 변경 사항 감지하여 반영

🎯 Summary

설정 정보를 코드와 완전히 분리하고, 중앙화된 설정 저장소에서 관리해야 함
Spring Cloud Config Server를 활용하면 설정을 중앙에서 관리하고 동적으로 반영 가능
✅ Git, HashiCorp Vault 등 다양한 저장소와 연동 가능
✅ 설정 변경 시 애플리케이션을 재배포하지 않고도 즉시 반영 가능
✅ 보안이 중요한 설정 정보는 Vault 등 보안 저장소 활용 필수

 

💡 이제 Spring Cloud Configuration Server를 활용하여 효과적인 마이크로서비스 설정 관리 시스템을 구축해보세요! 🚀