기본 콘텐츠로 건너뛰기

[MSA] - 2. API Gateway가 필요한 이유

[MSA] - 2. API Gateway가 필요한 이유

안녕하세요. 이번 글은 MSA에 대한 글을 이어서 API Gateway에 대한 이야기를 하고자 합니다.

지난 MSA 글에서는 MSA를 왜 써야하는지, 어떨 때 필요하고, 무슨 장단점이 있는지를 간략하게 설명해보는 아주 쉬운 이야기를 다뤄봤습니다. 사실 MSA의 깊이는 그것보다 깊기 때문에 제대로 이야기를 하고자 한다면, 많은 이야기가 될 것 같아 짧게 필요한 부분을 설명드린 것이구요. 타 글에서 좀 더 심층적으로 다뤄볼까 합니다.

Spring Cloud를 사용해서 간단히 API를 구성하는 방법도 알았고, 이와 비슷하게 Python의 Django, Flask 등 타 언어, 타 프레임워크에서도 어떻게 구성할 수 있는지 감이 잡혔을 것이라 생각합니다.

오늘은 이들 API를 그룹화 시켜주는 API Gateway에 대해 알아보도록 하겠습니다.

API Gateway

API Gateway? 어디서 많이 들어본 말이다. 아마 AWS에서 Serverless Stack을 다뤄보신 분들이라면, Lambda와 API Gateway를 사용해보면서 경험해보신 분들일 것입니다. 네, 맞습니다. 실제로 해당 솔루션에서 제공하는 API Gateway와 동일한 역할을 하는 것이 바로 MSA의 API Gateway 입니다.

AWS, GCP 등의 클라우드를 이용하여 REST API를 만들고 운영하는 방법에는 대표적인 3가지 방법이 있습니다.

IaaS (EC2, VM Instance 등)를 사용하여 Tomcat, JBoss 등의 WAS 배포를 통한 운영. PaaS (ElasticBeansTalk 등)를 사용하여 war 혹은 jar 파일의 배포를 통한 운영. FaaS (Lambda, Functions 등)를 사용하여 코드 배포를 통한 운영.

이 중에서 API Gateway를 필히 사용하여 REST API의 URI를 잡아줘야 하는 것은 3번에 해당합니다. IaaS를 사용할 경우, 웹 애플리케이션 서버나, 웹 서버에서 제공하는 URI를 사용할 수 있는 방법이 있고, PaaS 역시 마찬가지입니다.

하지만 FaaS는 비즈니스 로직이 담겨져 있는 코드만 들어있습니다. 따라서 함수의 이름과 로직만 담겨져 있기 때문에 해당 코드가 어느 URI를 타야하는지에 대한 정보가 전혀 담겨져 있지 않으므로 이에 대한 URI 주소를 매겨줘야 합니다. API Gateway는 이런 URI를 하나로 통합하는 역할을 맡게 됩니다.

그렇다면 MSA에서는 이걸 어떻게 사용하게 될까요? MSA는 큰 서비스를 잘게 쪼개어 각각의 역할을 분리하게 됩니다. 그런데, 이렇게 하게 되면 URI 주소가 전부 달라지게 되고, 이 말은 포트 주소 등을 포함한 모든 주소가 달라지게 되는 것입니다. 이로 인해 생기는 문제점은 다음과 같습니다.

수많은 API 호출의 기록 관리가 용이하지 않음.

내부 비즈니스 로직, 인프라 등 주소가 선명하게 노출되어 보안에 취약.

각 서비스 마다 인증 등의 공통 로직을 중복 구현 해야 하는 문제점 존재.

특히 세 번째에 해당하는 문제점은 서비스 운영에 있어 가장 큰 헛점을 남기게 됩니다. 개발에 있어서 불편한 점보다는 더 크리티컬한 문제일 테니깐요.

좀 더 쉽게 설명하기 위해 아래의 그림을 보면서 설명을 해보도록 하겠습니다.

지난 Spring Cloud 실습을 그대로 인용해서 Note API를 작성했을 때, 우리는 이렇게 위와 같이 포트 주소를 다르게 매겨서 테스트를 했습니다. 물론 같은 환경이었기 때문에, 같은 IP 주소를 사용하고 있었죠. 그런데, 실제 실무에서는 이를 같은 서버에서 운영한다고 하더라도, 컨테이너화 시켜서 Docker 등으로 운영하게 되면 IP 주소가 달라지게 되고, 경우에 따라서는 진짜 다른 서버를 사용하기도 합니다.

그림처럼 API Gateway는 API 서버 앞단에서 모든 엔드포인트를 단일화 해주는 또 다른 서버의 역할을 합니다. 제가 사용하고 있는 도메인인 neonkid.xyz를 예로 들어서 표현을 한 것입니다. 만약 제가 저런 API를 만들고 API Gateway를 사용해서 단일화 한다면 저렇게도 구현할 수 있다는 것이죠.

아마 기존 인프라를 운영하시던 분들이시라면, 리버스 프록시(Reverse Proxy) 기술을 연상할 것입니다. 맞습니다. 그것과 거의 비슷한 역할을 하는 존재입니다.

여기에 API Gateway는 인증 서비스를 추가로 가지고 있어, 요청, 응답에 따라 애플리케이션 내부에 있는 마이크로 서비스로 라우팅하는 역할도 포함합니다.

이 외에도 다양한 기능이 존재합니다.

API Gateway의 주요 기능

1. 인증/인가 서비스

인증/인가 서비스는 서비스 호출에 있어서 매우 중요한 역할 중 하나입니다. 관리자와 사용자가 분리되어 있는 웹 서비스들이 대부분인데, 그들의 호출이 자유롭다면 문제가 있겠죠.

그런데, 서비스가 분리된다면, 이러한 보안 처리는 어떻게 해줘야 할까요? 기존 모놀리틱 아키텍처에서는 고민할 필요도 없이 이러한 보안처리를 디펜던시를 사용해서 처리했겠죠. 하지만 서비스가 각각 분리되어 있다면? 그들 디펜던시를 각 API마다 만들어준다면 소스가 중복되고, 그게 심해지면 유지 보수가 정말 힘들어집니다.

Spring으로 예를 들자면, 각 서비스에 Spring Security 디펜던시 넣고, 만들어주는 거랑 같죠...

API Gateway에서는 이러한 인증, SSL 등의 서비스를 오프로드해주기 때문에 이러한 불편함을 해소시켜줄 수 있습니다.

2. 라우팅과 로드밸런싱

대용량 처리 서비스에 있어 가장 필수인 로드 밸런싱은 이제는 거의 백엔드 개발에 필수가 되어버렸죠. 다만 장점이 있다면, 모놀리틱 아키텍처에서는 모든 서비스들에 대해 로드 밸런싱을 해줬다면, 마이크로 서비스 아키텍처에서는 실제로 요청이 많은 서비스에 대해서만 로드 밸런싱을 수행할 수 있다거나 스케일 업-아웃의 자유도가 증가했다고 볼 수 있겠네요.

또한 API 서버를 업그레이드 하거나 테스트 중에 다른 URI로 리다이렉트 할 수 있도록 라우팅 기능을 제공해줍니다.

3. 서비스 디스커버리 (Service Discovery)

MSA에 있어 가장 필요한 기능 중 하나입니다. 서비스가 분리되어 있는 상황에서 각 서비스를 호출하기 위해서는 서비스마다 고유적으로 가지고 있는 IP와 포트 주소를 알고 있어야 합니다. API 갯수가 그리 많지 않다면 큰 문제가 되지 않겠지만 API 갯수가 기하급수적으로 많고, 로드 밸런싱을 통해서 여러 서비스가 움직이고 있다면, 쉽지 않을 것입니다.

서비스 디스커버리는 내가 원하는 서비스의 IP, 포트 주소를 찾아주는 역할을 합니다. 실제로 이 기능을 많이 사용하고 있는 곳이 바로 클라우드인데, 클라우드의 경우는 스케일 업-다운이 자주 발생하고, 그렇게 되면 컨테이너 생성, 소멸에 따라 IP, 포트 주소가 달라질 뿐더러 또 고정된 값이 아니기 때문에 원하는 서비스를 검색하여 이들 정보를 제공해주는 것은 그야 말로 필수라고 할 수 있죠.

마치며...

여기까지, API Gateway에 대한 이야기를 몇 가지 다뤄봤습니다. 자세히 훑어보면, 기존 인프라 환경에서 편하게 쓰던 몇 가지 기능이 보일 것이고, 백엔드 개발을 해보신 분들이라면, 한 번 쯤 경험해 본 고민들일 것입니다.

이 글을 쓰면서 참고한 글이 있습니다. 거기에 있는 내용 중에는 SOA 프로젝트의 실패 사례 큰 까닭이 적혀있는데요. 그 중에 하나가 바로 ESB 내부 로직 처리에 사용한 데이터 구조였습니다. 과거에는 웹 애플리케이션의 대부분의 요청/응답을 XML로 처리했는데, XML을 한 번 파싱해보거나 써보신 분들이라면 느끼시겠지만 굉장히 파싱도 어렵고, 처리 속도 또한 무진장 느립니다..

지금은 JSON, GraphQL을 많이 사용하고 있고, 저 또한 그것을 많이 지향하고 있습니다. 앞으로 갈수록 대용량 처리 서비스의 수요는 계속 늘어날 것이고, 이러한 오버헤드 감소, 효율적인 아키텍처의 설계는 큰 과제 거리로 남게 될지도 모르겠네요.

다음 포스트에서는 Spring Cloud를 이용하여 이 게이트웨이를 구현하는 것에 대해 적어보도록 하겠습니다.

Ref: MSA 제대로 이해하기 - Velopert 님 포스트

from http://blog.neonkid.xyz/205 by ccl(S)

댓글

이 블로그의 인기 게시물

스프링 프레임워크(Spring Framework)란?

스프링 프레임워크(Spring Framework)란? "코드로 배우느 스프링 웹 프로젝트"책을 개인 공부 후 자료를 남기기 위한 목적이기에 내용 상에 오류가 있을 수 있습니다. '스프링 프레임워크'가 무엇인지 말 할 수 있고, 해당 프레임워크의 특징 및 장단점을 설명할 수 잇는 것을 목표로합니다. 1. 프레임워크란? 2. 스프링 프레임워크 "뼈대나 근간을 이루는 코드들의 묶음" Spring(Java의 웹 프레임워크), Django(Python의 웹 프레임워크), Flask(Python의 마이크로 웹 프레임워크), Ruby on rails(Ruby의 웹 프레임워크), .NET Framework, Node.js(Express.js 프레임워크) 등등. 프레임워 워크 종류 : 3. 개발 시간을 단축할 수 있다. 2. 일정한 품질이 보장된 결과물을 얻을 수 있다. 1. 실력이 부족한 개발자라 허다러도 반쯤 완성한 상태에서 필요한 부분을 조립하는 형태의 개발이 가능하다. 프레임워크를 사용하면 크게 다음 3가지의 장점 이 있습니다. 프레임워크 이용 한다는 의미 : 프로그램의 기본 흐름이나 구조를 정하고, 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식으로 개발 한다. => 이러한 상황을 극복하기 위한 코드의 결과물이 '프레임워크' 입니다. 개발자는 각 개개인의 능력차이가 크고, 따라서 개발자 구성에 따라서 프로젝트의 결과 차이가 큽니다. 2. 스프링 프레임워크(Spring Framework) 자바 플랫폼을 위한 오픈 소스 애플리케이션 스프링의 다른 프레임워크와 가장 큰 차이점은 다른 프레임워크들의 포용 입니다. 이는 다시말해 기본 뼈대를 흔들지 않고, 여러 종류의 프레임워크를 혼용해서 사용할 수 있다는 점입니다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크 이다. 여러 프레임워크들 중 자바(JAV...

[GCP] Flask로 TF 2.0 MNIST 모델 서빙하기

[GCP] Flask로 TF 2.0 MNIST 모델 서빙하기 Google Cloud Platform 우선 TensorFlow 2.0을 설치하자. 머신에 직접 설치하거나 도커를 다운받아 사용, 혹은 구글 colab을 활용( https://www.tensorflow.org/install)하면 되는데, TensorFlow에서 권장하는대로 머신에 VirtualEnv를 활용해서 설치하자 ( https://www.tensorflow.org/install/pip). 설치하는 김에 Flask도 같이 설치해보자. Compute Machine 하나를 생성(크게 부담 없는 예제라 g1 instance)하고, SSH를 연결하여 실행하면 된다. $ sudo apt update $ sudo apt install python3-dev python3-pip $ sudo pip3 install -U virtualenv # 굳이 system-wide로 flask를 설치할 필요는 없지만 그렇게 했다. $ sudo pip3 install flask $ sudo pip3 install flask-restful # virtualenv 환경에서 tensorflow 2.0 설치 $ virtualenv --system-site-packages -p python3 ./venv $ source ./venv/bin/activate # sh, bash, ksh, or zsh (venv) $ pip install --upgrade pip (venv) $ pip install --upgrade tensorflow 모든 환경이 마련되었으니, 우선 MNIST 모델을 TF 2.0으로 Training하여 모델을 Save 해 두자(tf_mnist_train.py). 대략 99% 이상 정확도가 나온다! import tensorflow as tf import numpy as np # 학습 데이터 load ((train_data, train_label), (eval_data, eval_label)) = tf....

Coupang CS Systems 채용 정보: 쿠팡 운용 관리 시스템을 구축 하고...

Coupang CS Systems 채용 정보: 쿠팡 운용 관리 시스템을 구축 하고... Global Operation Technology는 상품을 고객에게 지연 없이 전달 될 수 있도록 하는 조직입니다. 1997년, 초창기 아마존에 입사한다고 상상해보세요. 그 당시 누구도 e-commerce 산업이, 아마존이라는 회사가 지금처럼 성장하리라고는 생각하지 못했을 것입니다. 하지만, 그 당시 아마존을 선택한 사람들은 e-commerce 산업을 개척했고, 아마존을 세계적인 회사로 성장시켰습니다. 2016년 '아시아의 아마존'으로 성장하고 있는 쿠팡, 당신에게 매력적인 선택이 아닐까요? Global Operation Technology: eCommerce에서 주문을 한 뒤 벌어지는 상황에 대해서 호기심을 가져보신 적이 있나요? Global Operation Technology는 상품을 고객에게 지연 없이 전달 될 수 있도록 하는 조직입니다. 매일 최첨단 소프트웨어 기술을 이용해 고객의 주문을 받고 상품을 어느 창고에서 출고 시킬지, 포장을 하나의 박스 또는 여러 개로 나눌 것인지, 어떤 배송 루트를 선택하고 어떻게 고객에게 배송 상태를 보여줄지 결정하는 시스템과 서비스를 개발 합니다. What Global Operations Technology does: CS and C-Returns System 적극적 고객서비스를 바탕으로 고객의 목소리를 통해 끊임없이 고객 에게 서비스를 제공하고 Andon 메커니즘을 통해 고객의 목소리를 회사 전체와 공유합니다. 그리고 고객 문제 해결과 구매 이후 벌어질 수 있는 고객 문제를 사전에 예방하기 위한 시스템 개발을 통해 미래의 상황을 예측 합니다. Tranportation System TSP (Traveling Salesman Problem) 와 같은 CS 최적화 관리 문제를 다룹니다.배송 물품의 실시간 추적, 3P 하드웨어와 소프트웨어를 통합, 각 배송 루트에 할당되는 물량 예측하고 T...