서론
MSA(Microservice Architecture)의 기본적인 구현에 대해 공부하던 중, 다양한 응용 프로그램의 설정을 관리하는 프레임워크, Spring Cloud Config에 대해서 알게 되었다. 생소한 프레임워크이기도 하여, 이번 기회에 간단하게 정리해보고자 한다!
Spring Cloud Config를 왜 써야할까?
나는 지금껏 단 하나의 어플리케이션을 이용한 서비스만 구현해 보았고, 그런 서비스에서는 어플리케이션의 설정을 관리하는 기능이나 시스템이 전혀 필요 없었다. 어차피 하나의 어플리케이션이니, 그 어플리케이션의 설정 파일만 건드리면 됐기 때문이다. 하지만 MSA같이 잘게 쪼개어진 여러 어플리케이션으로 이루어진 서비스를 운용해야 할 때, 그런 기능이 없다면 어떻게 될까? 각 어플리케이션의 설정이 바뀔 때마다, 그 어플리케이션의 설정 파일을 수정해야할 것이다. 만일 여러 어플리케이션이 완전히 똑같은 설정을 사용하는데, 그 설정을 바꿔야한다면? 그 모든 어플리케이션의 설정 파일을 똑같이 수정하는 작업을 해야한다. 그렇게 하다보면 미처 설정을 바꾸지 못한 어플리케이션이 나타나거나, 잘못 고치는 등, human error가 잔뜩 발생할 가능성이 높고, 무엇보다도... 번거롭다.
때문에, 만일 여러 어플리케이션으로 이루어진 서비스를 운용해야 한다면, 어플리케이션별 설정을 한 곳에 모아두고, 같은 설정을 사용하는 어플리케이션의 설정파일은 하나로 통합하는 등, 한 곳에서 집중 관리하는 것이 합리적이다. 이것을 구현한 프레임워크가 바로 Spring Cloud Config라고 할 수 있겠다.
Config Client와 Config Server
Spring Cloud Config는 Client, Server가 존재한다. 간단하게 정리하자면 다음과 같다.
- Config Client : 여러 설정 파일을 관리하는 Config Server에서 설정 파일 값을 가져오는 쪽. 즉, 설정 파일을 기반으로 작동하는 어플리케이션이다.
- Config Server : 설정된 git repository를 기반으로 요청에 따라 설정 파일의 값을 보내주는 쪽. 설정 파일과 Client를 연결해주는 역할을 한다.
쉽게 생각해서, 설정 파일의 값을 읽는 쪽이 Client, 그걸 제공해주는 쪽이 Server라고 생각해도 무방한 것 같다.
실습해보기
백문이 불여일견이다, 직접 Config Client와 Config Server를 구축해보면서, 어떤 느낌으로 프로그램을 만들어야하는지를 살펴보자.
Config Server 만들기
Config Server는 설정 파일을 관리하는 입장에 있는 어플리케이션이다. Config Server에 예시 설정 파일이 담긴 git repository를 연결하여 작동시켜보자.
우선 필요한 의존성을 받기 위해, dependencies에 Config Server를 추가하자. 개발의 편의를 위해 개인적으로는 Spring devTools도 추가했다. gradle의 build.gradle 파일 (Groovy 기반)을 기준으로 이렇게 2줄을 추가하면 된다.
implementation 'org.springframework.cloud:spring-cloud-config-server'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
다음으로는 Config Server의 자체 설정 파일을 통해 여러 설정을 한다. 이 설정 파일은 Client에게 제공할 설정파일 값과는 관계가 없으니, 헷갈리지 말도록 하자. 개인적으로 8080 포트는 다른 서비스에서 사용할 것 같아 포트를 8888로 수정했고, 연결할 git uri는 내부 git repository로 했다. 내가 작성했던 설정 파일에는 이런 식으로 작성하였다. (참고로 .properties 파일 형식이다.)
spring.application.name=spring-cloud-config-server
server.port=8888
spring.cloud.config.server.git.uri=file:///C:/{여러 경로들}/git-localconfig-repo
server.port 부분은 어플리케이션의 포트를 8888로 설정한 부분이라는 걸 어렵지 않게 알 수 있을 것이다. spring.cloud.config.server.git.uri라는 부분은, 이 Config Server가 Client에게 설정 파일의 값을 전달해줄 때, 어떤 git repository에 있는 설정 파일을 기반으로 전달해줄 것인가를 결정한다. 여기에서는 링크의 앞쪽에 'file:///'라는 게 붙어있는 걸 볼 수 있는데, github같은 온라인 git repository가 아닌, local git repository를 지정한다는 뜻이다. 물론, 보통 생각하는 온라인 git repository를 uri로 설정해도 전혀 문제가 없다.
local git repository를 설정하는 법
local git repository라고 하면 좀 거창해보이는데, 사실 별 것 없다. git init 명령어를 통해 초기화한, 내 컴퓨터 폴더 내부의 git repository를 그대로 사용하겠다는 뜻이다. 다음과 같은 명령어로 위 예시에서 사용한 repository를 간단하게 생성할 수 있다.
# mkdir git-localconfig-repo # repository로 삼을 폴더가 없는 경우, 생성부터 해 주자
cd git-localconfig-repo
git init
# 이 이후는 설정 파일을 저장한 후에 시행
git add .
git commit -m "adding files" # 당연하게도, commit하지 않으면 적용되지 않으니 주의하자...
local git repository에 들어가는 파일
repository 내에는, Client쪽에 공유할 설정 정보를 담은 설정 파일을 넣으면 된다. .yml과 .properties 모두 가능한데, 내가 봤던 자료에서는 .properties를 기준으로 진행했으므로 그걸 기준으로 설명한다.
Config Client측이 되는 서비스의 이름을 limits-service라고 할 예정이므로, 그걸 기준으로 설정값을 넣어보겠다.
# limits-service.properties
limits-service.minimum=2
limits-service.maximum=998
이 파일을 local repository 내부에 넣은 후, commit을 마치면 설정 파일 세팅은 완료되게 된다.
마지막으로, 프로젝트의 메인 실행부가 되는 Application 메서드 위에 @EnableConfigServer annotation을 붙여주면 모든 준비가 끝난다.
@EnableConfigServer
@SpringBootApplication
public class SpringCloudConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigServerApplication.class, args);
}
}
Config Client 만들기
이제 Config Server쪽 세팅은 끝났으니, Server에서 보내줄 값을 받아줄 Client를 만들면 간단한 테스트는 끝나게 된다. Client에서 설정을 받아 쓰는 법은 그리 어렵지 않다. 기존의 application.yml이나 application.properties 값에서 설정을 받아오듯이 사용하되, 그것을 Config Server와 연결해서 쓰면 된다.
로컬에 저장된 application.properties(혹은 yml)에서 값을 가져오는 방법에는 무엇이 있는지 알고 있는가? 간단하게 @Value annotation을 통해 설정 변수의 값을 가져오는 방법도 있고, @ConfigurationProperties annotation을 이용해 객체식으로 가져오는 방법도 있다. 이 부분은 편한대로 하되, 위에서 local git repository에 작성한 설정 변수의 이름과 같은 걸 가져오고 있는지 확실히 확인하자.
우선은 Client 서비스가 Config Server와 연결될 수 있도록, 필요한 의존성을 추가하자.
implementation 'org.springframework.cloud:spring-cloud-starter-config'
의존성을 추가한 후, application. 설정 파일을 통해 어떤 Config Server와 연결할지 확정하면 된다. 여기에서 수정하는 설정 파일은 Config Client 의존성을 추가한 프로젝트의 로컬 설정 파일임에 주의하자.
# 위에서 Config Server의 포트를 8888로 설정했기 때문에, 여기에서도 포트 8888을 지정해준다
# 'optional:' 부분을 제외하는 경우, Config Server와 연결이 안 될 때 실행에 실패하게 된다.
spring.config.import=optional:configserver:http://localhost:8888
설정을 마친 후, Server와 Client 어플리케이션을 차례로 실행하자. 그러면, local git repository에 저장된 값을, Config Client가 불러올 수 있게 된다!
'Spring' 카테고리의 다른 글
상속을 이용해 Entity 구성하기 (0) | 2024.09.08 |
---|---|
동시성 제어 (1편) (0) | 2024.09.01 |
븟츠의 동시성 이슈 해결 방법 (0) | 2024.09.01 |
Spring Security Architecture (Spring MVC 기반) (0) | 2024.08.25 |
@Bean과 @Component의 차이 (0) | 2024.08.25 |