Search
📒

10-3. Spring Cloud Gateway

앞서 이야기했던 Spring Cloud Gateway를 한번 살펴봅시다. Spring Cloud에서 Gateway Pattern을 구현하기 위한 라이브러리임을 이미 이전에 언급하였습니다.

Routing

기본적으로 분산 시스템 또는 MSA를 구현하게 되면, 서로 다른 작은 서비스들의 기능을 조합하여 큰 기능을 제공하는 것이 흔히 일어나게 됩니다. 포털 사이트의 메인화면에서 제공하는 데이터가, 수많은 서로 다른 서비스에서 제공한 데이터인 것과 유사하게 생각할 수 있습니다.
스포츠를 주제로 한 글을 모아서 볼 수 있는 화면을 고려해봅시다. 스포츠에 관련한 글 또는 데이터는 다양한 형태로 제공될 수 있습니다. 기자가 작성한 기사일 수 있으며, 방송사에서 제공한 스포츠 영상, 파워 블로거가 작성한 인기 블로그 글 등이 전부 스포츠와 관련된 글이라 분류할 수 있습니다.
저희의 Community 서비스를 살펴보면, UserController, AreaController, ShopController, CategoryController 이렇게 네가지의 @RestController 가 존재합니다. 각각의 기능이 연관되어 있긴 하지만, 분리의 여지가 존재합니다. 사용자의 정보와 밀접한 연관이 있는 UserController 는 인증 서버로 기능을 하기 위해 분리, 지역 정보를 거리를 기준으로 관리, 도달하는데 소요되는 자원에 대한 내용 관리를 위한 AreaController 의 분리, 실질적인 정보를 보여주기 위한 ShopController , CategoryController 의 분리 등. 각각 연관성을 높이기 위해 Controller 단위에서 소규모 서비스로 분리할 여지가 있습니다.
서비스가 작은 단위로 분리되면, 자연스럽게 endpoint는 늘어날 수 밖에 없습니다. 그리고 개별 서비스 마다 API 경로가 다른것은 물론, 실제 물리적 서버의 위치, 또는 같은 물리적 서버에서 듣고있는 Port의 차이등, 관리해야 되는 내용이 많이 늘어나게 됩니다. 이 경우 Client Application 입장에서는, 그 많은 endpoint 관리에 대하여 어려움을 가지게 될 수 있습니다.
이러한 상황에 대하여 Gateway Pattern은 다른 마이크로서비스 앞에서 endpoint를 한곳으로 모으는 역할을 할 수 있습니다. 이 역할을 하기 위해서, Client Application에서 요청하는 URL을 적절한 마이크로서비스의 URL로 변환, 또는 전달하는 기능을 Routing이라고 합니다. Routing은 Java 코드, 또는 설정파일로 진행할 수 있으며, 둘다 살펴보도록 합시다.

Filter

Chapter 6과 Chapter 7을 진행하면서 AOP, Interceptor, Filter에 대한 이야기를 하였습니다. 이들은 횡단 관심사에 발생하는 문제를 어떻게 처리할지에 대한 내용으로서, 수많은 기능들이 공통적으로 가져야 하는 내용을 어떻게 처리할지에 대한 기술이었습니다. 분산 시스템을 개발하면, 이런 횡단 관심사가 어플리케이션 내부가 아닌, 전체 마이크로서비스에 걸쳐서 나타나기 시작합니다.
어떤 기능의 실행 시간을 기록하는 기능을 생각해 봅시다. 일반적인 서비스라면, AOP나 Interceptor를 사용하여, HandlerMapping의 전후의 시간을 기록, 그 차이점을 기록하면 그만입니다. 하지만 이는 하나의 서비스 단독에 대한 이야기입니다.
MSA 구조에서는 다양한 마이크로서비스가 상호 작용 하며, 사용자에게 실제 기능의 결과가 전달되는 시점도 모든 마이크로서비스를 거치고 난 뒤라고 볼 수 있습니다. Client로 부터 최초로 요청이 도달한 시간부터, 마지막 마이크로서비스의 응답이 반환되는 시점까지가 실제로 걸리는 시간을 계산해야 하는데, 별개로 나누어진 마이크로 서비스에서는 적용하기 어렵습니다.
대신 Gateway에서는 모든 요청을 최초로 전달받고, 그에 따른 응답도 마지막에 전달하는 역할을 하게됩니다. 만약 Gateway에 저희가 필요로 하는 기능을 만들게 된다면, 큰 어려움 없이 위의 기능을 구현할 수 있을 것입니다. 이런 서비스간의 횡단 관심사를 위해 Filter를 구현할 수 있습니다.
Spring Cloud Gateway는 요청 / 응답에 Header를 추가하거나, 요청을 전달하는 경로(PATH)를 수정하는 등 다양한 Filter가 미리 구현되어 있으며, 저희가 원하는 형태의 Filter를 구현할 수 도 있습니다.

Dependency

기본적으로 Spring Cloud Gateway가 필요합니다. Spring Cloud Gateway는 Spring Boot, Spring WebFlux를 비롯하여 다른 여러 의존성을 가지고 만들어진 아티펙트입니다. 그래서 Spring Data나 Security와 같은 다른 의존성들과 충돌하는 경우도 있으니 참고하여 주세요. Spring Initialzr를 사용하면 쉽게 구성할 수 있습니다.

Demo 진행 순서

1.
Java Bean 기반 Routing
2.
YAML 기반 Routing
3.
Filter로 요청 경로 변경
4.
Custom Filter 제작