개요
서비스 간 통신을 위한 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) — 바이너리 직렬화 |
| 핵심 | 고성능 서비스 간 통신, 코드 자동 생성 |
| 개발 |
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 트리거 |
| SOAP | XML 기반 (레거시) | 금융, 정부 시스템 |
| JSON-RPC | 경량 RPC (JSON) | MCP, 블록체인 |
종합 비교
| 항목 | REST | GraphQL | gRPC | tRPC |
|---|---|---|---|---|
| 프로토콜 | HTTP | HTTP | HTTP/2 | HTTP |
| 데이터 형식 | JSON | JSON | Protobuf | JSON |
| 타입 안전 | 선택 | 강제 | 강제 | 자동 |
| 성능 | 중간 | 중간 | 최고 | 중간 |
| 브라우저 | O | O | △ | O |
| 학습 곡선 | 낮음 | 중간 | 높음 | 낮음 |
| 실시간 | X (폴링) | Subscription | 양방향 스트리밍 | X |
| 언어 제한 | 없음 | 없음 | 없음 | TS 전용 |
| 최적 용도 | 공개 API | 복잡한 데이터 | 내부 통신 | TS 풀스택 |
선택 가이드
| 상황 | 추천 |
|---|---|
| 공개 API (서드파티 소비) | REST + OpenAPI |
| 복잡한 데이터 관계, 모바일 | GraphQL |
| 마이크로서비스 내부 통신 | gRPC |
| TypeScript 풀스택 | tRPC |
| 실시간 (채팅, 게임) | WebSocket |
| LLM 스트리밍 | SSE |
| 이벤트 알림 | Webhook |