이번 포스팅에서는 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 |