핵심 요약
마이크로서비스 통신 옵션이 5종으로 늘었다(REST, GraphQL, gRPC, Connect, tRPC). "기본은 REST, 고성능은 gRPC" 시대는 끝. 2026 시점의 결정 가이드.
1. 한 줄 비교
| 프로토콜 | 스키마 | 전송 | 브라우저 |
|---|---|---|---|
| REST | OpenAPI (선택) | HTTP/1.1·2 | 네이티브 |
| GraphQL | SDL | HTTP/1.1·2 | 네이티브 |
| gRPC | Protobuf | HTTP/2 | 그RPC-Web 필요 |
| Connect | Protobuf | HTTP/1.1·2·3 | 네이티브 |
| tRPC | TypeScript | HTTP/1.1 | 네이티브 |
2. 결정 트리
- 외부 공개 API → REST/OpenAPI (생태계·툴링)
- 풍부한 쿼리·여러 클라이언트 → GraphQL
- 내부 서비스 간, 폴리글랏(다국어) → gRPC 또는 Connect
- 브라우저까지 호출 → Connect (gRPC 대신)
- 모노레포 풀 TypeScript → tRPC
3. Connect — 왜 새 옵션인가
Buf가 만든 Connect는 gRPC와 같은 Protobuf 스키마지만 HTTP/1.1·HTTP/3에서도 동작. 브라우저에서 별도 프록시 없이 호출 가능.
// schema.proto (gRPC와 동일)
syntax = "proto3";
service UserService {
rpc GetUser(GetUserRequest) returns (User);
rpc StreamUsers(stream GetUserRequest) returns (stream User);
}
// 브라우저에서 호출
import { createPromiseClient } from '@connectrpc/connect'
import { createConnectTransport } from '@connectrpc/connect-web'
import { UserService } from './gen/user_connect'
const client = createPromiseClient(UserService, createConnectTransport({
baseUrl: 'https://api.example.com',
}))
const user = await client.getUser({ id: '123' })
4. 실측 — 같은 페이로드 1만 RPS
| 프로토콜 | P50 | P99 | 네트워크 사용 |
|---|---|---|---|
| REST + JSON | 3.2ms | 14.1ms | 1.0x (기준) |
| gRPC + Protobuf | 1.8ms | 7.6ms | 0.34x |
| Connect + Protobuf | 1.9ms | 8.2ms | 0.35x |
| Connect + JSON | 2.6ms | 11.3ms | 0.92x |
| tRPC | 2.3ms | 10.8ms | 0.94x |
5. 스트리밍 — 결정적 차이
실시간 양방향 스트리밍이 필요하면 gRPC 또는 Connect. WebSocket·SSE는 추가 추상화 비용.
// Connect 양방향 스트림
async function* tail(req) {
const stream = client.tailLogs({ service: 'api' })
for await (const event of stream) {
yield event.line
}
}
6. 에러 모델 비교
| 프로토콜 | 에러 표현 | 유형 안전성 |
|---|---|---|
| REST | HTTP 상태 + 본문 | 약함 |
| gRPC | Status code + details | 강함 |
| Connect | 같음 (상호 호환) | 강함 |
| tRPC | JS Error 직렬화 | 강함 (TS 한정) |
7. 관찰성
OpenTelemetry는 모두 자동 계측. 다만 gRPC는 trailers, Connect/REST는 헤더로 trace context 전파 — 인터롭에서 가끔 누락. 통합 환경이라면 Connect를 게이트웨이에 두는 패턴 추천.
8. 한국 시장 현황
- 네이버·카카오: 내부 gRPC, 외부 REST·GraphQL
- 토스: gRPC + Kotlin, 일부 신규는 Connect로 전환 중
- 쿠팡: REST 중심, GraphQL 일부 (모바일 앱)
- 당근: GraphQL → REST 회귀(2025년) — 클라이언트 다양성 줄면서
9. 마이그레이션 — REST → Connect
buf.gen.yaml+ Protobuf 스키마 작성- 기존 REST 핸들러를 Connect 핸들러로 1:1 변환 (HTTP/1.1 호환 유지)
- 로드밸런서·게이트웨이 설정에서 두 경로(
/api/*·/connect/*) 동시 라우팅 - 클라이언트 점진 전환
- 3개월 이상 듀얼 운영 후 REST 종료
10. 의사결정 — 한 줄
외부 API + SaaS: REST. 모노레포 풀스택 TS: tRPC. 내부 마이크로서비스 + 브라우저 호출: Connect. 레거시 + 폴리글랏: gRPC.
참고
- connectrpc.com
- buf.build/blog/connect-vs-grpc

댓글 0