API Styles

API(애플리케이션 프로그래밍 인터페이스) 스타일은 시스템 간 통신 방식을 결정하는 중요한 설계 패턴으로, 다양한 시스템과 장치가 서로 디지털적으로 통신할 수 있도록 연결해주는 역할을 한다. API 스타일은 API가 외부 세계와 상호작용하는 방식을 결정하는 중요한 요소이다.

API 스타일은 크게 다섯 가지로 분류할 수 있다:

  1. 리소스 스타일 (Resource Style)
  2. 하이퍼미디어 스타일 (Hypermedia Style)
  3. 쿼리 스타일 (Query Style)
  4. 터널 스타일 (Tunnel Style)
  5. 이벤트 기반 스타일 (Event-based Style)

각 스타일은 고유한 강점과 약점을 가지고 있으며, 적절한 API 스타일 선택은 해결하려는 문제, API 소비자, 그리고 API가 사용되는 컨텍스트에 따라 달라진다.

API Style의 간략 비교

스타일핵심 개념목적특징주요 원리 및 작동 원리
리소스 스타일리소스 중심의 CRUD 작업단순하고 직관적인 데이터 조작HTTP 메서드 사용, URI 기반 리소스 식별클라이언트가 URI를 통해 리소스에 접근하고, HTTP 메서드를 통해 조작
하이퍼미디어 스타일리소스 간의 링크를 통한 상태 전이클라이언트와 서버의 결합도 감소HATEOAS 원칙 준수, 동적인 탐색 가능응답에 포함된 링크를 통해 클라이언트가 다음 가능한 작업을 탐색
쿼리 스타일클라이언트가 필요한 데이터만 요청효율적인 데이터 전송쿼리 언어 사용, 정밀한 데이터 요청 가능클라이언트가 쿼리를 정의하여 서버에 요청, 서버는 해당 데이터만 응답
터널 스타일원격 프로시저 호출(RPC)을 통한 기능 호출고성능, 경량 통신바이너리 포맷 사용, 스트리밍 지원클라이언트가 함수를 호출하듯이 서버의 기능을 원격으로 실행
이벤트 기반 스타일이벤트를 기반으로 비동기 통신실시간 데이터 처리, 확장성 제공메시지 브로커 사용, 낮은 결합도이벤트 발생 시 이를 브로커에 발행, 구독자는 해당 이벤트를 처리

리소스 스타일 (Resource Style)

핵심 개념과 목적:

특징:

작동 원리:

구성 요소:

리소스 스타일 (REST) 아키텍처:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
클라이언트                                      서버
+--------+                                +--------+
|        |  GET /resources/{id}           |        |
|        | -----------------------------> |        |
|        |                                |  REST  |
|        |  200 OK                        |  API   |

|        | <----------------------------- |        |
|        |  {resource data}               |        |
+--------+                                +--------+

주요 기능:

하이퍼미디어 스타일 (Hypermedia Style)

핵심 개념과 목적:

특징:

작동 원리:

구성 요소:

하이퍼미디어 스타일 아키텍처:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
클라이언트                                     서버
+--------+                                +--------+
|        |  GET /api                      |        |

|        | -----------------------------> |        |
|        |                                |하이퍼미디어|
|        |  200 OK                        |  API   |
|        | <----------------------------- |        |
|        |  {data, _links: {…}}         |        |
+--------+                                +--------+
     |                                        ^

     |       GET /api/resources/1             |
     +--------------------------------------->+

주요 기능:

쿼리 스타일 (Query Style)

핵심 개념과 목적:

특징:

작동 원리:

구성 요소:

쿼리 스타일 (GraphQL) 아키텍처:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
클라이언트                                      서버
+--------+                                +--------+

|        |  POST /graphql                 |        |
|        | -----------------------------> |        |
|        |  {query: "…"}                |GraphQL |
|        |                                |  API   |

|        |  200 OK                        |        |
|        | <----------------------------- |        |
|        |  {data: {…}}                 |        |
+--------+                                +--------+

주요 기능:

터널 스타일 (Tunnel Style)

핵심 개념과 목적:

특징:

작동 원리:

구성 요소:

터널 스타일 아키텍처

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

클라이언트                                      서버
+--------+                                +--------+
|        |  gRPC 호출                      |        |
|        | -----------------------------> |        |
|클라이언트|  (Protocol Buffers)           | gRPC   |

| 스텁    |                                | 서비스  |
|        |  응답                           |        |
|        | <----------------------------- |        |
|        |  (Protocol Buffers)            |        |
+--------+                                +--------+

주요 기능:

이벤트 기반 스타일 (Event-based Style)

핵심 개념과 목적:

특징:

작동 원리:

구성 요소:

이벤트 기반 스타일 아키텍처:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
                 +----------------+
                 |  메시지 브로커   |

                 | (Kafka/RabbitMQ)|
                 +----------------+
                    ^          |
                    |          |
   이벤트 발행       |          | 이벤트 구독
                    |          |
                    |          v
+----------------+  |          +----------------+

|                |  |          |                |
| 이벤트 생산자   +--+          | 이벤트 소비자   |
|                |             |                |
+----------------+             +----------------+

주요 기능:

실무에서 고려사항 및 주의할 점

리소스 스타일 (Resource Style)

고려사항:

주의할 점:

하이퍼미디어 스타일 (Hypermedia Style)

고려사항:

주의할 점:

쿼리 스타일 (Query Style)

고려사항:

주의할 점:

터널 스타일 (Tunnel Style)

고려사항:

주의할 점:

이벤트 기반 스타일 (Event-based Style)

고려사항:

주의할 점:

API 스타일 비교

기본 특성 비교

특성리소스 기반하이퍼미디어 기반쿼리 기반터널 기반이벤트 기반
중심 개념리소스(명사)링크와 상태 전이데이터 요청프로시저/함수이벤트와 알림
통신 패턴요청-응답요청-응답요청-응답요청-응답발행-구독
상태 관리무상태하이퍼미디어 상태무상태무상태/상태 가능이벤트 스트림
대표 구현RESTHATEOAS, HALGraphQL, ODataSOAP, JSON-RPC, gRPCWebSocket, MQTT, Kafka
주요 사용 사례웹 API, 모바일 백엔드워크플로우 기반 앱데이터 집약적 앱프로시저 중심 시스템실시간 앱, IoT

기술적 특성 비교

특성리소스 기반하이퍼미디어 기반쿼리 기반터널 기반이벤트 기반
데이터 형식JSON, XMLHAL, JSON-LD, Collection+JSONJSON, GraphQL 스키마SOAP XML, Protocol BuffersJSON, Avro, CloudEvents
통신 프로토콜HTTPHTTPHTTP, WebSocketHTTP, TCP/IPWebSocket, MQTT, AMQP
캐싱 용이성높음높음중간낮음낮음
계약 정의OpenAPI, RAMLOpenAPI + 링크GraphQL 스키마, OData 메타데이터WSDL, ProtobufAsyncAPI, CloudEvents
타입 안전성선택적선택적높음매우 높음다양함

개발 및 사용 측면 비교

측면리소스 기반하이퍼미디어 기반쿼리 기반터널 기반이벤트 기반
학습 곡선낮음중간중간~높음중간중간~높음
개발자 친화성높음중간높음중간중간
클라이언트 복잡성낮음중간중간중간~높음높음
서버 복잡성낮음높음높음중간높음
코드 생성 도구많음제한적많음풍부함증가 중

성능 및 확장성 비교

측면리소스 기반하이퍼미디어 기반쿼리 기반터널 기반이벤트 기반
오버페칭 문제있음있음없음/적음중간해당 없음
언더페칭 문제있음있음없음/적음중간해당 없음
네트워크 효율성중간낮음높음중간~높음높음
실시간 능력제한적제한적구독으로 가능제한적기본 지원
대규모 확장성좋음좋음좋음좋음매우 좋음

장단점 비교

API 스타일장점단점
리소스 기반- 직관적이고 이해하기 쉬움
- HTTP 인프라와 완벽하게 통합
- 풍부한 도구 및 라이브러리
- 효과적인 캐싱
- 오버페칭/언더페칭 문제
- 여러 리소스 조회에 비효율적
- 버전 관리 복잡성
하이퍼미디어 기반API 변경 시 클라이언트 영향 최소화
- 자연스러운 API 탐색 가능
- 워크플로우 중심 상호작용에 적합
- 구현 복잡성 증가
- 대역폭 사용량 증가
- 클라이언트 구현 어려움
쿼리 기반- 클라이언트가 필요한 데이터만 요청
- 오버페칭/언더페칭 문제 해결
- 강력한 타입 시스템
- 서버 구현 복잡성
- 캐싱 전략 복잡
- 쿼리 복잡도 관리 필요
터널 기반- 엄격한 계약과 타입 안전성
- 바이너리 직렬화로 높은 성능
- 양방향 스트리밍 지원
HTTP 기능 활용도 낮음
- 클라이언트-서버 결합도 증가
- 브라우저 지원 제한적
이벤트 기반- 실시간 데이터 처리
- 시스템 간 느슨한 결합
- 비동기 처리로 확장성 향상
- 복잡한 설계 및 디버깅
- 이벤트 순서 및 일관성 관리
- 초기 설정 복잡성

산업 및 사용 사례 비교

API 스타일적합한 산업주요 사용 사례대표적 예시
리소스 기반웹 서비스, SaaSCRUD 작업 중심 애플리케이션GitHub API, Twitter API
하이퍼미디어 기반금융, 워크플로우 중심 산업복잡한 비즈니스 프로세스, 자기 발견형 APIPayPal API (HATEOAS 부분)
쿼리 기반데이터 집약적 서비스, 모바일 앱대시보드, 분석 도구, 커스텀 보고서GitHub GraphQL API, Facebook GraphQL
터널 기반엔터프라이즈, 금융, 통신마이크로서비스 간 통신, 레거시 시스템 통합Salesforce SOAP API, Google gRPC 서비스
이벤트 기반IoT, 실시간 애플리케이션, 게임채팅 앱, 알림 시스템, 실시간 대시보드Slack의 실시간 메시징, IoT 장치 통신

API 스타일을 선택할 때 고려해야 할 주요 요소

주요 요소설명 및 고려사항
비즈니스/기술 요구프로젝트 목적, 주요 기능, 활용 사례, 확장성
호환성언어/플랫폼, 프로토콜, 데이터 포맷
보안인증/인가, 암호화, 입력 검증, 속도 제한, CORS
신뢰성/장애대응장애 복구, 데이터 일관성, 중복 처리, DLQ
유지보수/미래대비버전 관리, 하위 호환성, 문서화, 커뮤니티 지원, 자동화 도구
성능/확장성응답 속도, 캐싱, 비동기 처리, 부하 분산
운영 난이도학습 곡선, 도입/운영 복잡성, 디버깅/모니터링 용이성
비용/라이선스도구/서비스 비용, 라이선스 정책
데이터 일관성Strong/Eventually Consistency, 트랜잭션 관리
유연성다양한 활용 사례 지원, 커스터마이징 가능성

API 스타일별 확장성 요소

스타일확장성 강점확장성 도전 과제
리소스Stateless, 캐싱 용이Over-fetching 문제
쿼리정밀한 데이터 요청복잡 쿼리 성능 저하
터널고성능 이진 통신서비스 디스커버리 복잡성
이벤트 기반생산자/소비자 독립 확장이벤트 순서 관리 복잡성
하이퍼미디어클라이언트-서버 결합도 감소“Chatty” API 위험

용어 정리

용어설명
API (애플리케이션 프로그래밍 인터페이스)소프트웨어 구성 요소가 서로 통신할 수 있도록 하는 메커니즘
REST (Representational State Transfer)로이 필딩이 제안한 분산 하이퍼미디어 시스템을 위한 아키텍처 스타일
HATEOAS (Hypermedia as the Engine of Application State)클라이언트가 하이퍼미디어 링크를 통해 동적으로 API를 탐색할 수 있게 하는 REST의 제약 조건
GraphQL클라이언트가 필요한 데이터 구조를 정확히 요청할 수 있는 쿼리 언어
RPC (Remote Procedure Call)원격 서버의 프로시저를 로컬 시스템에서 호출하는 것처럼 실행할 수 있게 하는 기술
gRPCGoogle에서 개발한 오픈소스 RPC 프레임워크
Protocol Buffers구조화된 데이터를 직렬화하기 위한 바이너리 형식 메커니즘
HTTP/2HTTP 프로토콜의 두 번째 주요 버전으로, 성능 향상에 중점을 둠
WebSocket클라이언트와 서버 간 지속적인 양방향 연결을 제공하는 통신 프로토콜
SSE (Server-Sent Events)서버에서 클라이언트로 자동 업데이트를 보내는 기술
Webhook특정 이벤트가 발생할 때 알림을 제공하는 HTTP 콜백
Apache Kafka고성능 분산 스트리밍 플랫폼
Pub-Sub (Publish-Subscribe)발행자가 메시지를 특정 수신자에게 직접 보내지 않고 채널에 게시하면, 구독자가 관심 있는 채널에서 메시지를 수신하는 메시징 패턴
JSON (JavaScript Object Notation)데이터 교환을 위한 경량 텍스트 기반 형식
HAL (Hypertext Application Language)JSON 또는 XML을 확장하여 하이퍼링크를 포함하는 형식
OpenAPIRESTful API를 설계, 구축, 문서화하기 위한 사양
오버페칭 (Over-fetching)필요한 것보다 더 많은 데이터를 가져오는 현상
언더페칭 (Under-fetching)필요한 데이터를 가져오기 위해 여러 요청이 필요한 현상
직렬화 (Serialization)데이터 구조를 전송이나 저장에 적합한 형식으로 변환하는 과정
API 게이트웨이API 호출을 중개하고 라우팅, 변환, 모니터링 등의 추가 기능을 제공하는 서비스
마이크로서비스작고 독립적인 서비스로 구성된 소프트웨어 아키텍처 접근 방식
AsyncAPI비동기 API를 위한 명세로, 이벤트 기반 아키텍처를 문서화하는 데 사용됨
CQRS (Command Query Responsibility Segregation)명령(데이터 변경)과 쿼리(데이터 조회)를 분리하는 아키텍처 패턴
Event Sourcing상태 변경을 이벤트 시퀀스로 저장하는 방식으로, 특정 시점의 상태를 재구성할 수 있음
Rate LimitingAPI 사용량 제한 기능
DLQDead Letter Queue. 처리 실패 이벤트를 별도 저장해 재처리하는 큐
Eventual Consistency분산 시스템에서 데이터가 결국에는 일관된 상태로 수렴하는 모델

참고 및 출처