Search
📒

10-1. Spring Cloud

Cloud Computing이라는 말은 많이 들어보셨을것 같습니다. 아마존의 AWS나 구글의 GCP, 마이크로소프트의 Azure 등을 클라우드 서비스라고 부르는 것은 많이들 아실 겁니다. 혹 사용해 보셨다면, 여러가지 서비스를 복합적으로 제공하는 것을 알고 계실겁니다.
클라우드 컴퓨팅은 기본적으로 사용자가 필요로 하는 자원을, 주문시 즉시 제공하는 기술입니다. 이때 이 자원이라는 것은, 저희가 일반적으로 서비스 제공을 위해 필요로 하는 컴퓨터 자원을 의미합니다. 한 예시로 AWS의 EC2 서비스는 정해진 형식의 컴퓨터 자원 (CPU, RAM, GPU 등)을 게시판에 게시글을 작성하듯이 요청하면 제공해주는 서비스입니다.
혹자는 클라우드에 대해서 ‘클라우드는 없다, 다른 사람의 컴퓨터일 뿐이다'고 비꼬기도 합니다. 큰 의미에서 보면 일리가 없는 말은 아니지만, 적어도 그런 서비스를 제공하기 위해서는 많은 기술 역량을 필요로 합니다. 특히 다양한 컴퓨터에 나눠져 만들어진, 분산된 시스템을 만드는 것은 매우 고난도의 작업입니다.

Spring Cloud 프로젝트 살펴보기

네트워크 상에 분산된 컴퓨터들이 서로 상호작용 하기 위해, 많은 설계 패턴들과, 통신 방식(규약) 등이 등장하였습니다. Spring Cloud 프로젝트의 주요 목적은, 이런 분산 시스템을 만드는데 도움이 되는 기술들을 제공하는데 목적이 있습니다. 또한 다양한 클라우드 서비스 제공자들의 서비스를 편하게 사용할 수 있도록 하는 프로젝트들 또한 많이 포함되어 있습니다. 이중 몇가지만 살펴봅시다.

Service Discovery

분산된 시스템에는 서로 다른 서비스들이 많은 물리적 서버에 걸쳐 존재합니다. 개별 서비스가 서로 다른 위치에 존재하다 보니, 각각이 정상적으로 실행중이고, 접속 가능한 상태인지를 발견(Discover)하는 과정이 필요합니다. Service Discovery는 이런 개별 서비스들의 상태를 파악하기 위한 개념입니다.
여태까지 한 서비스에서 다른 서비스로 요청을 보내야 하는 상황에서, 저희는 단순하게 주소(URL)를 입력하여 위치를 지정하곤 했습니다. 하지만 상황에 따라 서비스의 위치가 변경되거나, 동일한 서비스를 제공하는 서비스가 여럿이거나, 어떤 서비스가 접속 불가능한 상태가 되게 될 경우 문제가 발생할 수 있습니다. 그래서 이런 서비스들의 상태를 관리하는 주체를 두고, 동적으로 변동되는 서비스의 위치와 상태를 파악할 수 있도록 하는 것이 Service Discovery 패턴입니다.
Client Side - Server Side 차이 설명
Spring Cloud Project는 Netflix의 Open Source Software인 Eureka 를 사용할 수 있는 Spring Cloud Netflix 프로젝트가 있습니다.
참고

API Gateway

분산된 시스템에서, 각각의 서비스는 별도의 기능을 제공하게 됩니다. Naver 메인 페이지를 살펴봅시다.
위에 나오는 글들, 페이지들은 전부 별개의 서비스에서 제공하는 View입니다. 데이터를 제공하는 서비스도 다르고, 그에 따라 각각의 서비스들의 위치도 별개로 존재합니다. 하지만, 저희 사용자 입장에서는 한 곳에 요청을 보내어 응답을 받아온것과 같은 느낌을 받게 됩니다.
API Gateway Pattern은 이와 유사하게 각각의 서비스에 요청을 보내야 하는 대신, API Gateway로 요청을 보낼 수 있도록 하는게 목적입니다. 단순한 요청 Routing(다른 지점으로 요청을 전달하는 행위) 부터, 여러 서비스로 보내진 요청을 정리하여 응답, 그 외 다양한 서비스에서 필요로 하는 인증, 복호화 등 일반적으로 Spring Boot에서 Filter에서 처리하던 작업도 진행 할 수 있습니다.
Spring Cloud Gateway는 이런 Gateway Pattern을 제작하기 위한 라이브러리 입니다. 특별히 Java 코드를 작성할 필요도 없이, 설정만 가지고 Routing을 진행할 수 있습니다. 그 외에 Filter 등을 정의하는 것도 진행할 수 있으나, 여러 API 요청을 한곳에서 처리하는 형태는 지원하지 않습니다.

Spring Cloud Config

Spring Boot은 profile이라는 단위로, 설정 파일을 관리하게 됩니다. 저희가 알고 있다시피, 설정파일은 빌드 과정에서 JAR 안에 포함시키거나, 실행 과정에서 인자로 파일 위치를 전달하는 등, 다양한 방법으로 전달할 수 있습니다. 일반적인 서비스의 경우, 이는 매우 효율적이라 볼 수 있습니다. 하지만 클라우드 환경에서는 설정이 변동될 가능성이 있는 서비스가 많으며, 각각의 위치도 별개로 존재하기 때문에 효율적인 설정 관리가 어렵습니다.
Spring Cloud Config는 설정을 외부에서 관리를 하고, git을 비롯한 원격 저장소에 보관하고 업데이트 할 수 있도록 해주는 라이브러리 입니다. 저희가 작성하였던 appplication.yml 파일 등을, 특정 규칙을 가지고 폴더나 git에 업데이트를 하게 되면, 설정된 Spring Cloud Config 서버가 해당 설정들을 조회하게 됩니다.
이후 해당 설정을 실제로 사용하는 Config Client 서버에서는, 실행시, 또는 특정 조건 하에서 Config Server로 요청을 보내 설정을 받아오고, 적용시키게 됩니다.
이 외에도 Azure, GCP를 비롯한 다양한 클라우드 서비스 지원, 이상 상태의 서비스의 활용을 차단하는 Circuit Breaker, Serverless 지원을 위한 Spring Cloud Function, 여러 서비스를 통해 전달되는 요청의 로그를 위한 Spring Cloud Sleuth 등 다양한 기능을 제공합니다. Backend 개발자로서 성장을 지속하게 되면, 큰 단위의 시스템 설계에 대하여 공부하여야 하는 시점이 올때, Spring Cloud Project를 돌아보고 다시 찾아보는 계기가 되기를 바랍니다.