웹 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
}