1. Spring Cloud Config란 무엇일까?
분산 시스템을 사용할 때 각각의 Microservice에서 사용될 정보들이 있을 것이다. 이것을 매번 확인하러 들어가는 건 번거로운 작업일 것이다.
이때, Spring Cloud Config를 사용하는걸 고려해 볼 수 있다.
Spring Cloud Config란 분산 시스템에서 각각의 설정 정보들을 제공해 주는 시스템이다.
즉, 각각의 Microservice에 설정 정보들을 사진 속 Spring Cloud Config Server에서 관리하는 것이다!
이제부터
Spring Cloud Config Server ⇒ Spring Cloud Config
Spring Boot Microservice ⇒ Spring Cloud Config Client라고 부를 것이다.
2. Spring Cloud Config 적용하기
설정을 하기 위해서 의존성을 부여해 주자.
implementation 'org.springframework.cloud:spring-cloud-config-server'
그런 다음, 설정 파일(application.yml)에서 아래 내용을 추가해 주자.
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/Mun9-chi/mungchi-config-repository
uri는 실제 각각의 설정 정보들을 모아 놓은 깃허브 레포의 주소이다.
그 후, 메인 클래스에 다음과 같이 @EnableConfigServer 어노테이션을 붙여주자.
@EnableConfigServer는 이 서버를 설정파일을 모아 놓는 ConfigServer로 사용하겠다는 뜻이다.
@SpringBootApplication
@EnableConfigServer
class ConfigApplication
fun main(args: Array<String>) {
runApplication<ConfigApplication>(*args)
}
제가 구성한 레포 설정파일들은 다음과 같다.
config-aws.yml
seonjun:
profile: aws
comment: hello! aws
config-dev.yml
seonjun:
profile: dev
comment: hello! dev
여기서, Spring Cloud Config Server가 갖는 endpoint는 다음과 같다.
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
즉, 저의 endpoint는
- /config/aws
- /config/dev
이제 서버를 실행해 보자.
아까 저장해 놓은 정보들이 보인다.
3. Spring Cloud Config Client
클라이언트 서버에는 다음과 같은 의존성, ext, dependencyManagement를 부여해줘야 한다.
implementation 'org.springframework.cloud:spring-cloud-starter-config'
ext {
set('springCloudVersion', "2023.0.0")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
2번에서 설정한 config 정보들을 yml에 작성한다.
server:
port: 9001
application:
name: config
profiles:
active: aws
config:
import: optional:configserver:http://localhost:8888
management:
endpoints:
web:
exposure:
include: "*"
- Spring Boot 2.4 버전 이후로 설정이 변경되었다.
2.4 버전 이전에는 Application이 구동될 때 application.yml보다 먼저 로드되는 bootstrap.yml에 설정을 했었는데, 2.4 버전 이후로 그냥 application.yml에 설정하는 것으로 바뀌었다.
이제 yml파일에서 읽어올 설정 정보들을 가지고 LocalConfig 클래스를 만들어보자.
@RefreshScope
@Component
class LocalConfig(
@Value("\\${seonjun.profile}")
private val username: String,
@Value("\\${seonjun.comment}")
private val password: String
) {
override fun toString(): String {
return "LocalConfig{" +
"username='" + username + '\\'' +
", password='" + password + '\\'' +
'}'
}
}
- 여기서 @RefreshScope는 설정 정보가 바뀌면 다시 불러올 수 있도록 도와주는데, Git 주소에 있는 설정 파일을 수정했을 시 /actuator/refresh 엔드포인트를 호출하면 변경된 설정 값이 반영된다.
- 그리고 클라이언트의 yaml에는 설정 서버의 정보와 애플리케이션 정보를 다음과 같이 입력해 주면 된다. 만약 config server와 통신에 실패했을 때 에러를 던지고, 서버 실행을 멈추고 싶다면 "optional:" 부분을 제거해 주면 된다.
이제 확인을 위한 컨트롤러를 구현해 보자.
@RestController
class ConfigController(
private val localConfig: LocalConfig
) {
@GetMapping("/local")
fun loadLocalConfig(): String {
return localConfig.toString()
}
}
구현은 완료되었고 Postman으로 확인해 보자.
이때, 실행을 시킨 후
이런 화면이 뜨는 걸 볼수 있다. (이때, 꼭 Config Server가 작동중이어야 한다!)
잘 뜨는걸 볼 수 있다!
'WEB' 카테고리의 다른 글
Redis Lock 동시성 해결하기 (0) | 2024.05.01 |
---|---|
인터셉터와 리졸버 (0) | 2024.04.12 |
JWT 활용기 (0) | 2024.04.12 |
Oauth를 사용해 카카오 로그인 구현 (0) | 2024.04.12 |
리사이징 적용기 with Marvin (0) | 2024.03.14 |
OAuth 2.0 동작 방식 (0) | 2023.06.05 |
JPA란 무엇일까? (0) | 2023.06.01 |
웹 서버와 웹 애플리케이션 서버 (0) | 2023.04.01 |