Spring Framework/Spring Cloud Config

Spring Cloud Config 튜토리얼

Junuuu 2024. 1. 31. 00:01
728x90

개요

"Spring Cloud Config란?" 글에 이어서 Spring Cloud Config 튜토리얼을 통하여 직접 Spring Cloud Config를 제공하는 Server와 Client를 구축하고 설정을 받아보고자 합니다.

 

모든 코드는 github에서 확인할 수 있습니다.

 

Spring Cloud Config Server 구성하기

dependencies {	
	implementation(enforcedPlatform("org.springframework.cloud:spring-cloud-dependencies:2022.0.4"))
	implementation("org.springframework.cloud:spring-cloud-config-server")
}

spring-cloud-server 의존성을 추가합니다.

 

@SpringBootApplication
@EnableConfigServer
class SpringCloudConfigServerApplication

fun main(args: Array<String>) {
	runApplication<SpringCloudConfigServerApplication>(*args)
}

 

@EnableConfigServer 어노테이션을 선언합니다.

 

server:
  port: 8088
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/Junuu/spring-study

application.yml에 github 주소를 입력합니다.

만약 Git Repository가 private라면 추가적으로 ssh 발급에 대한 설정과 구성이 추가됩니다.

 

 

Git Repository에 설정파일들 구성하기

application.yml에 명시한 Git Repository의 최상단에 파일 이름을 {애플리케이션 이름}-{환경}.yml 형태로 구성합니다.

testapplication-local, testapplication-dev 라는 파일명을 통하여 각각 설정정보를 넣어주어 보았습니다.

 

Git Repository의 최상단에 파일들이 올라간 모습을 확인할 수 있습니다.

 

 

Spring Cloud Config Server 호출해 보기

Spring Cloud Config Server 호출해보기

Spring Application을 실행하고 postman을 활용하여 GET localhost:{port}/{application-name}/{profile} 를 활용하여 요청을 보내보았습니다.

정상적으로 설정한 config를 확인할 수 있습니다.

 

Spring Cloud Server는 설정을 제공하기 위해서 다양한 endpoint들을 제공합니다.

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

application은 application의 이름, profile은 환경을 뜻합니다.

여기서의 label은 git 저장소의 branch를 뜻하며 기본적으로 master입니다.

 

Spring Cloud Config Client 구성하기

dependencies {
	implementation(enforcedPlatform("org.springframework.cloud:spring-cloud-dependencies:2022.0.4"))
	implementation("org.springframework.cloud:spring-cloud-config-client")
	implementation("org.springframework.boot:spring-boot-starter-actuator")
}

spring-cloud-client 의존성을 추가합니다.

actuator 의존성을 추가합니다 

actuator는 추후에 config 설정을 갱신할 때 사용됩니다.

 

spring:
  application:
    name: testapplication      # 어플리케이션 이름 = Github 레포지토리에서 관리하는 파일 애플리케이션 이름
  profiles:
    active: local     # 애플리케이션 환경 = local, dev
  config:
    import: optional:configserver:http://localhost:8088 # import:optional:configserver사용 -> Spring cloud config server 주소
server:
  port: 9001     # Spring Cloud Config Client 주소

# 클라이언트 코드에서 Actuator 설정
management:
  endpoints:
    web:
      exposure:
        include: "*"

application.yml에 config 설정을 조회할 주소, 활성화할 profile, application 이름을 적어줍니다.

 

@RefreshScope // 설정 변경된 내용을 actuator를 통해 변경값을 갱신
@Component
class LocalConfig {
    @Value("\${test.secret}")
    val secret: String? = null

    @Value("\${test.name}")
    val name: String? = null
}

config 변수를 담고 있는 Spring Bean을 하나 만든 후 @RefreshScope 어노테이션으로 설정이 변경될 경우 actuator를 통해 변경된 설정값을 갱신할 수 있습니다.

 

@RestController
class ConfigController(
        private val localConfig: LocalConfig
) {
    @GetMapping("/config")
    fun loadLocalConfig(): ResponseEntity<Unit> {
        logger.info { localConfig.secret }
        logger.info { localConfig.name }
        return ResponseEntity.ok().build()
    }
}

localConfig를 확인해 볼 수 있도록 endpoint를 하나 구성하였습니다.

 

내가 구성한 설정을 확인 가능

해당 경로로 호출해 보면 Git Repository에서 설정했던 값을 확인해 볼 수 있습니다.

 

 

Application 기동 중 중간에 Git Repository의 설정 바꾸기

Git Repository에 password-local-change, junwoo-local-change로 설정을 변경하여 push 하였습니다.

Application은 초기 설정을 받아와서 기동 중인 상태입니다.

이제 자동으로 설정이 반영될까요?

 

설정 값을 확인하기 위해 호출했던 /config endpoint로 호출해 보면 값이 바뀌지 않았습니다.

 

새로운 git 정보를 가져온다.

POST http://localhost:9001/actuator/refresh endpoint를 호출하고 다시 /config endpoint를 호출하면 새로운 git 정보를 가져오고 그 정보를 기반으로 설정이 바뀐 것을 확인할 수 있습니다.

 

 

 

참고자료

https://madplay.github.io/post/introduction-to-spring-cloud-config

https://velog.io/@zayson/%EB%82%98-%ED%98%BC%EC%9E%90-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-Spring-Cloud-Config-Server-Client-%EC%84%A4%EC%A0%95