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의 특징
Transport 독립적: HTTP, WebSocket, TCP, 심지어 표준입출력(stdio) 위에서도 동작한다. JSON-RPC 자체는 "메시지의 모양"만 정의하고, 어떻게 전달할지는 신경 쓰지 않는다. → HTTP에 종속되지 않는다는 점이 이 시리즈의 포인트.
단순함: 스펙이 매우 짧다. 정해진 몇 개의 필드만 알면 끝.
언어 중립: JSON만 주고받으면 되므로 어떤 언어끼리도 통신 가능.
현재 표준은 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, 블록체인 노드 등에서 널리 쓰인다.
'TIL' 카테고리의 다른 글
| TLS — 평문 통신을 암호화된 채널로 바꾸는 계층 (1) | 2026.06.11 |
|---|---|
| TCP, UDP, QUIC — 데이터를 실어 나르는 전송 계층 (0) | 2026.06.11 |
| WebSocket — 서버가 먼저 말을 거는 양방향 채널 (0) | 2026.06.08 |
| requestAnimationFrame — 브라우저 렌더 루프의 작동 방식 (0) | 2026.06.08 |
| Face Blendshapes — 52개 숫자로 표정을 기술하는 법 (0) | 2026.06.08 |