Audience: CTOs, Platform/Backend Leads, Solution Architects, Product Engineering Managers
Authoring Date: 2025-11-06
Scope: REST, GraphQL, WebSocket, gRPC, MQTT, Serverless (FaaS + API Gateway/Edge)
TL;DR
- 한 줄 요약: 모든 문제를 한 가지 API 스타일로 해결할 수 없다. 업무 요구(지연·처리량·일관성·보안·팀역량)와 운영 환경(브라우저, 모바일, IoT, 데이터센터/엣지)을 기준으로 혼합(Polyglot) 아키텍처를 설계하라.
- 빠른 매칭:
- CRUD 중심 B2B/B2C 백엔드: REST
- 프런트 주도 데이터 조립 / N+1 방지 / 단일 엔드포인트: GraphQL (+ Dataloader)
- 초저지연 실시간 상호작용: WebSocket (또는 gRPC 스트리밍)
- 내부 마이크로서비스 간 고성능 RPC: gRPC (Protocol Buffers)
- 저전력·간헐적 네트워크 IoT: MQTT (Pub/Sub, QoS, Retain)
- 스파이크형 트래픽·이벤트 처리·엣지 확장: Serverless (함수형 + 게이트웨이)
- 운영 팁: 스키마/계약 우선(Design‑First), 관측성(OTel) 표준화, 제로트러스트 보안, 캐싱/백프레셔/리트라이 정책 일관화.
1) 배경과 목적
API는 기업의 디지털 공급망이다. 본 백서는 6가지 대표 스타일의 특성과 운영 상의 트레이드오프를 비교·정리하고, 선택·혼합·마이그레이션을 위한 실무 지침을 제공한다.
2) 비교 개요 (한눈에 보는 매트릭스)
| 항목 | REST | GraphQL | WebSocket | gRPC | MQTT | Serverless |
|---|---|---|---|---|---|---|
| 주 용도 | CRUD, 통합 | 프런트 주도 질의 | 실시간 양방향 | 내부 고성능 RPC | IoT 메시징 | 이벤트/스파이크 처리 |
| 전송 | HTTP/1.1, HTTP/2 | HTTP/1.1/2 | WS over TCP | HTTP/2 | TCP (1883), TLS (8883) | HTTP/1.1/2 + 게이트웨이 |
| 스키마 | OpenAPI | SDL (Schema) | 메시지 규약 | Proto (.proto) | 토픽 규약/AsyncAPI | 이벤트/계약(AsyncAPI+OpenAPI) |
| 상태성 | 무상태 권장 | 무상태 | 장기 세션 | 무상태 | 브로커 상태 관리 | 무상태 함수 |
| 스트리밍 | SSE/HTTP2 가능 | 서브스크립션(WS) | 기본 | 양방향 스트림 | Retain/Last‑will | 이벤트 기반 |
| 캐싱 | CDN/ETag | 필드 단위 캐시 전략 | 어려움 | 호출 레벨 | 브로커 레벨 | 게이트웨이 레벨 |
| 브라우저 친화 | 매우 높음 | 매우 높음 | 높음 | 낮음(브라우저 직접 X) | 낮음 | 높음 |
| 모바일/오프라인 | 보통 | 보통 | 배터리 고려 | SDK 필요 | 강점(경량) | 보통 |
| 학습 곡선 | 낮음 | 중간 | 중간 | 중간~높음 | 중간 | 낮음~중간 |
| 보안 | OAuth2/OIDC | 동일 + 쿼리 제한 | 토큰 + 세션 관리 | mTLS/JWT | TLS + ACL | 게이트웨이 기반 |
| 관측성 | 용이 | 복잡도↑ | 상시 트레이스 필요 | 풍부한 메타 | 브로커 메트릭 | 게이트웨이 중심 |
| 비용 | 예측 용이 | BFF 비용↑ | 커넥션 비용↑ | 인프라 효율↑ | 브로커 비용 | 요청 단가/콜드스타트 |
메모: GraphQL, WebSocket, MQTT는 메시지/쿼리 레벨 거버넌스가 중요하다(쿼리 복잡도 제한, 토픽 ACL, 메시지 스키마 버저닝 등).
3) 각 스타일 심층 가이드
3.1 REST — Representational State Transfer
언제 쓰나: 범용 CRUD, 외부 파트너 통합, 캐싱이 중요한 공개 API.
핵심 패턴:
- URI 리소스 모델링:
/orders/{id} - 표준 메서드: GET/POST/PUT/PATCH/DELETE
- 계약 우선(OpenAPI): 문서→스텁→테스트 자동화
- Idempotency 키(POST 멱등화), ETag/Cache‑Control
- 에러 표준화: RFC7807(Problem Details)
반패턴: - 동사형 엔드포인트 남발, 과도한 중첩, 1:N 채집(N+1) 미해결, 페이지네이션/정렬 미정의.
스니펫 (OpenAPI 일부):
paths:
/orders/{id}:
get:
parameters:
- in: path
name: id
required: true
schema: { type: string }
responses:
'200': { description: OK }
3.2 GraphQL — Query Your Data with Precision
언제 쓰나: 프런트가 다양한 화면에서 필드 단위로 데이터 조립해야 할 때, 오버/언더페치 최소화.
핵심 패턴:
- 단일 엔드포인트:
/graphql - 스키마 우선(SDL) + 코드생성 + Dataloader로 N+1 완화
- 쿼리 복잡도 제한/Depth 제한
- Persisted Query로 캐싱/보안 향상
- Federation/BFF로 팀 경계 정렬
반패턴: - 무제한 임의 쿼리 허용, 거대한 리졸버에 비즈 로직 혼합.
스니펫 (SDL):
type Order { id: ID!, total: Int!, items: [Item!]! }
3.3 WebSocket — Instant, Two‑Way Interaction
언제 쓰나: 실시간 알림, 협업 편집, 게임/트레이딩, XR/미디어 제어.
핵심 패턴:
- 토픽/룸 추상화, 백프레셔 및 레이트리밋
- 연결 수 관리(샤딩, 팬아웃), 상태 동기화 프로토콜
- 세션 재연결/재인증
반패턴: - 서버 브로드캐스트 남발, 메시지 포맷 표준 없음, 장애 격리 미흡.
메시지 예:
{ "type":"presence","user":"u1","status":"online" }
3.4 gRPC — High‑Speed Remote Procedure Calls
언제 쓰나: 마이크로서비스 간 레이턴시 민감, 타입 안정성·양방향 스트림 필요.
핵심 패턴:
- .proto 계약 우선 + 멀티랭 SDK 생성
- HTTP/2 멀티플렉싱 + mTLS
- Gateway로 REST/JSON 변환 병행
반패턴: - 외부 브라우저 직접 노출, 스키마 없거나 무분별한 서비스 확장.
스니펫 (proto):
service OrderSvc { rpc Get(OrderId) returns (Order); }
3.5 MQTT — Lightweight Messaging for IoT
언제 쓰나: 저전력·간헐 연결 디바이스, 센서/액추에이터 제어, 수십만 장치 팬‑인.
핵심 패턴:
- 토픽 설계:
site/{id}/device/{id}/telemetry - QoS 0/1/2 선택, Retain 메시지, Last‑Will
- 브로커 클러스터링 + ACL, 인증/권한 토큰
반패턴: - 와일드카드 남발, 토픽에 PII 포함, 브리지 루프.
3.6 Serverless — Redefining Scalability
언제 쓰나: 이벤트 중심·스파이크 트래픽·엣지 로직·백오피스 자동화.
핵심 패턴:
- 함수 단일 책임 + 짧은 실행시간 + Idempotency
- 콜드스타트 완화(프리워밍/프로비저닝), DLQ/재시도
- 인프라 as Code로 배포 표준화
반패턴: - 장시간 CPU 바운드 작업, 대용량 연결 유지(WS 장기연결).
4) 하이브리드(Polyglot) 레퍼런스 패턴
- REST + WebSocket: CRUD는 REST, 변경 이벤트/협업은 WS.
- GraphQL Gateway + gRPC: 외부는 GraphQL, 내부는 gRPC로 서비스 경계 명확화.
- MQTT + Serverless: IoT 텔레메트리는 MQTT, 서버리스가 규칙/ETL 처리.
- REST + SSE: 구독이 간단하면 WS 대신 SSE.
ASCII 다이어그램(예: GraphQL↔gRPC):
[Web/Mobile] --HTTP--> [GraphQL Gateway] --gRPC--> [Order Svc]
└--gRPC--> [Inventory Svc]
5) 비기능 요구사항(NFR) 맵핑
- 지연/처리량: gRPC/WebSocket > REST > GraphQL(게이트웨이 비용 포함)
- 일관성: 활용 패턴에 따라; 이벤트소싱 시 멱등·재처리 설계 필수
- 가용성: 브로커/게이트웨이 단일장애지점 제거(HA)
- 확장성: 상태 분리, 팬아웃/샤딩, 토픽·키 파티셔닝
- 비용: 캐싱·콜레스·배치·샘플링, 서버리스 요청/GB‑sec 모델 주의
6) 보안·거버넌스 체크리스트
- AuthN/AuthZ: OIDC/OAuth2(+PKCE), mTLS(내부), 토큰 수명 단축·회전
- 권한 범위: 스코프·리소스 기반, RLS(DB) 연동
- GraphQL: 쿼리 깊이/복잡도 제한, 필드 권한, Persisted Query
- WebSocket: 재연결 시 토큰 재검증, 메시지 스키마 서명(optional)
- gRPC: SPIFFE/SPIRE로 워크로드 아이덴티티, protobuf 버저닝
- MQTT: 토픽 ACL, 디바이스 증명(증서/사전 공유키), LWT 정책
- 서버리스: 최소권한 IAM, 환경변수/시크릿 관리, 큐/토픽 격리
7) 관측성(Observability)·신뢰성
- 표준화: OpenTelemetry(Trace/Metric/Log) 일원화
- RED/USE 지표: Rate, Error, Duration / Utilization, Saturation, Errors
- 계약 테스트: Pact(REST/gRPC), SDL 검증(GraphQL), AsyncAPI(이벤트)
- 혼잡 제어: 타임아웃·리트라이·서킷브레이커·백프레셔·큐 적체 알람
- SLO/에러 등급: 사용자 영향 기반 에러 카탈로그, 에러 예산 운영
8) 의사결정 트리 (텍스트 버전)
- 브라우저/파트너 호환 & 캐싱 최우선? → REST
- 프런트가 화면별 필드 조립 필요? → GraphQL (Persisted Query + Dataloader)
- <100ms 양방향 상호작용? → WebSocket (또는 gRPC 스트림)
- 서비스 간 강타입·저지연? → gRPC (+ Gateway)
- 저전력·간헐 연결 디바이스? → MQTT
- 이벤트/스파이크·엣지 실행? → Serverless
- 둘 이상 해당? → 하이브리드 패턴 채택 (게이트웨이/브로커 중심)
9) 사례별 추천(시나리오)
- B2C 커머스 웹앱: REST(상품/주문) + GraphQL(BFF) + WebSocket(재고 알림)
- B2B 통합: REST(OpenAPI 계약) + gRPC(내부) + OIDC
- 트레이딩/게임: WebSocket(매치/상태) + gRPC(서비스) + 카프카/큐 백프레셔
- IoT 텔레메트리: MQTT(디바이스) + Serverless(ETL/규칙) + REST(관리)
- XR/미디어 제어(예시): gRPC(렌더/트래킹 내부) + WebSocket(오퍼레이터 UI 실시간) + REST(프로젝트/자산 관리)
10) 마이그레이션 플레이북
- Strangler Fig: 새 게이트웨이/GraphQL로 앞단 감싸고, 내부를 gRPC/이벤트로 단계적 분리
- 계약 우선 전환: OpenAPI/Proto/SDL 저장소 단일 소스화 + 코드생성 파이프라인
- 데이터 경계: Bounded Context 별 API 경계 재정의, 이벤트 카탈로그 구축
- 위험 통제: 트래픽 미러링, 카나리, 다크 론칭, 리버서블 배포
11) 구현 체크리스트 (샘플)
공통
- Design‑First 스키마 저장소(OpenAPI/Proto/SDL/AsyncAPI)
- 표준 에러 모델(RFC7807 등) & 추적 상관 ID
- Idempotency/리트라이/타임아웃 정책 표준화
- 보안: 최소권한, 키/증명서 회전, 토큰 수명/철회
- 관측성: OTel, 대시보드, 알람, 합성 모니터링
REST
- 페이징/정렬/필터 표준, ETag/캐시, 멱등키
GraphQL
- 쿼리 복잡도 제한, Persisted Query, Dataloader, Federation/BFF 경계
WebSocket
- 메시지 규약/버전, 방/토픽 설계, 재연결/토큰 재검증, 백프레셔
gRPC
- Proto 버저닝, Gateway 변환, mTLS, Deadline/Retry, Health/Reflection
MQTT
- 토픽 네이밍/ACL, QoS/Retain/LWT, 브로커 HA, 브리지 설정
Serverless
- 함수 타임아웃/메모리 설정, DLQ/재시도, 콜드스타트 완화, IaC
12) 비용 모델링(간단 예시)
- REST/GraphQL:
요청수 × 평균 응답시간 × 인스턴스 단가(캐시 적중률 변수) - WebSocket:
동시 연결수 × 평균 세션시간 × 커넥션 단가 - gRPC: 처리량 당 인스턴스 적재율↑ → 단위 요청 비용↓
- MQTT:
브로커 클러스터 비용 + 메시지/토픽 수 - Serverless:
호출수 × (GB‑sec) + 아웃바운드 네트워크
13) 문서화·도구·프로세스
- 계약·스키마: OpenAPI, GraphQL SDL, Protocol Buffers, AsyncAPI
- 코드생성: openapi‑generator, buf, graphql‑codegen
- 검증/테스트: spectral(lint), pact, k6/vegeta(부하), graphql‑shield
- CI/CD: 계약 변경 감시 → 스텁/SDK 재생성 → 배포
14) 부록 A — 용어
- BFF: Backend For Frontend. 채널별 맞춤 API.
- 멱등(Idempotent): 반복 호출 시 동일 결과 보장.
- 백프레셔: 송수신 속도 불일치 완화 메커니즘.
15) 부록 B — RFP/RFI 체크 질문 템플릿
- 귀사의 API는 어떤 스키마/계약 표준을 사용합니까? (OpenAPI/Proto/SDL/AsyncAPI)
- **관측성(OTel)**과 SLO 체계는 갖추고 있습니까?
- 보안 정책(토큰 수명, 키 회전, mTLS, ACL)은?
- 버저닝/하위호환 전략은?
- 백업/DR 및 지역 간 복제 정책은?
결론
단일 해법은 없다. 도메인 요구를 기준으로 스타일을 선택하고, 필요 시 혼합하라. 그 과정에서 계약 우선, 관측성, 거버넌스를 공통 토대로 삼으면 장기 유지보수 비용이 급감한다.
답글 남기기