본문 바로가기

TIL

HTTP 말고 다른 프로토콜은 뭐가 있을까? — JSON-RPC

JSON-RPC

한 줄 정의

JSON-RPC는 JSON으로 원격 함수를 호출하기 위한 가볍고 단순한 RPC(Remote Procedure Call) 프로토콜이다. "서버에 있는 함수를, 마치 내 코드의 함수처럼 호출한다"가 핵심 아이디어다.

RPC가 뭔데?

  • RPC (원격 프로시저 호출): 네트워크 너머에 있는 함수/메서드를 호출하는 방식. 개발자 입장에서는 add(1, 2) 처럼 평범한 함수 호출로 보이지만, 실제로는 그 요청이 네트워크를 타고 다른 머신에서 실행되고 결과만 돌아온다.

  • REST가 "자원(resource)"을 중심으로 GET /users/1 처럼 생각한다면, RPC는 "동작(action/메서드)"을 중심으로 getUser(1) 처럼 생각한다.

구분 REST RPC (JSON-RPC)
중심 개념 자원(Resource) 메서드(동작)
표현 URL + HTTP 메서드 메서드 이름 + 파라미터
예시 DELETE /users/1 deleteUser(1)

JSON-RPC의 특징

  1. Transport 독립적: HTTP, WebSocket, TCP, 심지어 표준입출력(stdio) 위에서도 동작한다. JSON-RPC 자체는 "메시지의 모양"만 정의하고, 어떻게 전달할지는 신경 쓰지 않는다. → HTTP에 종속되지 않는다는 점이 이 시리즈의 포인트.

  2. 단순함: 스펙이 매우 짧다. 정해진 몇 개의 필드만 알면 끝.

  3. 언어 중립: JSON만 주고받으면 되므로 어떤 언어끼리도 통신 가능.

  4. 현재 표준은 JSON-RPC 2.0.

요청(Request) 메시지

{
  "jsonrpc": "2.0",
  "method": "subtract",
  "params": [42, 23],
  "id": 1
}
필드 설명
jsonrpc 프로토콜 버전. 항상 "2.0"
method 호출할 메서드 이름 (문자열)
params 인자. 배열(위치 기반) 또는 객체(이름 기반). 생략 가능
id 요청 식별자. 응답을 요청과 짝지을 때 사용

params는 두 가지 방식 모두 가능하다:

// 위치 기반 (배열)
"params": [42, 23]

// 이름 기반 (객체)
"params": { "minuend": 42, "subtrahend": 23 }

응답(Response) 메시지

성공:

{
  "jsonrpc": "2.0",
  "result": 19,
  "id": 1
}

실패:

{
  "jsonrpc": "2.0",
  "error": {
    "code": -32601,
    "message": "Method not found"
  },
  "id": 1
}
  • 응답에는 result 또는 error정확히 하나만 들어간다. 둘 다 들어가거나 둘 다 없으면 안 된다.

  • id는 요청의 id를 그대로 돌려줘서 어떤 요청에 대한 응답인지 매칭한다. (여러 요청을 비동기로 동시에 보낼 때 중요)

표준 에러 코드

코드 의미
-32700 Parse error (JSON 파싱 실패)
-32600 Invalid Request (요청 형식 오류)
-32601 Method not found (메서드 없음)
-32602 Invalid params (인자 오류)
-32603 Internal error (서버 내부 오류)
-32000 ~ -32099 서버 정의 에러 (구현체가 자유롭게 사용)

Notification (응답 없는 요청)

id빼면 "알림(Notification)"이 된다. 서버는 처리만 하고 응답을 보내지 않는다. "결과는 필요 없고 그냥 알려만 줄게" 같은 상황에 쓴다.

{
  "jsonrpc": "2.0",
  "method": "logEvent",
  "params": ["user_clicked_button"]
}

Batch (여러 요청 한 번에)

요청들을 배열로 묶어 한 번에 보낼 수 있다. 응답도 배열로 온다 (Notification은 응답에서 빠진다).

[
  { "jsonrpc": "2.0", "method": "sum", "params": [1, 2, 4], "id": "1" },
  { "jsonrpc": "2.0", "method": "notify_hello", "params": [7] },
  { "jsonrpc": "2.0", "method": "get_data", "id": "9" }
]

어디서 쓰이나

  • 이더리움 등 블록체인 노드 API (가장 유명한 사용처)

  • MCP (Model Context Protocol) — AI 모델과 도구 간 통신. JSON-RPC 2.0 기반.

  • Language Server Protocol (LSP) — 에디터와 언어 서버 간 통신. 역시 JSON-RPC 기반.

  • 내부 마이크로서비스 간 가벼운 RPC

REST 대신 JSON-RPC를 고를 때

  • 자원(CRUD)보다 동작/명령 중심 API일 때

  • HTTP가 아닌 transport(WebSocket, stdio 등) 위에서 양방향 통신이 필요할 때

  • 스펙을 단순하게 유지하고 싶을 때

한 줄 요약

JSON-RPC = "JSON으로 함수 호출하기". method + params 보내면 result 받는다. transport에 얽매이지 않아 MCP, LSP, 블록체인 노드 등에서 널리 쓰인다.