웹 API를 설계할 때 가장 널리 쓰이는 표준적 호출 규격은 REST API. 하지만 블록체인 노드 통신(이더리움 등), 마이크로서비스 내부 통신, 복잡한 비즈니스 로직 제어에서는 JSON-RPC 규격이 여전히 강력한 대안으로 쓰입니다.두 규격의 가장 본질적인 차이는 "어디에 초점을 맞추는가"입니다.
- REST API: 자원(Resource) 중심. URL로 대상을 가리키고, HTTP Method(GET, POST, PUT, DELETE)로 행동을 표현합니다.
- JSON-RPC: 함수(Method/Action) 중심. 엔드포인트 URL은 하나만 열어두고, Body에 실행할 원격 함수와 인자를 JSON으로 실어 보냅니다.
| 비교 항목 | REST API | JSON-RPC 2.0 |
| 핵심 패러다임 | 자원(Resource) 중심 | 프로시저/함수(Procedure) 중심 |
| 엔드포인트(URL) | 자원 계층마다 개별 존재 (/users, /orders) | 단일 엔드포인트 (/rpc, /api) |
| HTTP Method 활용 | GET, POST, PUT, PATCH, DELETE 적극 활용 | 주로 POST 하나로 고정 |
| 에러 핸들링 | HTTP 상태 코드(404, 401, 500 등) 활용 | JSON 응답 객체 내부의 error 필드 활용 |
| 캐싱 (Caching) | URL + HTTP 헤더 기반의 브라우저/CDN 캐싱 용이 | 모든 요청이 POST/동일 URL이므로 HTTP 캐싱 어려움 |
| 배치(Batch) 처리 | 규격 외 (별도 구현 필요) | 표준 스펙상 단일 요청에 배열로 여러 호출 묶기 지원 |
| 주요 사용 사례 | 공개 웹 서비스, 모바일 백엔드, 표준 CRUD 시스템 | 블록체인 노드(Web3), MSA 내부 통신, 원격 장비 제어 |
실제 기능 예시를 통해 두 방식의 차이점을 살펴보겠습니다.
1. 회원 정보 조회: Resource 조회 vs Remote Method 호출
특정 사용자(ID: 123)의 정보를 조회하는 시나리오입니다.
🗺️ REST API 방식
조회할 자원의 고유 식별자(URI)에 GET 요청을 보냅니다. HTTP 프로토콜의 표준 의미를 그대로 살리므로 요청 본문(Body)은 비워둡니다.
- HTTP Method & URL:
GET [https://example.com/users/123](https://example.com/users/123) - Request Body: 없음
- Response Body (200 OK):
json
{
"id": 123,
"name": "홍길동"
}🔌 JSON-RPC 방식
URL은 고정 엔드포인트 하나만 사용하며, 대부분 POST 메서드로 통일합니다. 요청 본문에 실행할 메서드(getUser)와 파라미터를 명시합니다.
- HTTP Method & URL:
POST [https://example.com/rpc](https://example.com/rpc) - Request Body:
json
{
"jsonrpc": "2.0",
"method": "getUser",
"params": {
"userId": 123
},
"id": 1
}- Response Body:
json
{
"jsonrpc": "2.0",
"result": {
"id": 123,
"name": "홍길동"
},
"id": 1
}2. 사용자 차단하기: 상태 변경 vs 특정 액션 실행
단순 CRUD를 넘어선 '특정 액션(차단, 승인, 송금 등)'을 수행할 때 두 방식의 성격 차이가 뚜렷하게 드러납니다.
🗺️ REST API 방식
REST는 모든 행위를 "자원의 상태 전이"로 해석해야 하므로 설계 시 고민이 생깁니다. 보통 자원의 하위 액션 URI를 파거나, 상태 변경(PATCH/POST) 모델을 사용합니다.
- HTTP Method & URL:
PATCH [https://example.com/users/123](https://example.com/users/123)(또는POST /users/123/block) - Request Body:
json
{
"status": "blocked",
"reason": "spam"
}- Response Body (200 OK):
json
{
"id": 123,
"status": "blocked"
}🔌 JSON-RPC 방식
행동 자체가 함수의 호출이므로, 비즈니스 명령을 직관적이고 군더더기 없이 표현할 수 있습니다.
- HTTP Method & URL:
POST [https://example.com/rpc](https://example.com/rpc) - Request Body:
json
{
"jsonrpc": "2.0",
"method": "blockUser",
"params": {
"userId": 123,
"reason": "spam"
},
"id": 2
}- Response Body:
json
{
"jsonrpc": "2.0",
"result": {
"success": true
},
"id": 2
}