HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🍗
[New] 조규현팀
/
🏗️
Tech Store
/
🪜
Spring Cloud Config로 프로퍼티를 외부 서버에서 관리하기 - 1
🪜

Spring Cloud Config로 프로퍼티를 외부 서버에서 관리하기 - 1

담당자들
카테고리
Skill
주제
프로젝트 설정 정보 관리
나의 블로그
https://velog.io/@pjh612/Spring-Cloud-Config%EB%A1%9C-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0%EB%A5%BC-%EC%99%B8%EB%B6%80-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0
완료율%
프로젝트
인스타뀨램
상태
완료
Spring Cloud Config로 프로퍼티를 외부 서버에서 관리하기
Spring Cloud Config는 분산 시스템에서 외부화된 구성에 대한 서버 측 및 클라이언트 측 지원을 제공합니다. Config Server를 사용하면 모든 환경에서 애플리케이션의 외부 속성을 관리할 수 있는 중앙 위치를 가집니다. Spring Cloud Config는 많은 방식들을 지원하는 것 같습니다. 저는 이번에는 GitHub와 함께 사용해볼건데요. 더 자세하고 다양한 방법들은 Docs를 확인하면 될 것 같습니다.
Spring Cloud Config로 프로퍼티를 외부 서버에서 관리하기
https://velog.io/@pjh612/Spring-Cloud-Config%EB%A1%9C-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0%EB%A5%BC-%EC%99%B8%EB%B6%80-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0
Spring Cloud Config로 프로퍼티를 외부 서버에서 관리하기
Spring Cloud Config준비SCC-SERVER 준비실행결론

Spring Cloud Config

Spring Cloud Config는 분산 시스템에서 외부화된 구성에 대한 서버 측 및 클라이언트 측 지원을 제공합니다. Config Server를 사용하면 모든 환경에서 애플리케이션의 외부 속성을 관리할 수 있는 중앙 위치를 가집니다.
Spring Cloud Config는 많은 방식들을 지원하는 것 같습니다. 저는 이번에는 GitHub와 함께 사용해볼건데요.
더 자세하고 다양한 방법들은 Docs를 확인하면 될 것 같습니다. Spring Cloud Config Docs

준비

  • Github Repository를 준비합니다. 저는 scc-test라고 이름지었습니다.
  • Spring Boot Application을 두 개 준비합니다. 애플리케이션 이름은 저는 scc-server, scc-client로 준비했습니다. scc-server는 Github와 직접 통신해 설정 정보들을 읽어들여 scc-client로 보내주는 역할을 합니다.
먼저 scc-server 부터 설정해보겠습니다.

SCC-SERVER 준비

  • build.gradle 의존성 추가
    • ext { set('springCloudVersion', "2021.0.3") } dependencies { implementation 'org.springframework.cloud:spring-cloud-config-server' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" }
}
- application.yml ```yml server: port: 8888 spring: cloud: config: server: git: uri: GitHub Repository 주소 search-paths: scc-client encrypt: enabled: false
그리고 Repository 루트 경로를 기준으로 yml에서 설정한 search-paths에 설정파일을 위치시킵니다.
설정 파일의 이름은 application이름-profile.yml로 지정하면 됩니다.
저는 Spring Cloud Config 클라이언트 애플리케이션 이름이 scc-client이고 개발환경에서는 dev 프로필을 사용하므로 scc-client-dev.yml로 설정하겠습니다.
notion image
  • scc-client-dev.yml 간단한 몇가지 프로퍼티들만 scc-client-dev.yml에 담겠습니다. DB 계정정보, JWT Secret Key를 담아볼게요.
    • db: username : root password : password jwt: client-secret: EENY5W0eegTf1naQB2eDeyCLl5kRS2b8xa5c4qLdS0hmVjtbvo8tOyhPMcAmtPuQ
이제 Server사이드 준비는 완료 되었습니다. 다음은 Client 사이드 준비를 해볼게요. ## SCC-Client 준비 - build.gradle 의존성 추가 ```java ext { set('springCloudVersion', "2021.0.3") } dependencies { implementation 'org.springframework.boot:spring-boot-starter- web' implementation 'org.springframework.cloud:spring-cloud-config- client' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud- dependencies:${springCloudVersion}" } }
  • application.yml
spring: application: name: ssc-client profiles: active: dev config: import: "configserver:<http://localhost:8888/>" cloud: config: name: scc-client profile: default management: endpoints: web: exposure: include: refresh
  • 프로필을 dev로 지정해줍니다.
  • import부분에는 Spring Cloud Config Server와 통신할 수 있는 도메인 주소를 입력해줍니다.
  • cloud.config.name에는 깃헙 레포 내의 ssc-client 폴더 내에 위치한 불러올 파일의 prefix를 입력합니다. (scc-client-dev.yml -> scc-client)
  • cloud.config.profile을 default로 지정해두면 spring.application.profile.active에서 지정한 profile인 dev로 찾게 됩니다.

실행

이제 GitHub와 잘 연동이 되었는지 scc-server 애플리케이션을 가동시키고 PostMan으로 확인해보겠습니다.
SpringCloud Config는 다음과 같은 형식의 리소스를 제공합니다.
notion image
notion image
label은 브랜치 명입니다, 현재는 main 브랜치에 리소스들을 위치해놨으니 다음과 같이도 불러올 수 있습니다.
notion image
yml로 저장해놨더라도 .properties 형식으로 자동으로 변환도 해줍니다.
notion image
Server 사이드에서 문제 없어 보이는 듯하니 Client에서는 평소와 똑같이 프로퍼티들을 클래스로 바인딩 해줍니다.
자세한건 아래 글을 참고합시다. Yaml의 Property를 Class로 바인딩 해보자
  • JwtProperties.java
@ConstructorBinding @ConfigurationProperties(prefix = "jwt") public record JwtProperties(String clientSecret, String issuer) { }
  • PropertiesConfig.java
@EnableConfigurationProperties(JwtProperties.class) @Configuration public class PropertiesConfig { }
  • HelloRestController.java
@RestController public class HelloRestController { private final JwtProperties jwtProperties; @Value("${jwt.client-secret}") private String secret; public HelloRestController(JwtProperties jwtProperties) { this.jwtProperties = jwtProperties; } @GetMapping("/hello") public String hello() { return jwtProperties.clientSecret(); } @GetMapping("/hello2") public String hello2() { return secret; } @GetMapping("/hello3") public JwtProperties hello3(){ return jwtProperties; } }
이제 Client도 가동 시켜 RestAPI 요청을 보내보겠습니다.
notion image
notion image
notion image
클라이언트 측의 yml파일에는 저러한 정보가 담겨있지 않지만 잘 불러와지는 것을 확인할 수 있었습니다.

결론

별도의 Config서버를 별도로 실행시켜야 하지만 분산 서버 환경에서 통일된 설정 파일을 관리하고 사용할 수 있고 공개 배포된 애플리케이션의 민감한 정보를 ConfigServer로 숨길 수 있다는 점에서 의미가 큰 듯 합니다.
하지만 여기서 끝이 아닙니다. 민감한 정보를 분리를 시켰지만 GitHub Repository에 적나라하게 드러난 민감 정보들은 어떻게 해야될까요?
GitHub에 AWS Key같은 것을 노출 시키면 어떻게 될까요?
저 또한 "누가 내 Repository를 보겠어~" 하며 안일하게 Key를 노출 시켰다가 호되게 당한적이 있습니다. 악의적인 사용자들은 크롤링을 통해 민감한 정보들을 수집하고 악용할 수 있습니다 그래서 더더욱 조심해야 합니다.
암호화가 필요하겠죠? Spring Cloud Config는 암호화도 지원해줍니다. 다음 포스팅에서는 더 안전하게 정보를 보관하는 법을 알아보겠습니다.