이것은 시스템 아키텍처 설계의 특정 주제의 주요 요점을 간략하게 다루는 일련의 기사의 연속입니다. 첫 번째 기사는 여기서 읽을 수 있습니다
API 아키텍처는 소프트웨어 구성 요소가 상호 작용하는 방식을 지정하는 일련의 규칙, 프로토콜 및 도구를 나타냅니다. API 아키텍처는 단순히 통신을 촉진하는 것이 아닙니다. 또한 이러한 통신이 효율적이고 안전하며 확장 가능하도록 보장하는 것도 중요합니다.
잘 설계된 API 아키텍처는 시스템 성능을 크게 향상시킬 수 있지만 잘못 설계된 API 아키텍처는 병목 현상, 보안 취약성 및 유지 관리의 악몽을 초래할 수 있습니다.
가장 일반적인 API 디자인 스타일:
REST (Representational State Transfer)는 표준 방법과 HTTP 프로토콜을 사용하는 가장 많이 사용되는 스타일입니다. 이는 상태 비저장, 클라이언트-서버 아키텍처 및 캐시 가능성과 같은 원칙을 기반으로 합니다. 프런트엔드 클라이언트와 백엔드 서비스 간에 자주 사용됩니다.
GraphQL 은 API용 쿼리 언어입니다. 각 리소스에 대해 고정된 엔드포인트 세트를 노출하는 REST와 달리 GraphQL을 사용하면 클라이언트가 필요한 데이터를 정확하게 요청할 수 있으므로 과도한 가져오기가 줄어듭니다.
WebSocket은 TCP를 통한 양방향 통신을 허용하는 프로토콜입니다. 클라이언트는 웹 소켓을 사용하여 백엔드 시스템에서 실시간 업데이트를 받습니다.
웹훅은 한 시스템이 특정 이벤트에 대해 실시간으로 다른 시스템에 알릴 수 있는 메커니즘입니다. 사용자 정의 HTTP 콜백입니다.
RPC(gRPC) 는 하나의 서비스가 네트워크의 다른 컴퓨터에 있는 서비스에 프로시저/메서드를 요청하는 데 사용할 수 있는 프로토콜입니다. 일반적으로 낮은 대기 시간, 고속 통신을 위해 설계됩니다.
SOAP 는 웹 서비스를 구현하기 위해 구조화된 정보를 교환하기 위한 프로토콜입니다. 이는 XML을 기반으로 하며 현재 레거시 프로토콜로 간주되는 견고성과 보안 기능으로 유명합니다.
모든 장단점 및 사용 사례와 함께 각 프로토콜을 개별적으로 살펴보겠습니다.
REST 는 표준 규칙과 프로토콜을 사용하여 이해하고 구현하기 쉬운 아키텍처 스타일입니다. 상태 비저장 특성과 표준 HTTP 메소드 사용으로 인해 웹 기반 API 구축에 널리 사용됩니다.
REST는 오랫동안 API 구축을 위한 사실상의 표준이었지만, GraphQL과 같은 다른 스타일이 등장하여 데이터 쿼리 및 조작을 위한 다양한 패러다임을 제공했습니다.
형식 : XML, JSON, HTML, 일반 텍스트
전송 프로토콜 : HTTP/HTTPS
Resource : REST에서는 모든 것이 리소스입니다. 리소스는 유형, 관련 데이터, 다른 리소스와의 관계 및 이에 대해 작동하는 메서드 집합이 포함된 개체입니다. 리소스는 URI(일반적으로 URL)로 식별됩니다.
CRUD 작업 : REST 서비스는 리소스에 대한 CRUD(생성, 읽기, 업데이트, 삭제) 작업에 직접 매핑되는 경우가 많습니다.
HTTP 방법 : REST 시스템은 표준 HTTP 방법을 사용합니다.
GET: 리소스를 검색합니다.
POST: 새 리소스를 만듭니다.
PUT/PATCH: 기존 리소스를 업데이트합니다.
DELETE: 리소스를 제거합니다.
상태 코드 : REST API는 표준 HTTP 상태 코드를 사용하여 API 요청의 성공 또는 실패를 나타냅니다.
500 내부 서버 오류
501 - 구현되지 않음
502 - 잘못된 게이트웨이
503 - 서비스를 사용할 수 없음
504 게이트웨이 시간 초과
Stateless : 클라이언트에서 서버로의 각 요청에는 요청을 이해하고 처리하는 데 필요한 모든 정보가 포함되어야 합니다. 서버는 요청 사이에 클라이언트 상태에 대한 어떤 것도 저장해서는 안 됩니다.
클라이언트-서버 : REST는 클라이언트-서버 모델을 기반으로 합니다. 클라이언트는 사용자 인터페이스와 경험을 담당하고, 서버는 요청 처리, 비즈니스 로직 처리, 데이터 저장을 담당합니다.
Cacheable : 서버의 응답을 클라이언트가 캐시할 수 있습니다. 서버는 응답이 캐시 가능한지 여부를 나타내야 합니다.
계층화된 시스템(Layered System) : 클라이언트는 일반적으로 최종 서버에 직접 연결되어 있는지, 아니면 중개자에 연결되어 있는지 알 수 없습니다. 중간 서버는 로드 밸런싱을 활성화하고 공유 캐시를 제공하여 시스템 확장성을 향상시킬 수 있습니다.
HATEOAS: 애플리케이션 엔진으로서의 하이퍼미디어 Stat는 서버가 응답에서 동적으로 제공하는 하이퍼미디어를 기반으로 클라이언트가 웹 애플리케이션과 상호 작용하고 탐색할 수 있도록 하는 REST 웹 서비스 원칙으로, 느슨한 결합과 검색 가능성을 촉진합니다.
요구
GET "/사용자/42"
응답
{ "id": 42, "name": "Alex", "links": { "role": "/user/42/role" } }
GraphQL은 특히 복잡한 시스템이나 프런트엔드에 높은 유연성이 필요한 경우 API 구축에 대한 보다 유연하고 강력하며 효율적인 접근 방식을 제공합니다. 일부 책임을 서버에서 클라이언트로 전환하여 클라이언트가 데이터 요구 사항을 지정할 수 있도록 합니다.
모든 시나리오에서 REST를 대체하는 것은 아니지만 특히 애플리케이션이 더욱 네트워크화되고 분산됨에 따라 많은 상황에서 강력한 대안을 제공합니다.
형식 : JSON
전송 프로토콜 : HTTP/HTTPS
요구
GET "/graphql?query=user(id:42){ 이름 역할 { id 이름 } }"
응답
{ "data": { "user": { "id": 42, "name": "Alex", "role": { "id": 1, "name": "admin" } } } }
WebSocket은 단일 장기 연결을 통해 전이중 통신 채널을 제공하여 클라이언트와 서버 간의 실시간 데이터 교환을 허용합니다. 이는 대화형 고성능 웹 애플리케이션에 이상적입니다.
형식 : 바이너리
전송 프로토콜 : TCP
요구
"ws://site:8181"을 얻습니다.
응답
HTTP/1.1 101 스위칭 프로토콜
Webhook 은 특정 웹 애플리케이션 이벤트에 의해 트리거되는 사용자 정의 HTTP 콜백으로, 실시간 데이터 업데이트와 다양한 시스템 간의 통합을 가능하게 합니다.
형식 : XML, JSON, 일반 텍스트
전송 프로토콜 : HTTP/HTTPS
요구
GET " https://external-site/webhooks?url=http://site/service-h/api&name=name "
응답
{ "webhook_id": 12 }
RPC (Remote Procedure Call)는 프로그램이 다른 주소 공간에서 프로시저나 서브루틴을 실행할 수 있도록 하는 프로토콜로, 분산 시스템 간의 원활한 통신과 데이터 교환을 가능하게 합니다.
gRPC (Google RPC)는 전송을 위해 HTTP/2를 사용하고 인터페이스 설명 언어로 프로토콜 버퍼를 사용하는 RPC 위에 구축된 최신 오픈 소스 프레임워크로, 효율적이고 강력한 통신을 촉진하기 위해 인증, 로드 밸런싱 등과 같은 기능을 제공합니다. 마이크로서비스 사이.
형식 : JSON, XML, Protobuf, Thrift, FlatBuffers
전송 프로토콜 : 다양함
요구
{ "method": "addUser", "params": [ "Alex" ] }
응답
{ "id": 42, "name": "Alex", "error": null }
형식 : 프로토부프
전송 프로토콜 : HTTP/2
message User { int id = 1 string name = 2 } service UserService { rpc AddUser(User) returns (User); }
Simple Object Access Protocol의 약자인 SOAP 는 컴퓨터 네트워크에서 웹 서비스를 구현하기 위해 구조화된 정보를 교환하기 위한 프로토콜입니다. 서로 다른 운영 체제에서 실행되는 프로그램이 서로 통신할 수 있도록 하는 XML 기반 프로토콜입니다.
형식 : XML
전송 프로토콜 : HTTP/HTTPS, JMS, SMTP 등
XML 기반 : SOAP 메시지는 XML로 형식화되며 다음 요소를 포함합니다.
Fault : 메시지를 처리하는 동안 오류에 대한 정보를 제공하는 선택적 Fault 요소입니다.
중립성 : SOAP는 모든 프로그래밍 모델과 함께 사용할 수 있으며 특정 모델에 묶여 있지 않습니다.
요구
<?xml version="1.0"?> <soap:Envelope> <soap:Body> <m:AddUserRequest> <m:Name>Alex</m:Name> </m:AddUserRequest> </soap:Body> </soap:Envelope>
응답
<?xml version="1.0"?> <soap:Envelope> <soap:Body> <m:AddUserResponse> <m:Id>42</m:Id> <m:Name>Alex</m:Name> </m:AddUserResponse> </soap:Body> </soap:Envelope>
API 아키텍처 스타일의 환경은 다양하여 REST, SOAP, RPC 등과 같은 다양한 접근 방식을 제공하며 각각 고유한 장점과 사용 사례가 있으므로 개발자는 다양한 소프트웨어 간의 확장 가능하고 효율적이며 강력한 통합을 구축하는 데 가장 적합한 패러다임을 선택할 수 있습니다. 구성 요소 및 시스템.