개요
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 Config 구축하기 - 서버
다양한 서비스들이 있지만 테스트인만큼 2개의 서비스 (hub, product)로 테스트를 해보았습니다. 그리고 local, dev로 두개의 profile으로 구성했습니다.
다음 단계로 Config 서버가 정상적으로 실행되는지 확인하겠습니다.
- 설정 파일 저장소 구축
- 설정 서버 구축
- 설정 서버 실행 및 확인
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
위와 같이 설정 파일들을 설정 파일 저장소에 구축합니다. 실제 저장소는 아래의 깃허브에서 확인 가능합니다.
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. 클라이언트 서버 구축
먼저 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 서버를 통해 설정 값이 변경되면 애플리케이션을 재시작하지 않고도 실시간으로 반영할 수 있습니다.
그리고 Client의 yml파일에는 설정 서버의 정보와 애플리케이션 정보를 다음과 같이 입력하여 가져오고 싶은 정보를 가져오면 됩니다.
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 애플리케이션의 실행 환경이나 설정을 구분하는 개념입니다.
각 프로파일은 애플리케이션이 실행되는 특정 환경(예: 개발, 테스트, 운영)에 맞는 설정을 제공합니다. 프로파일을 사용하면 하나의 애플리케이션에서 다양한 환경에 적합한 설정을 손쉽게 관리할 수 있습니다.
참고
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.09.09 - IntelliJ에서 파일 탭이 빨간색으로 표시되는 이유와 해결 방법 (0) | 2024.09.09 |
---|---|
[TIL, 일일 회고] 2024.09.08 - 인적 오류로 인한 .idea 폴더 커밋 문제 해결: .gitignore 설정의 중요성 (0) | 2024.09.08 |
[TIL, 일일 회고] 2024.09.06 - 순환 참조 해결하기 (0) | 2024.09.06 |
[TIL, 일일 회고] 2024.09.05 - 위도와 경도의 데이터 타입과 길이 (0) | 2024.09.05 |
[TIL, 일일 회고] 2024.09.04 - Spring 심화 AI 비즈니스 검증 프로젝트 트러블 슈팅 (0) | 2024.09.04 |