스프링에서는 운영 체제의 환경 변수를 가지고 필요한 설정 정보를 가져와서 세팅하기 쉽다:

  • Spring 어플리케이션은 부팅될 때 자동으로 환경 변수를 쭉 읽고나서 Environment 객체로 추상화시키니까. @Value 애노테이션을 통해서 환경 변수 값을 읽기만 하면 됨.

 

하지만 환경 변수를 사용할 때도 처리할 수 없는 문제들이 있음:

  • 설정 데이터도 관리가 필요할텐데 어디서 관리해야 하는가?
  • 환경 변수의 설정 데이터에 대한 세부적인 제어는 어떻게 할 것인가?
  • 설정 데이터를 변경한 이후에 어플리케이션을 다시 부팅하지 않고도 런타임에 읽을 수 있는 방법은 무엇인가?
  • 여러 서버나 클라우드 환경에서 여러 인스턴스의 어플리케이션을 실행할 때 각 인스턴스의 환경 변수를 일관되게 설정하고 유지하는 방법은 무엇인가?
  • 스프링 부트의 속성이나 환경 변수는 암호화를 지원하지 않기 때문에 암호를 안전하게 저장할 순 없다. 어떻게 관리해야할까?

 

스프링 생태계에서 이 문제를 다루는 방법은 다음과 같다:

  • 설정 서비스 (Configuration Service): 스프링 클라우드는 다양한 분산 시스템 환경에서 애플리케이션 설정과 서비스 관리를 위한 툴을 제공한다:
    • 지원하는 스프링 클라우드 서비스는 다양하게 있다. 여기서는 자주 쓰이는 Config 와 Vault 에 대해서만 알아보자.
    • Spring Cloud Config
    • Spring Cloud Vault
    • Spring Cloud Alibaba
    • Spring Cloud Consul
    • Spring Cloud Zookeeper
  • 클라우드 공급업체 이용하기:
    • AWS 의 Parameter Store, GCP 의 Secret Manager, Azure 의 Vault 와 통합하면 된다.
  • 클라우드 플랫폼 서비스 이용하기:
    • 쿠버네티스 플랫폼의 Config 와 Secret 이용하기

 

1) Spring Cloud Config:

  • 목적: Spring Cloud Config는 중앙 집중식으로 애플리케이션 설정을 관리할 수 있도록 설계된 프로젝트임. 이를 통해 여러 환경(개발, 테스트, 프로덕션)에 걸쳐 애플리케이션 설정의 일관성을 유지하고, 변경사항을 쉽게 적용할 수 있다.
  • 특징:
    • 중앙 집중식 관리: 모든 환경에 대한 구성 설정을 중앙 서버에서 관리한다.
    • 버전 관리: 구성 파일을 Git이나 Subversion 같은 버전 관리 시스템에 저장함으로써 변경 이력을 관리하고 필요시 이전 버전으로 롤백할 수 있다.
    • 환경 분리: 개발, 테스트, 프로덕션 등 다양한 환경 설정을 분리하여 관리할 수 있다.
    • 동적 갱신: 애플리케이션을 재시작하지 않고도 구성 변경 사항을 적용할 수 있다.
  • 언제 사용:
    • 여러 환경에 걸쳐 구성 설정의 일관성을 유지해야 할 필요가 있을 때
    • 설정 변경을 자주하고 이를 빠르게 반영할 수 있어야 할 때
    • 클라우드 환경에서 여러 마이크로서비스 인스턴스를 운영할 때 설정 관리가 복잡해지는 문제를 해결하고자 할 때

 

Spring Cloud Config 사용 방법 예시:

  • Spring CLoud Config 서버와, 이를 사용할 클라이언트 이렇게 구별될거다.

 

먼저 서버 설정:

  1. 의존성 추가: pom.xml 또는 build.gradle 파일에 Spring Cloud Config 서버 의존성을 추가합니다.
<!-- pom.xml -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-config-server</artifactId>
  <version>{version}</version>
</dependency>

 

  1. 어플리케이션 부트스트랩 클래스 설정:
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}    

 

  1. application.properties 또는 application.yml 설정:
# application.yml
server:
  port: 8888
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/yourusername/config-repo
          clone-on-start: true
  • 여기서 uri는 구성 파일을 관리할 Git 리포지토리의 주소임.
  • clone-on-start: true 설정을 하면 Spring Cloud Config Server가 시작될 때 지정된 uri에서 구성 저장소의 전체 클론을 만들도록 지시한다. 이렇게 설정하면 서버가 처음 시작될 때 저장소의 최신 상태를 가져와서 로컬에 복제하게 되므로, 구성 서버가 구성 정보에 즉시 액세스 할 수 있다. 이 설정은 특히 구성 정보가 자주 업데이트되거나 초기 구성 로딩 시점에 항상 최신의 구성을 반영하기 원할 때 유용하다.
  • 약 clone-on-start를 false로 설정한다면, 서버는 필요할 때까지 저장소를 클론하지 않고, 필요한 구성 정보만 요청에 따라 가져오게 된다. 이는 시작 시간을 단축할 수 있지만, 최신 구성을 반영하는 데는 다소 지연이 발생할 수 있다.

 

다음으로 Config 클라이언트 설정:

  1. 의존성 추가:
<!-- pom.xml -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

 

  1. 부트스트랩 파일 설정 (bootstrap.properties 또는 bootstrap.yml):
# bootstrap.yml
spring:
  application:
    name: client-app
  cloud:
    config:
      uri: http://localhost:8888
      username: configuser
      password: configpassword
  • URL은 Config 서버의 주소이다.
  • username (spring.cloud.config.username) 은 Config 서버에 접근하기 위한 사용자 이름을 제공한다. Config 서버가 기본적으로 보안 설정을 요구하지 않는 경우에는 이 값을 설정할 필요가 없다. 하지만, 보안이 활성화된 서버의 경우, 이 사용자 이름을 통해 인증 절차를 거쳐 접속할 수 있다.
  • password (spring.cloud.config.password) 는 위의 사용자 이름에 대한 비밀번호이다. 마찬가지로, Config 서버에 대한 접근이 보안으로 보호되는 경우, 해당 사용자 계정의 비밀번호를 이 필드에 설정해야 한다.
  • Spring Cloud Config Server 를 보안적으로 관리하고 싶다면 Spring Security 를 이용해서 보안 구성을 줄 수 있다.

 

추가 예제: Spring Security를 이용한 Config Server 보안 설정

  1. 의존성 추가: 우선, Spring Cloud Config Server 프로젝트의 pom.xml 또는 build.gradle 파일에 Spring Security 의존성을 추가한다.
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

 

  1. 보안 구성 추가: 다음으로, application.yml 또는 application.properties 파일에 보안 관련 설정을 추가한다. 사용자 이름과 비밀번호를 정의할 수 있습니다. application.yml 설정 예:
spring:
  security:
    user:
      name: configuser
      password: configpassword
  cloud:
    config:
      server:
        git:
          uri: https://your-git-repository.com
          clone-on-start: true

 

  1. HTTPS 사용 권장: 보안을 강화하기 위해 HTTPS를 통한 접근을 설정하는 것이 좋다. 이는 전송 중인 데이터를 암호화하여 보호한다. application.yml에서 HTTPS 설정
server:
  port: 8443
  ssl:
    enabled: true
    key-store: path/to/keystore.p12
    key-store-password: yourkeystorepassword
    keyStoreType: PKCS12
    keyAlias: tomcat
  • 이렇게하면 Spring Cloud Config Server는 기본적으로 제공되는 사용자 이름과 비밀번호를 사용하여 보안 접속을 요구하게 된다.
  • 그리고 클라이언트는 이러한 설정에 맞춰 인증 정보를 제공하여 Config 서버에 접속해야한다.

 

 

Q) 그러면 git url 에서 최신 파일이 커밋되서 설정 정보가 바뀐 경우에는 Spring Cloud Config Server 는 어떻게 최신값을 가지게 돼? 재배포를 해야해?

 

Spring Cloud Config Server 는 설정 정보가 업데이트 될 때 자동으로 최신 값을 반영하도록 설정할 수 있음.

 

다음 두 가지 방법이 있다:

  • Webhook 사용: GitHub이나 다른 Git 호스팅 서비스는 원격 저장소에 변경이 발생할 때마다 특정 URL로 HTTP 요청을 보내는 Webhook을 지원한다. Spring Cloud Config Server는 이러한 Webhook 요청을 받아 처리할 수 있도록 설정할 수 있다. Webhook이 설정 서버에 알리면, 설정 서버는 변경된 구성을 새로 불러올 수 있다.
  • /monitor 엔드포인트 사용: Spring Cloud Bus와 함께 사용하면, /monitor 엔드포인트를 통해 변경 사항을 감지하고 관련 애플리케이션에 이벤트를 전송하여 환경을 새로고침할 수 있다. 이 방법은 메시징 시스템을 통해 마이크로서비스 아키텍처에서 많은 서비스가 동시에 구성 변경을 적용할 수 있도록 한다 .

 

2) Spring Cloud Vault

  • 목적:
    • Spring Cloud Vault는 HashiCorp Vault를 이용하여 애플리케이션의 비밀 데이터를 안전하게 관리하도록 설계된 프로젝트임.
    • HashiCorp Vault는 API를 통해 접근할 수 있는 안전한 중앙 저장소로, 암호, 인증서, API 키, 토큰 등의 민감한 데이터를 안전하게 저장하고 제어할 수 있음.
  • 특징:
    • 안전한 저장소: Vault는 민감한 데이터를 암호화하여 저장하여, 유출 위험을 최소화한다.
    • 액세스 제어: 사용자와 시스템에 대한 엄격한 액세스 제어를 통해 보안을 강화한다.
    • 다이내믹 시크릿: 임시 사용을 위한 동적 시크릿 생성을 지원하여, 사용 후에 자동으로 만료된다.
    • 중앙 집중화 관리: 모든 시크릿을 중앙에서 관리할 수 있어, 복잡한 환경에서의 시크릿 관리를 단순화한다.
  • 사용 시기:
    • API 키, 데이터베이스 자격증명, 인증서 등 민감한 데이터를 안전하게 관리해야 할 때
    • 보안이 중요한 마이크로서비스 아키텍처를 운영할 때
    • 애플리케이션에 대한 시크릿 관리를 중앙화하여 보안을 강화하고자 할 때

 

사용 방법 및 예시 코드:

  1. 의존성 추가: pom.xml 또는 build.gradle 파일에 Spring Cloud Vault의 의존성을 추가한다.
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>

 

  1. bootstrap.yml 설정: Spring Cloud Vault를 사용하기 위해 bootstrap.yml 파일에 Vault 서버의 주소와 접근 정보를 설정한다.
spring:
  cloud:
    vault:
      uri: http://localhost:8200
      authentication: TOKEN
      token: s.abcdef1234567890
  • 여기서 uri는 Vault 서버의 주소이고, authentication은 사용할 인증 방식을 지정한다. (TOKEN 방식을 예로 들었음.). token은 Vault 서버에 접근하기 위한 토큰임.

 

  1. 시크릿 사용: 애플리케이션 코드에서 Vault에 저장된 시크릿을 사용하는 방법은 Spring의 다른 프로퍼티와 유사하게 @Value 어노테이션을 사용할 수 있다.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    @Value("${my.secret}")
    private String mySecret;

    // 사용 예
    public void useSecret() {
        System.out.println("My secret is: " + mySecret);
    }
}

 

 

Q) Spring Cloud Vault 는 Config 처럼 Config Server 를 따로 만들어야하는거 아니야?

 

Spring Cloud Vault는 Spring Cloud Config와 다르게 별도의 Config 서버를 구성할 필요가 없음.

 

Vault는 자체적으로 HashiCorp Vault 서버를 사용하며, 이는 이미 데이터를 안전하게 저장하고 관리하는 강력한 기능을 제공함.

 

Spring Cloud Vault의 역할은 애플리케이션과 Vault 서버 사이의 연동을 단순화하고, Spring 환경에서 Vault에 저장된 시크릿을 쉽게 사용할 수 있게 돕는 것임.

 

Vault 서버를 설정하고 Spring 애플리케이션과 통합하는 방법에 대한 기본적인 예시:

  1. Vault 서버 설치 및 실행: Vault는 다양한 플랫폼에서 실행될 수 있으며, HashiCorp 공식 홈페이지에서 설치 지침을 찾을 수 있음. 로컬 환경에서 테스트 목적으로 Vault를 설치하고 실행하는 방법은 간단하다.
vault server -dev
  • 이 명령은 개발 모드로 Vault 서버를 시작하며, 터미널에 Root 토큰이 표시됨 (예: s.abcdef1234567890). 이 토큰은 클라이언트 애플리케이션에서 Vault에 접근할 때 사용된다.

 

  1. 시크릿 저장: Vault CLI를 사용하여 시크릿을 저장할 수 있다. 예를 들어, 애플리케이션에서 사용할 비밀번호를 저장해보자.
vault kv put secret/myapp mysecret="supersecret"

 

 

Spring Cloud Config 이용하기

여기서는 Spring Cloud Config 를 이용해서 중앙 설정 서버를 만드는 방법을 소개함.

 

Config Server 를 만들 때 고려사항은 가용성이 중요함. 즉 단일 장애점이 되지 않도록 하는거임.

 

1) Git 을 설정 정보 저장소로 이용

Github 에 레파지토리로 config-repo 를 만들고, 다음 설정 정보를 레파지토리에 추가해두자.

 

Spring Cloud Config Server 는 각 어플리케이션에 대한 설정 파일은 파일 이름을 가지고 찾는다. 그래서 이름 짓는게 중요함.

 

아래의 예시에는 catalog-service.yml 라고 기본적으로 짓는데 그러면 어플리케이션 이름이 catalog-service 여야한다.

 

이름은 다음 중 하나이면 됨

  • {application} 으로 폴더를 만들고 설정 정보를 넣는 방법 (e.g catalog-service/application.yml)
  • {application} 으로 설정 파일을 만드는 방법 (e.g catalog-service.yml)
  • application.yml 이라는 이름을 짓는 방법. 이 방법은 모든 어플리케이션에 적용되는 설정 파일일거임.
/{application}/application.-{profile}.yml
/{application}/application.yml
/{application}-{profile}.yml
/{application}.yml
/application-{profile}.yml 
/application.yml  

 

catalog-service.yml

polar:
  greeting: "Welcome to the catalog from the config server"

 

catalog-service-prod.yml

polar:
  greeting: "Welcome to the production catalog from the config server"

 

 

2) Spring Cloud Config Server 의존성 설정

다음은 Spring Cloud Config Server 를 만들기 위한 의존성을 추가하는 작업이다.

 

gradle 기준으로는 다음과 같을 것.

  • org.springframework.cloud:spring-cloud-config-server 의존성을 추가함.
  • Spring Cloud 프로젝트는 의존성 관리를 위해 서 BOM (Bill of Material) 에 의존한다. 그래서 gradle 파일을 보면 dependencyManagement 가 따로있다.
    • BOM은 특정 소프트웨어 프로젝트에서 사용되는 모든 라이브러리와 그 의존성들의 목록을 정의한 파일임. 이 파일은 의존성 버전을 중앙에서 관리하여 여러 모듈이나 프로젝트에서 일관된 의존성을 유지할 수 있도록 돕는다.
    • Spring Cloud는 여러 라이브러리의 호환성을 유지하기 위해서 이런식으로 사용한다.
plugins {
    id 'org.springframework.boot' version '2.7.18'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    id 'java'
}

group = 'com.polarbookshop'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

description = 'Provides functionality for centralizing the application configuration.'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2021.0.8")
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-config-server'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

tasks.named('test') {
    useJUnitPlatform()
}

 

 

3) 설정 서버 활성화

@EnableConfigServer 애노테이션을 추가해서 설정 서버를 활성화시켜야한다.

@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {

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

}

 

 

4) 설정 서버 설정

applicaiton.yml 에 필요할 설정을 추가해줘야한다.

  • 컨피스 서버 또한 내장 톰캣을 이용해서 부팅될 것이므로 관련 설정을 추가해줘야함.
  • 어디서 설정 정보를 조회할건지 명시해야하므로, spring.cloud.config.server.git.url 경로를 입력해줘야한다.
  • 그리고 spring.cloud.config.server.git.default-label: main 을 통해서 main 브런치의 값을 가져올 것을 명시했다.
  • 지금 컨피스 서버의 설정은 Git 레파지토리가 Public 이라는 가정하에 이뤄진다. 만약 Private 레파지토리라면 인증 정보를 추가해줘야함. 관련 설정은 레퍼런스를 참고.
  • spring.cloud.config.server.git.timeout 을 지정해서 원격 레파지토리가 연결이 되지 않을 경우에 너무 많이 대기하지 않도록 했다. 이는 컨피그 서버의 주요 요구사항인 가용성을 위해서 설정해야하는 특성임.
  • 다음으로 spring.cloud.config.server.git.clone-on-start: true 설정을 통해서 컨피그 서버가 시작될 때 설정 정보를 로컬에서 가지고와서 복사하도록 했음. 만약 원격 저장소와 연결할 수 없다면 초기에 실패하는 게 더 낫기 때문임. (fail-fast 원칙을 지키는 것) 또 로컬 복사본이 있다면 해당 정보를 가지고 설정 정보를 전달하면 되니까 내결함성도 올라가게 될거임.
  • 만약 로컬 캐시를 이용하고 싶지 않다면 spring.cloud.config.server.git.force-pull 값을 true 로 지정하는 것이 좋다. 이러면 매번 최신 설정 정보를 git 에서 가져와서 전달해줄거임.
server:
  port: 8888
  tomcat:
    connection-timeout: 2s
    keep-alive-timeout: 15s
    threads:
      max: 50
      min-spare: 5

spring:
  application:
    name: config-service
  cloud:
    config:
      server:
        git:
          uri: https://github.com/PolarBookshop/config-repo
          default-label: main
          timeout: 5
          clone-on-start: true
          force-pull: true

 

 

5) REST API 로 확인

위의 application.yml 설정 정보를 확인해서 REST API 를 요청하면 설정 정보를 볼 수 있다. 우리는 catalog-service 설정 파일을 이용했기 때문에 다음과 같이 호출하면 볼 수 있음.

{"name":"catalog-service","profiles":["prod"],"label":null,"version":"6209c48dd2558aa4864b36754582915aee5cf7c7","state":null,"propertySources":[{"name":"https://github.com/PolarBookshop/config-repo/catalog-service-prod.yml","source":{"polar.greeting":"Welcome to the production catalog from the config server"}},{"name":"https://github.com/PolarBookshop/config-repo/catalog-service.yml","source":{"polar.greeting":"Welcome to the catalog from a fresh config server"}}]}

 

 

6) Spring Cloud Config Client 구축

Config Server 를 구축했다면 이제 Config Client 를 이용해서 컨피그 서버에서 설정 정보를 가지고 와야한다.

 

먼저 Config Client 는 다음과 같은 의존성이 필요함.

dependencies {
    ...
    implementation 'org.springframework.cloud:spring-cloud-starter-config'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

 

 

다음으로 Config Server 정보를 applicaiton.yml 에 등록시켜줘야한다.

  • spring.config.import 속성에 "optional:configserver:" 이 있다는 것에 주목해라. 원래는 configserver: 만 있어야하는데, optional 을 붙혀서 Config Server 가 연결이 불가능한 경우에도 어플리케이션이 부팅될 수 있도록 했다. (로컬 환경에서는 이게 더 작업이 편하니까)
  • spring.cloud.config.uri: http://localhost:8888 설정을 통해서 컨피그 서버의 주소 정보를 등록시켰다.
  • spring.cloud.config.request-connect-timeout: 5000 # 5s 설정을 통해서 컨피그 서버와 연결 시도할 때 타임아웃 값을 지정했다. 항상 외부와 통신하는 서버는 내결함성을 위해서 이런 타임아웃이 중요하다.
  • spring.cloud.config.request-read-timeout: 5000 # 5s 설정을 통해서 설정 정보를 읽는 동안 대기하는 최대 시간을 밀리초 단위로 지정했다.
  • spring.cloud.config.fail-fast: false # In production, set to true 로 설정해서 Config 서버에 연결 실패 시 애플리케이션이 즉시 실패하도록 할지 여부를 결정한다. 개발 중에는 false로 설정하여 문제 발생 시에도 애플리케이션이 계속 작동하게 하고, 프로덕션 환경에서는 true 로 설정해서 설정 로드 실패 시 어플리케이션을 중단시키는게 중요하다.
  • spring.cloud.config.retry.max-attempts: 6 설정을 통해서 Config 서버에 대한 연결 시도를 최대 몇 번까지 재시도할지 설정할 수 있다.
  • spring.cloud.config.retry.initial-interval: 1000 # 1s 설정을 통해서 재시도 사이의 초기 간격을 밀리초 단위로 설정할 수 있다.
  • spring.cloud.config.retry.max-interval: 2000 # 2s 설정을 통해서 재시도 간격의 최대 값을 밀리초 단위로 설정할 수 있다.
  • spring.cloud.config.retry.multiplier: 1.1 설정을 통해서 재시도 간격을 증가시키는 배수를 설정할 수 있다.
    server:
    port: 9001
    tomcat:
      connection-timeout: 2s
      keep-alive-timeout: 15s
      threads:
        max: 50
        min-spare: 5
    
    spring:
      application:
        name: catalog-service
      config:
        import: "optional:configserver:"
      cloud:
        config:
          uri: http://localhost:8888
          request-connect-timeout: 5000 # 5s
    	  request-read-timeout: 5000 # 5s
          fail-fast: false # In production, set to true
          retry:
            max-attempts: 6
            initial-interval: 1000 # 1s
            max-interval: 2000 # 2s
            multiplier: 1.1

 

 

런타임시 설정 정보를 재부팅 없이 로드하는 방법

일반적인 Hot Reload 방법과 프로덕션에서 적용할 수 있는 방법 이렇게 두 가지 방법을 소개하겠다.

 

Hot Reload 방법:

    1. 최신 설정 정보 변경을 Git 레파지토리에 푸쉬한다.
    1. Catalog Service (Config Client 서버임) 에 /actuator/refresh 명령을 보낸다. (
    • Spring Boot 에서 Actuator 를 이용하고 있는 경우 /actuator/refresh 를 post 로 REST API 호출하면 빈을 자동으로 재로드한다.
    • @RefreshScope 로 표시된 빈들만 자동으로 재로드함. 이를 통하면 서버를 재시작하지 않고 변경사항을 적용할 수 있음.
    • 이는 새로고침 이벤트인 RefreshScopeRefreshedEvent 를 발생시킨다. 그러니까 @RefreshScope 빈들이 자동으로 새로고침 되었을 때 RefreshScopeRefreshedEvent 가 발생하고, 이 이벤트가 발생했음을 수신하는 이벤트 리스너를 설정할 수 있음.
    1. Catalog Service 는 Config Server 에게 최신 설정 정보를 달라는 요청을 한다.
    1. Config Server 는 자신의 git 레파지토리에서 설정 정보를 가지고 온다.
    1. Config Server 는 최신 설정 정보를 Catalog Service 에게 전달해준다.
    1. Catalog Service 는 최신 설정 정보로 갱신한다.

 

프로덕션에서 적용할 수 있는 방법:

    1. 최신 설정 정보 변경을 Git 레파지토리에 푸쉬한다.
    1. Git 에서 Webhook 을 통해 Config Server 에게 설정 정보가 변경되었음을 알려준다.
    1. Config Server 는 Spring Cloud Bus 나 메시지 브로커를 통해서 설정 정보가 변경되었음을 Config Client 에게 알려줄 수 있다.

+ Recent posts