728x90

 

 

개요

MSA 프로젝트를 본격적으로 개발하기에 앞서, 많은 서비스가 있는 MSA 환경에서는 Config Server를 사용하는 것이 필요합니다. 그 중에서도 Spring Cloud Config를 사용하기로 결정하였습니다.

 

그러나 실제 Git 설정 파일 저장소를 활용한 경험이 없기 때문에, 이를 연습하기 위해 테스트를 진행하였습니다. 본 글에서는 Spring Cloud Config 서버에 대한 테스트 과정을 정리하고자 합니다.

 

 

Spring Cloud Config란❓

Spring Cloud Config는 분산 시스템에서 애플리케이션의 설정 정보를 중앙에서 관리하고 제공하는 데 사용되는 Spring Cloud 프로젝트입니다.

 

  • Spring Cloud Config Server(설정 서버)
    • 버전 관리 레포지토리로 백업된 중앙 집중식 구성 노출을 지원
  • Spring Cloud Config Client(설정 클라이언트)
    • 애플리케이션이 설정 서버에 연결하도록 지원

 

Spring Cloud Config에 대한 자세한 내용은 아래의 포스팅에서 확인가능합니다.

 

 

[Spring Cloud] Spring Cloud Config의 중앙 집중식 설정 관리와 실시간 구성 변경 방법 (@RefreshScope, 수동

마이크로서비스 아키텍처(MSA)를 채택한 애플리케이션에서는 여러 개의 독립적인 서비스가 서로 협력하여 전체 시스템을 구성합니다. 각 서비스는 자체적인 설정 파일 application.yml을 사용하여

pixx.tistory.com

 

 

Spring Cloud Config 구축하기 - 서버

다양한 서비스들이 있지만 테스트인만큼 2개의 서비스 (hub, product)로 테스트를 해보았습니다. 그리고 local, dev로 두개의 profile으로 구성했습니다.

 

다음 단계로 Config 서버가 정상적으로 실행되는지 확인하겠습니다.

  1. 설정 파일 저장소 구축
  2. 설정 서버 구축
  3. 설정 서버 실행 및 확인

1. 설정 파일 저장소 구축

설정 파일들을 저장할 Git 레포지토리를 먼저 만들어야 합니다. 디렉토리 구조는 환경에 맞는 파일로 지정하며, 파일 이름 규칙이 중요합니다.

  • 파일 이름 규칙: {name}-{profile}.yml

 

product-local.yml

com:
  zinu:
    profile: local
    region: product

 

product-dev.yml

com:
  zinu:
    profile: dev
    region: product

 

hub-local.yml

com:
  zinu:
    profile: local
    region: hub

 

hub-dev.yml

com:
  zinu:
    profile: dev
    region: hub

 

 

위와 같이 설정 파일들을 설정 파일 저장소에 구축합니다. 실제 저장소는 아래의 깃허브에서 확인 가능합니다.

 

GitHub - ParkJinWu/spring-cloud-config-test

Contribute to ParkJinWu/spring-cloud-config-test development by creating an account on GitHub.

github.com

 

2. 설정 서버 구축

설정 서버 구성을 위해서는 다음과 같은 의존성을 추가해야 합니다.

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

 

그리고 설정 서버에서 application.yml에 다음과 같은 설정을 추가해줘야 합니다.

server:
  port: 8888  # Config Server가 동작할 포트

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/~~~  # GitHub 레포지토리 URL
          clone-on-start: true  # 서버 시작 시 Git 저장소를 클론
          default-label: main    # GitHub의 브랜치 이름

 

 

  • port: Config 서버는 기본적으로 8888번 포트를 사용하므로 8888로 설정했습니다.
  • uri: 설정 파일이 있는 Git 주소를 입력합니다.
  • default-label: Git 주소의 브랜치 이름을 지정합니다.
  • search-paths: 설정 파일들을 찾을 경로를 지정합니다.

 

 

3. @EnableConfigServer

@SpringBootApplication
@EnableConfigServer
public class DemoApplication {

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

 

마지막으로 위와 같이 메인 클래스에 @EnableConfigServer를 붙여주면 설정 서버 구성이 끝나게 됩니다.

 

설정 서버 실행 및 확인

서버를 실행하면 설정 파일 저장소를 클론하고 설정 정보를 읽어오는데, spring cloud config server가 갖는 endpoint는 다음과 같습니다.

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

 

따라서 http://localhost:8888/{name}/{profile}로 접근하면 Config Server가 정상적으로 동작하는 것을 확인할 수 있습니다.

 

실제 설정 정보를 Git에 올릴 때는 레포지토리를 private으로 설정하는 것이 좋습니다. private으로 설정하면 추가로 SSL 설정이 필요할 수 있습니다.

 

위와 같이 정상적으로 설정 서버의 정보를 가져오는 것을 확인할 수 있습니다.

 

 

또한 로그를 보면 Spring Cloud Config 서버가 로컬 파일 시스템에서 파일을 정상적으로 읽어서 애플리케이션의 환경 설정으로 추가하는 과정에서 출력되는 로그를 확인할 수 있습니다.

 

 

위와 같이 Spring Cloud Config 서버Git 레포지토리에서 요청된 설정 파일을 찾지 못하면, propertySources가 빈 값으로 반환됩니다.

 

이는 Config 서버가 해당 애플리케이션(name)프로파일(profiles)에 맞는 설정 파일찾지 못했음을 의미합니다.

 

예를 들어, 요청된 user-dev.yml 파일이 Git 레포지토리에 없거나 잘못된 브랜치나 커밋을 참조한 경우, Config 서버는 propertySources에 아무런 값을 넣지 않고 빈 값으로 응답하게 됩니다.

 

 

 

Spring Cloud Config 구축하기 - 클라이언트

다음 단계로 Config 클라이언트가 정상적으로 실행되는지 확인하겠습니다.

  1. 클라이언트 서버 구축
  2. 설정 파일을 읽기 위한 코드 추가
  3. 클라이언트 실행 및 확인

1. 클라이언트 서버 구축

먼저 Spring Cloud Config Client 실행을 위해서는 다음과 같은 의존성이 필요합니다.

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

 

2. 설정 파일을 읽기 위한 코드 추가

yaml 파일로부터 읽어올 설정 정보들을 작성해야합니다.

@Setter
@Getter
@RefreshScope
@Component
@ConfigurationProperties("com.zinu")
@ToString
public class MyConfig {
    private String profile;
    private String region;
}

 

@ConfigurationProperties어노테이션은 Spring에서 애플리케이션 설정 파일(application.yml 또는 application.properties)에 정의된 설정 값을 자바 객체로 매핑할 때 사용하는 어노테이션입니다.

 

주로 설정 값을 캡슐화하고, 재사용성과 유지보수성을 높이기 위해 사용됩니다.

 

@ConfigurationProperties("com.zinu")는 application.yml 또는 application.properties 파일에서 com.zinu시작하는 설정 값들을 해당 자바 클래스의 필드에 매핑하겠다는 의미입니다.

 

또한 @RefreshScope는 Spring Cloud에서 제공하는 어노테이션으로, 설정 값이 변경되었을 때 해당 빈을 동적으로 갱신할 수 있게 해줍니다.

 

이를 통해 Spring Cloud Config 서버를 통해 설정 값이 변경되면 애플리케이션을 재시작하지 않고도 실시간으로 반영할 수 있습니다.


그리고 Clientyml파일에는 설정 서버의 정보애플리케이션 정보를 다음과 같이 입력하여 가져오고 싶은 정보를 가져오면 됩니다.

spring:
  application:
    name: hub  # 애플리케이션의 이름 (예: hub 또는 product)
  profiles:
    active: local  # 현재 활성화된 프로파일 (예: local, dev, prod 등)
  config:
    import: optional:configserver:http://localhost:8888  # Config Server의 URL

 

그리고 설정값이 제대로 불러와졌는지 확인하기 위한 컨트롤러를 추가합니다.

import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class ConfigController {

    private final MyConfig myConfig;

    @GetMapping("/config")
    public ResponseEntity<String> config() {
        System.out.println(myConfig);
        return ResponseEntity.ok(myConfig.toString());
    }

}

 

클라이언트 실행 및 확인

 

위와 같이 정상적으로 컨피그 서버설정 파일 레포지토리에서 적절한 설정 파일을 성공적으로 읽어와 클라이언트에 전달했음을 확인할 수 있습니다.

 

구체적인 동작과정은 다음과 같습니다.

 

  • 클라이언트가 http://localhost:8080/config URL로 요청을 보냅니다. 이 요청은 Spring Cloud Config 서버에 저장된 설정 정보를 요청하는 것입니다.
  • Config 서버는 클라이언트의 요청에 따라 애플리케이션 이름(hub)과 프로파일(local)해당하는 설정 파일레포지토리에서 찾습니다.
  • 설정 파일(hub-local.yml)에는 profile=local, region=hub와 같은 설정 값이 포함되어 있습니다. 이 값들은 설정 파일의 구조에 따라 애플리케이션의 동작을 조정하는 데 사용됩니다.
  • Config 서버는 읽어온 설정 값을 클라이언트에 반환합니다.

 

만약 설정 파일 레포지토리없는 정보를 요청한 경우 위와 같이 Config 서버해당 설정 값을 찾을 수 없기 때문에 null 또는 빈 값이 반환되는 것을 확인할 수 있습니다.

 

profile이란❓

프로파일(profile)은 Spring 애플리케이션의 실행 환경이나 설정을 구분하는 개념입니다.

 

각 프로파일은 애플리케이션이 실행되는 특정 환경(예: 개발, 테스트, 운영)에 맞는 설정을 제공합니다. 프로파일을 사용하면 하나의 애플리케이션에서 다양한 환경에 적합한 설정을 손쉽게 관리할 수 있습니다.

 

 

참고

 

[Spring] Spring Cloud Config 도입하기 및 private 레포지토리 SSL로 연결 설정 및 privateKey 암호화

이번에는 Spring Cloud Config에 대해 간단히 알아보고, 설정해보도록 하겠습니다. 1. Spring Cloud Config란? [ Spring Cloud Config란? ] Spring Cloud Config는 분산 시스템에서 외부화된 설정 정보를 서버 및 클라이

mangkyu.tistory.com