개요

서비스 간 통신을 위한 API 설계 방식을 비교합니다. REST, GraphQL, gRPC, tRPC 등 각 방식의 특징과 적합한 용도를 정리합니다.

방식별 비교

REST

항목내용
프로토콜HTTP/1.1, HTTP/2
데이터 형식JSON (주로)
핵심리소스 중심, URL + HTTP 메서드 (GET/POST/PUT/DELETE)
스키마OpenAPI (Swagger) — 선택 사항
GET    /api/users/123
POST   /api/users         { "name": "Kim" }
PUT    /api/users/123     { "name": "Lee" }
DELETE /api/users/123

장점: 단순, 캐싱 쉬움, 브라우저 친화적, 범용 표준 단점: Over-fetching/Under-fetching, 타입 안전 부족, 버전 관리 필요

GraphQL

항목내용
프로토콜HTTP (단일 엔드포인트)
데이터 형식JSON
핵심클라이언트가 필요한 데이터만 쿼리로 요청
스키마SDL (Schema Definition Language) — 필수
개발Meta (2015 공개)
query {
  user(id: 123) {
    name
    posts {
      title
      commentCount
    }
  }
}

장점: Over-fetching 해결, 강타입 스키마, 단일 엔드포인트, 프론트엔드 자유도 단점: 캐싱 어려움, 복잡한 쿼리 성능 이슈 (N+1), 학습 곡선, 파일 업로드 불편

주요 도구: Apollo, Relay, Hasura, Prisma, Strawberry (Python)

gRPC

항목내용
프로토콜HTTP/2 (바이너리)
데이터 형식Protocol Buffers (protobuf) — 바이너리 직렬화
핵심고성능 서비스 간 통신, 코드 자동 생성
개발Google
service UserService {
  rpc GetUser (GetUserRequest) returns (User);
  rpc ListUsers (ListUsersRequest) returns (stream User);  // 서버 스트리밍
}

장점: JSON 대비 10배 빠른 직렬화, 양방향 스트리밍, 다국어 코드 생성, HTTP/2 멀티플렉싱 단점: 브라우저 직접 호출 불가 (gRPC-Web 필요), 바이너리라 디버깅 어려움, 설정 복잡

주요 사용: 마이크로서비스 내부 통신, Kubernetes, 실시간 스트리밍

tRPC

항목내용
프로토콜HTTP
데이터 형식JSON
핵심TypeScript 풀스택 타입 안전 API (스키마/코드젠 불필요)
언어TypeScript 전용
// 서버
const appRouter = router({
  getUser: publicProcedure
    .input(z.object({ id: z.string() }))
    .query(({ input }) => db.user.findUnique({ where: { id: input.id } })),
});
 
// 클라이언트 — 타입 자동 추론!
const user = await trpc.getUser.query({ id: "123" });
//    ^? { id: string, name: string, ... }  ← 자동 완성

장점: 제로 스키마, 엔드투엔드 타입 안전, 자동 완성, 가장 빠른 개발 속도 단점: TypeScript 전용, 모노레포 권장, 외부 클라이언트 노출 어려움

조합: Next.js + tRPC + Prisma + Zod (T3 Stack)

WebSocket

항목내용
프로토콜WS/WSS (전이중)
핵심실시간 양방향 통신

장점: 실시간 (채팅, 게임, 주식), 서버→클라이언트 푸시 단점: 상태 유지 필요, 스케일링 복잡, HTTP 인프라 활용 불가

기타

방식특징용도
SSE (Server-Sent Events)서버→클라이언트 단방향 스트리밍LLM 스트리밍 응답, 알림
Webhook이벤트 발생 시 HTTP POST 콜백결제 알림, CI/CD 트리거
SOAPXML 기반 (레거시)금융, 정부 시스템
JSON-RPC경량 RPC (JSON)MCP, 블록체인

종합 비교

항목RESTGraphQLgRPCtRPC
프로토콜HTTPHTTPHTTP/2HTTP
데이터 형식JSONJSONProtobufJSON
타입 안전선택강제강제자동
성능중간중간최고중간
브라우저OOO
학습 곡선낮음중간높음낮음
실시간X (폴링)Subscription양방향 스트리밍X
언어 제한없음없음없음TS 전용
최적 용도공개 API복잡한 데이터내부 통신TS 풀스택

선택 가이드

상황추천
공개 API (서드파티 소비)REST + OpenAPI
복잡한 데이터 관계, 모바일GraphQL
마이크로서비스 내부 통신gRPC
TypeScript 풀스택tRPC
실시간 (채팅, 게임)WebSocket
LLM 스트리밍SSE
이벤트 알림Webhook

관련 항목