Spring Cloud Config Server로 서비스 설정 중앙에서 관리하기

Lord·2024년 11월 14일

Knowledge

목록 보기
1/4
post-thumbnail

최근 많은 기업이 채택하고 있고, 많은 서비스에서 효율적인 아키텍처 중 하나인 클라우드 네이티브 애플리케이션의 아키텍처를 공부하던 중, 여러 서비스에서 공통적으로 사용되는 설정들을 어떻게 효율적으로 관리할 수 있을지에 대해 고민하게 되었다. 이를 해결하기 위한 방법으로 Spring Cloud Config Server를 사용해 설정을 중앙에서 관리하는 방식을 알게되었다. 실제 내 프로젝트에 적용해보았고 이를 글로 남기는 것이 좋을 것 같아 포스팅을 해보려고 한다. 이 방식은 특히 설정의 일관성을 유지하면서도 서비스 확장성을 보장할 수 있다는 점에서 굉장히 매력적이라고 생각한다.

이번 글에서는 Config Repo 설정 방법과 Config Server 설정 방법을 순서대로 소개하고, Config Server를 사용하는 이유와 설정 변경 시 새로운 설정을 빠르게 적용하는 방법에 대해 알아본다. 또한 이 과정을 통해 마이크로서비스 간의 일관된 설정 관리와 안정성을 높이는 방법에 대해 다룬다.

Config Repo 설정 방법

Config Server는 중앙에서 설정을 관리하기 위해 설정 파일들을 저장할 저장소가 필요하다. 이 저장소를 Config Repo라고 부른다. 일반적으로 Git 저장소를 사용하여 설정 파일을 관리하며, 이를 통해 설정의 변경 내역을 쉽게 추적하고 버전 관리를 할 수 있다. Git을 이용하면 설정 파일의 변경 기록을 명확히 관리할 수 있으며, 이로 인해 언제든지 이전 버전으로 롤백할 수 있다는 점이 큰 장점이다.

Config Repo 설정을 위해서는 다음과 같은 단계가 필요하다.

  1. Git 저장소 생성
    설정 파일들을 관리할 Git 저장소를 생성한다. 이 저장소에는 각 애플리케이션의 설정 파일들이 포함되며, 환경별로 설정 파일을 구분하여 관리할 수 있다. 예를 들어, application-dev.yml, application-prod.yml과 같이 파일을 구분한다. 환경별 설정을 명확히 구분해 놓음으로써, 특정 환경에서만 발생하는 오류를 신속하게 파악하고 수정할 수 있다.

  2. 설정 파일 추가
    각 애플리케이션에 필요한 설정 파일들을 Git 저장소에 추가하고 커밋한다. 이러한 파일에는 데이터베이스 연결 정보, API 키, 환경 변수 등이 포함될 수 있다. 민감한 정보 같은 경우에는 직접적으로 보여주면 보안성이 매우 낮기 때문에 Vault와 같은 보안 도구를 사용하는 것이 좋다. Vault는 비밀번호, API 키와 같은 민감한 정보를 안전하게 관리할 수 있도록 도와준다. 이러한 보안 관리 방식은 설정의 노출을 방지하고, 데이터의 기밀성을 보장하는 데 매우 유용하다. 이에 대한 자세한 내용은 다른 포스팅에서 다룰 예정이다.

Spring Cloud Config Server 설정 방법

  1. Config Server 의존성 추가
    먼저 Spring Boot 프로젝트에 Spring Cloud Config Server 의존성을 추가해야 한다. build.gradle 파일에 아래의 의존성을 추가한다. 이를 통해 Config Server가 필요한 모든 라이브러리를 프로젝트에 포함할 수 있게 된다.

    // Gradle
    implementation 'org.springframework.cloud:spring-cloud-config-server'
  2. Config Server 애플리케이션 설정
    의존성을 추가한 후, @EnableConfigServer 애너테이션을 사용해 Config Server 역할을 수행할 수 있도록 설정한다. 이 애너테이션을 사용한 Config Server의 설정은 아래와 같다.

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

    이 설정을 통해 Spring Boot 애플리케이션이 Config Server 역할을 수행하게 되며, 각 마이크로서비스에서 필요한 설정을 중앙에서 제공할 수 있게 된다.

  3. 설정 저장소 지정
    Config Server가 참조할 설정 저장소를 application.yml 파일을 통해 지정해야 한다. 예를 들어, Git 저장소를 설정 저장소로 사용하고자 한다면 아래와 같이 설정한다.

    server:
      port: 8888
    
    spring:
      cloud:
        config:
          server:
            git:
              uri: https://github.com/your-repo/config-repo
              searchPaths: '{application}'

    여기서 uri는 설정을 저장해둔 Git 저장소의 URL이며, searchPaths는 각 애플리케이션별로 설정 파일을 찾기 위한 경로를 지정하는 데 사용된다. 이를 통해 Config Server는 각 애플리케이션이 필요로 하는 설정을 정확히 찾아서 제공할 수 있다.

Config Server를 사용하는 이유

Spring Cloud Config Server를 사용하면 다음과 같은 이점이 있다.

  • 중앙 집중형 관리: 여러 서비스의 설정 파일을 중앙에서 관리할 수 있으므로 일관성을 유지할 수 있다. 이로 인해 각 서비스마다 개별적으로 설정을 관리하는 복잡성을 줄이고, 설정 변경 시 중앙에서 한 번에 적용할 수 있다. 이러한 방식은 마이크로서비스 환경에서 유지보수를 보다 효율적으로 할 수 있도록 도와준다.
  • 환경별 설정 분리: 개발, 테스트, 운영 환경별로 설정을 분리하여 관리할 수 있어 환경에 따라 쉽게 설정을 변경할 수 있다. 이러한 환경 분리는 서비스의 안정성과 신뢰성을 높이는 데 도움이 된다. 예를 들어, 개발 환경에서는 디버깅용 설정을, 운영 환경에서는 최적화된 설정을 사용할 수 있도록 지원한다.
  • 버전 관리: Git과 같은 버전 관리 시스템을 사용하여 설정 파일의 변경 내역을 관리할 수 있다. 이를 통해 설정 오류가 발생했을 때 과거 버전으로 쉽게 롤백할 수 있다. 또한 설정 변경 사항을 추적할 수 있어 문제가 발생했을 때 빠르게 원인을 파악할 수 있다. 이와 같은 버전 관리는 대규모 시스템에서 신뢰성을 유지하는 데 매우 중요하다.
  • 확장성: Spring Cloud Config Server는 새로운 마이크로서비스가 추가될 때에도 설정을 중앙에서 쉽게 추가할 수 있다. 서비스가 많아질수록 설정 관리의 중요성이 커지며, 이를 통해 설정의 일관성을 보장할 수 있다.

새로운 설정을 빠르게 적용하는 방법

Config Repo에서 설정이 변경되었을 때, 클라이언트 애플리케이션들이 새로운 설정을 빠르게 적용하도록 하는 방법은 다음과 같다.

  1. Spring Cloud Bus 사용
    Spring Cloud Bus는 Kafka나 RabbitMQ와 같은 메시지 브로커를 사용하여 설정 변경 사항을 클라이언트 애플리케이션에 알릴 수 있다. 이를 통해 Config Server에서 설정이 변경되면, 해당 변경 사항이 메시지 브로커를 통해 각 서비스에 전달되고, 각 서비스는 새로운 설정을 즉시 반영할 수 있게 된다. 이 방법은 대규모 분산 환경에서 설정 변경을 자동으로 전파할 수 있어 매우 유용하다.

  2. Actuator의 /refresh 엔드포인트 사용
    Spring Boot Actuator를 사용하여 클라이언트 애플리케이션에서 설정을 수동으로 갱신할 수 있다. 클라이언트 애플리케이션에 Actuator 의존성을 추가하고 /actuator/refresh 엔드포인트를 호출하면 Config Server로부터 최신 설정을 가져와 적용할 수 있다. 이 방법은 특정 애플리케이션만 설정을 갱신하고 싶을 때 유용하다. 예를 들어 운영 중 특정 서비스의 설정만 긴급히 변경해야 할 때 사용할 수 있다.

결론

Spring Cloud Config Server를 사용하면 마이크로서비스 환경에서 발생할 수 있는 설정 관리의 복잡성을 크게 줄일 수 있다. 특히 여러 서비스 간의 설정을 통일성 있게 관리하고, 환경별 설정을 효과적으로 분리하여 효율성을 높일 수 있다. 이를 통해 더욱 안정적이고 일관된 서비스를 제공할 수 있게 된다. 또한 Spring Cloud Bus나 Actuator를 통해 설정 변경 사항을 빠르게 반영할 수 있어 운영 중인 서비스에 새로운 설정을 신속하게 적용할 수 있다.

추가로, 설정 파일에 민감한 정보가 포함될 경우, Vault와 같은 보안 도구와의 통합을 통해 이러한 정보를 안전하게 보호할 수 있다. 이는 서비스의 신뢰성을 더욱 높이는 중요한 요소이다. 다음 글에서는 Config Server와 Vault를 통합해 민감한 정보를 안전하게 관리하는 방법에 대해 다룰 예정이다. 이를 통해 마이크로서비스 환경에서 발생할 수 있는 보안 문제를 보다 효율적으로 해결할 수 있을 것이다.

profile
다재다능한 Backend 개발자에 도전하는 개발자

0개의 댓글