Spring Cloud Config 도입기: 구성부터 실시간 설정 반영까지

2025. 7. 24. 22:37·Java & Spring

 

이번 포스팅에서는 Spring Cloud Config 설정에 대해 다루고자 합니다.

사용하게된 이유와 그리고 어떤 이점이 있었는지 다시 한 번 정리해보고자 합니다.

 

 

Spring Cloud Config 란?

"Spring Cloud Config는 마이크로서비스 환경에서 분산된 설정 관리를 중앙에서 할 수 있도록 도와주는 구성 관리 도구입니다."

 

1. 도입 배경

1. 장점

  •  공통 설정의 중앙 집중화  
       - 여러 서버에서 사용하는 설정을 Git에 저장하여 하나의 Config Server로 통합 관리할 수 있습니다.
  • 무중단 설정 변경  
       - 설정 변경 시 애플리케이션을 재시작하지 않아도 `/actuator/refresh` 엔드포인트를 통해 실시간으로 반영할 수 있습니다.

 

ex) rabbitMQ 에서 사용하는 queue 의 이름들을 config 에서 관리한다고 가정합니다.

만약 작업 도중 queue 의 이름이 변경되는 경우가 존재할 때 배포 없이 바로 queue 이름을 config에서 수정하여 반영이 가능했습니다.

 

물론 장점만 있는 것은 아닙니다. 

 

다음과 같은 이슈 사항들이 있을 수 있는데요

 

2. 이슈 사항

- 장애 발생

  • Config Server 에 문제가 생기거나 또는 네트워크 이슈로 설정 데이터를 읽지 못할 수 있습니다.

- 인프라 관리

  • 아무래도 서버가 추가되다 보니 관리포인트가 증가합니다.

 

그럼에도 불구하고, 단점보다는 장점이 더 많다고 판단하여 사용하게 됐습니다.

 

자 이제 그럼 구성하는 방법부터 실제 config server 를 통한 값들이 어떻게 주입되는지 진행해 보도록 하겠습니다.

 

2. git repository 준비

1. config 를 사용할 git repository를 생성하고 테스트할 config를 넣어줬습니다.

 

파일 명은 application-dev.yml 로 sufffix 에 -dev 로 생성하였습니다.

 

curl http://localhost:8080/application/dev 과 같이 호출을 하여 dev 환경의 yml 에 접근하는 방식으로 진행하도록 하겠습니다.

rabbitmq:
  name1: "queue1"
  name2: "queue2"

 

2. git repository 에 ssh 연결을 위해 설정 진행하는데 ssh key를 발급받고 저장한다.

ssh-keygen -t rsa -b 4096 -C "<github account email>" -f "<save path>"

3. 해당 발급된 키를 조회하여 git repository ssh 에 넣는다. (.pub 으로 조회해서 public key 를 조회해야 함)

cat <saved ssh key>.pub

 

그러면 다음과 같이 저장된 키가 조회됩니다!

 

4. 해당 key 를 git ssh key 에 추가합니다.

- new ssh key 로 추가하면 됩니다.

 

이렇게 되면 git repository 는 준비가 끝났습니다.

3. Spring Cloud Config 서버 구성

1. 필요한 디펜던시는 다음과 같습니다.

implementation 'org.springframework.cloud:spring-cloud-config-server'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.eclipse.jgit:org.eclipse.jgit:6.8.0.202311291450-r' //git 연동을 위한

 

2. application.yaml 구성

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git: #ssh 연결로 처리하기 위해 다음과 같이 설정
          uri: <생성한 github 주소>  # Git 저장소 주소 (SSH)
          private-key: <생성한 ssh private key> # terminal 에서 나온 문자열을 "" 로 감싸서 넣어주세요.
          ignore-local-ssh-settings: true  # 시스템 SSH 설정 무시하고 위에서 제공한 private-key 사용
          clone-on-start: true  # 서버 시작 시 Git에서 설정을 자동으로 클론
          default-label: main
          search-paths: config # config 파일이 들어있는 디렉토리로 준비함.

management:
  endpoints:
    web:
      exposure:
        include: health, info, env, refresh # 다음 엔드포인트들을 노출하고 refresh 는 config 동기화

 

- 간단한 테스트이므로 ssh 발급키를 바로 주입하여 사용하기 위해 위와 같이 설정했습니다.

- private-key 를 터미널에서 출력하면 여러줄로 나올 수 있는데, 그러면 config server 가 ssh key를 읽을 때 제대로 읽히지 않는 문제가 발생합니다. 따라서 다음 명령어로 한줄로 출력 한 후 붙여넣기하면 정상적으로 ssh key 를 인식할 수 있습니다.

 

⚠️ 주의: 위 예제에서는 학습 목적으로 private key를 직접 설정에 포함했지만, 실제 운영환경에서는 환경 변수나 Vault 등 보안 저장소를 사용하는 것이 안전합니다.

 

awk 'NF {printf "%s\\n", $0}' <ssh key 경로>

 

 

3. config server 사용 설정

@SpringBootApplication
@EnableConfigServer //spring cloud config server 로 사용하겠다 선언
public class SpringCloudConfigApplication {

    public static void main(String[] args) {
       SpringApplication.run(SpringCloudConfigApplication.class, args);
    }

}

 

4.서버 실행 후 curl 요청을 통해 config 값 가져오는지 테스트 입니다.

  • 요청을 통해 source 부분에 git 에 정의되어 있는 config 값을 가져오는 것을 확인할 수 있습니다.

 

여기까지 준비가 되면 config server에 대한 구성은 끝납니다.

다음 단계는 실제 운영되는 application-server 에서 config 요청을 위한 설정 입니다.

 

 

4. Spring Config Client 

  • Config Server 에서 config 를 사용하는 Server입니다.
  • config 값들을 Properties 객체에 주입하여 사용합니다.

1. 디펜던시

implementation 'org.springframework.boot:spring-boot-starter-actuator' // config 정보를 최신화 할 때 사용
implementation 'org.springframework.cloud:spring-cloud-starter-config' // config client 로 사용될 때 사용
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-web'

 

2. application.yaml 설정

management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info  # /actuator/refresh 활성화로 config 업데이트 동기화 가능하도록 선언

spring:
  config:
    import: "optional:configserver:"
  cloud:
    config:
      uri: http://localhost:8888  # Config Server의 주소
      fail-fast: true  # 설정을 못 가져오면 예외 발생
      retry:
        max-attempts: 5  # 실패 시 최대 5번 재시도
      label: main
      profile: dev

 

3. ConfigProperties 를 생성하여 config 값을 주입받도록 설정합니다.

- 꼭 Setter 가 있어야 주입됩니다.

- Prefix 는 yml 에서 시작되는 key 값을 넣어줍니다.

@Component
@ConfigurationProperties(prefix = "rabbitmq")
@Getter
@Setter
public class ConfigProperties {

    private String name1;
    private String name2;
}

 

4. HealthCheckController 를 생성 후 호출하여 Spring 이 실행중에 주입된 값이 잘 불어와지는지 테스트를 진행했습니다.

@RequiredArgsConstructor
@RestController
@Slf4j
public class HealthCheckController {

    private final ConfigProperties configProperties;

    @GetMapping("")
    public String healthCheck(){
        log.info("rabbitMQ name1 = "  + configProperties.getName1());
        log.info("rabbitMQ name2 = "  + configProperties.getName2());
        return "hello";
    }
}

 

5. git config 를 변경 후 테스트

값을 다음과 같이 업데이트를 진행했습니다 업데이트 이후 어떻게 값이 변경되는지 확인해 보도록 하겠습니다.

 

 

다시 호출한 결과 동일한 결과가 출력되는 것을 확인할 수 있습니다. 

config server 에 아직 새로 업데이트 된 config 가 주입이 안되어 다음과 같이 최신화된 config 주입이 안된것입니다.

 

 

하지만 실제 config-server 에 curl 요청을 날려보면 다음과 같이 업데이트 된 값이 확인됩니다.

즉, 최신화된 config 를 다시 주입시키면 새로운 값을 사용 가능합니다.

 

 

6. config client 업데이트

다음 요청을 통해 config-client 의 config 정보들을 서버의 최신정보로 업데이트 할 수 있습니다.

curl -X POST http://localhost:8080/actuator/refresh

 

요청을 날리면 config client server 로그에 config 를 config-server로 부터 다시 패칭해왔다는 로그를 확인할 수 있습니다.

 

 

7. 실제 업데이트 이후 config client 요청

 

다음 이미지처럼 업데이트된 config가 출력되는 것을 확인할 수 있습니다.

 

 

 

정리

Spring Cloud Config를 활용하면 설정을 Git 기반으로 중앙 관리할 수 있고, actuator refresh 기능을 통해 실시간 반영도 가능합니다.  
구성 과정에서 보안, 네트워크, 설정 누락 등 주의사항이 있지만, 일관된 설정 관리를 위해 매우 유용한 도구입니다.

 

이렇게해서 Spring Cloud Config 의 Server 구성부터 사용 예제 그리고 실시간으로 변경된 결과 반영까지 살펴봤습니다.

 

프로젝트에 도입했던 내용을 다시 정리할 수 있는 좋은 시간이었습니다.

 

감사합니다.

 

혹시라도 잘못된 부분이 있거나 수정할 부분 있으면 편하게 댓글 부탁드려요!

 

전체 코드

 

 

blog-code/spring-cloud-config at main · jjjwodls/blog-code

Contribute to jjjwodls/blog-code development by creating an account on GitHub.

github.com

 

'Java & Spring' 카테고리의 다른 글

Awaitility로 비동기 이벤트 테스트 하기: Spring @Async와 함께 쓰는 법  (3) 2025.07.29
Java Enum 다형성으로 Notification 처리 리팩토링하기 - 조건문 없는 전략 설계  (1) 2025.07.26
Spring Rest Docs 적용 3 - Controller Test 작성을 통한 문서화  (2) 2025.07.22
Spring Rest Docs 적용 2 - Swagger 연동  (1) 2025.07.21
Spring Rest Docs 적용  (4) 2024.10.17
'Java & Spring' 카테고리의 다른 글
  • Awaitility로 비동기 이벤트 테스트 하기: Spring @Async와 함께 쓰는 법
  • Java Enum 다형성으로 Notification 처리 리팩토링하기 - 조건문 없는 전략 설계
  • Spring Rest Docs 적용 3 - Controller Test 작성을 통한 문서화
  • Spring Rest Docs 적용 2 - Swagger 연동
jaess
jaess
jaess 님의 블로그 입니다.
  • jaess
    개발하는 개발자
    jaess
  • 전체
    오늘
    어제
    • 분류 전체보기 (9)
      • 회고 (1)
      • API 설계 (1)
      • 생각정리 (0)
      • Java & Spring (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    개발자
    무중단설정변경
    스프링이벤트
    junit5
    Awaitility
    Spring Actuator
    코드리팩토링
    Git 설정 관리
    Spring boot
    CleanCode
    비동기 메시징
    분기처리개선
    TransactionalEventListener
    백엔드개발
    비동기 테스트
    이벤트 리스너
    RestDoc
    비동기이벤트
    REST API
    Spring Cloud Config Server
    ifelse지옥탈출
    Spring Cloud Config Client
    Spring
    @Async
    springboot
    Spring Event
    Spring Cloud Config
    Spring cloud
    OOP (Object Oriented Programming)
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
jaess
Spring Cloud Config 도입기: 구성부터 실시간 설정 반영까지
상단으로

티스토리툴바