[JAVA] Spring Cloud Config 서버 구축하기 — 마이크로서비스 환경에서의 중앙 설정 관리

마이크로서비스 환경에서는 여러 서비스가 동시에 동작하기 때문에, 각 서비스의 설정 파일(application.yml 등)을 개별적으로 관리하면 유지보수가 매우 어렵습니다. 이 문제를 해결하기 위해 Spring Cloud는 Config Server를 제공합니다. 

 

 

Spring Cloud Config란?

Spring Cloud Config는 분산 환경에서 각 서비스의 환경 설정을 중앙에서 관리할 수 있도록 해주는 구성 관리 서버입니다. 하나의 Config 서버가 여러 서비스의 설정 파일을 관리하며, 각 서비스는 실행 시 Config 서버를 통해 설정 정보를 가져옵니다.

이 방식은 다음과 같은 장점이 있습니다:

  • 환경별 설정 관리 용이: 개발(dev), 스테이징(staging), 운영(prod) 설정을 중앙에서 통합 관리
  • 무중단 설정 변경: 서비스 재배포 없이 설정 변경 반영 가능 (Spring Cloud Bus와 연계)
  • 버전 관리 가능: Git 연동을 통한 설정 이력 추적 및 롤백 가능

 

Config 서버 구조 이해

Spring Cloud Config 서버는 크게 두 부분으로 구성됩니다:

  • Config Server: 설정 정보를 관리하고 외부로 제공하는 중앙 서버
  • Config Client: Config Server에서 설정을 가져와 사용하는 각 마이크로서비스

+-------------------+        +-------------------------+
|   Config Server   | --->   |   Client Application A  |
|  (Git Repository) |        |   Client Application B  |
+-------------------+        +-------------------------+

각 클라이언트 서비스는 자신에게 필요한 설정을 Config Server에서 가져옵니다. 이때 Config Server는 Git, SVN, 또는 로컬 디렉토리 등 다양한 저장소를 설정 소스로 사용할 수 있습니다.

 

Config Server 구축 단계

1. 의존성 추가 (Gradle)

Spring Boot 프로젝트를 생성한 후, build.gradle에 아래 의존성을 추가합니다.

implementation 'org.springframework.cloud:spring-cloud-config-server'
implementation 'org.springframework.boot:spring-boot-starter-web'

2. 메인 클래스 설정

Config Server를 활성화하려면 @EnableConfigServer 애노테이션을 추가합니다.

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

3. application.yml 설정

Config Server는 Git 저장소 또는 로컬 경로에서 설정 파일을 읽어옵니다. 아래는 Git 연동 예시입니다.

server:
  port: 8888

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/example/config-repo
          default-label: main
          search-paths:
            - config

위 설정은 GitHub의 example/config-repo 저장소에서 설정 파일을 읽어오도록 구성한 예시입니다.

 

4. Git 저장소 구성

Git 저장소에는 각 서비스별 설정 파일을 환경별로 구분하여 저장합니다.


config-repo/
 ├── user-service-dev.yml
 ├── user-service-prod.yml
 ├── order-service-dev.yml
 └── order-service-prod.yml

이때 Config Client는 자신의 서비스명과 프로필(dev, prod 등)에 따라 적절한 설정 파일을 자동으로 가져옵니다.

 

Config Client 설정 예시

각 마이크로서비스에서는 bootstrap.yml 파일에 Config Server 주소를 명시해야 합니다.

spring:
  application:
    name: user-service
  profiles:
    active: dev
  cloud:
    config:
      uri: http://localhost:8888

이렇게 설정하면 user-service-dev.yml 파일이 자동으로 로드됩니다.

 

Config Server 응답 확인

Config Server를 실행한 후 아래 주소로 접근하면 설정이 올바르게 제공되는지 확인할 수 있습니다.

http://localhost:8888/user-service/dev

정상적으로 설정 파일이 로드되면 JSON 형식으로 설정 내용이 반환됩니다.

 

실무에서의 베스트 프랙티스

  • 환경 분리: dev/staging/prod 환경별로 별도 설정 파일 구성
  • 보안 설정: DB 비밀번호, API 키 등은 암호화 후 Config Server에 저장 (Spring Cloud Config Encrypt)
  • 무중단 반영: Spring Cloud Bus + RabbitMQ를 통해 설정 변경 자동 반영
  • Git 브랜치 전략: main(운영), develop(테스트) 등으로 분리하여 설정 안정성 확보

 

Config Server 보안 강화

운영 환경에서는 Config Server에 Spring Security를 적용하여 인증을 거쳐야만 접근할 수 있도록 해야 합니다.

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }
}

이렇게 하면 Git 설정을 외부에서 임의로 접근할 수 없게 보호할 수 있습니다.

 

Config Server와 Spring Cloud Bus 연동

Config Server와 Bus를 연동하면, 설정 변경 시 모든 마이크로서비스에 즉시 변경 내용을 반영할 수 있습니다.

implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'

Git에 설정을 수정한 후 아래 엔드포인트를 호출하면 모든 서비스가 자동으로 새 설정을 반영합니다.

POST http://config-server:8888/actuator/busrefresh

이 기능은 운영 환경에서 무중단 설정 배포를 구현할 때 필수적입니다.

 

주의할 점

  • Config Server 장애 시 전체 서비스 구동 실패 가능 → 이중화 구성 필요
  • Git 저장소 접근 속도에 따라 초기 구동 시간 증가 가능
  • 민감정보 암호화 필수 (encrypt.key 설정 활용)
  • Config Client는 bootstrap.yml에 설정을 반드시 위치시켜야 함

 


 

Spring Cloud Config 서버는 마이크로서비스 환경의 핵심 인프라 중 하나로, 중앙화된 설정 관리와 서비스 간 일관성을 제공합니다. 올바르게 구성하면 서비스 배포 주기를 단축하고, 운영 효율성을 극대화할 수 있습니다.