> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 파싱된 스트림의 재연결과 오류 처리 방법

> 파싱된 스트림의 연결 끊김을 감지하고 지연 시간을 두고 재연결하며, 구독을 다시 하고 정확히 놓친 슬롯 창을 백필하는 방법에 대해 설명합니다.

전달은 **최대 한 번**입니다 — 재생되지 않습니다. 연결이 끊긴 동안 확인된 내용은 다시 전송되지 않으므로, 프로덕션 클라이언트는 간극을 감지하고 백필할지 결정해야 합니다. 그 신호는 `context.slot`입니다: 이는 연결이 끊기면서 놓친 창을 제한합니다. 이 가이드는 연결이 왜 닫히는지, 어떻게 깨끗하게 재연결하는지, 그리고 이를 사용하는 방법을 다룹니다.

## 연결이 닫히는 이유

모든 닫힘에는 무슨 일이 일어났는지와 다음에 무엇을 해야 하는지 알려주는 WebSocket 닫힘 코드가 있습니다:

| 코드          | 이유                        | 다음 조치                                                                                                         |
| ----------- | ------------------------- | ------------------------------------------------------------------------------------------------------------- |
| 1000        | 유휴: 클라이언트 메시지와 알림 없음(10분) | 필터가 조용하다면 몇 분마다 JSON-RPC `ping` 메서드를 보냅니다. 프로토콜 수준의 WebSocket 핑은 클라이언트 라이브러리가 자동으로 보내며 유휴 타이머를 **리셋하지 않습니다**. |
| 1001        | 서버 재시작(배포)                | 재연결 및 재구독                                                                                                     |
| 1008        | 느린 소비자: 2048 개 이상의 알림을 놓침 | 더 좁은 필터로 재연결, `details: "matched"` 또는 `"raw"` 사용, 또는 더 빠른 처리                                                  |
| 1005 / 1006 | 네트워크 에지가 연결을 재활용          | 재연결 및 재구독; 장기 연결에서 주기적으로 발생할 수 있음                                                                             |

서버는 15초마다 핑을 보내므로, 건강한 조용한 연결도 여전히 트래픽을 처리합니다. 1분 넘게 아무런 알림이나 핑이 보이지 않으면, 소켓에서 알려주기를 기다리는 대신 연결이 죽었다고 가정하고 재연결하십시오.

## 연결 유지하기

필터가 충분히 좁아서 10분 동안 매치가 없을 수 있다면, 그보다 짧은 간격으로 명시적으로 JSON-RPC `ping`를 보내십시오:

```json theme={"system"}
{ "jsonrpc": "2.0", "id": 99, "method": "ping" }
```

현재 슬롯을 반환하며, 더 중요한 것은 유휴 타이머에 대한 클라이언트 메시지로 계산됩니다. 라이브러리 수준의 WebSocket 핑 프레임은 그렇지 않습니다.

## 재연결 및 간극 감지

<Steps>
  <Step title="지연시간을 두고 재연결">
    어떤 닫힘에서도 — 예상치 못했든 간에 — 지수 백오프로 재연결합니다. 구독 ID는 재연결 후에도 남지 않으므로 열려 있던 모든 필터에 대해 `parsedTransactionSubscribe`를 다시 보냅니다.
  </Step>

  <Step title="연결 끊김 간 context.slot 추적">
    연결 끊김 전에 본 마지막 `context.slot`를 유지합니다. 재연결 후 보이는 첫 슬롯과 그 슬롯 사이의 간극이 바로 놓친 창입니다 — 그 이상도 그 이하도 아닙니다.
  </Step>

  <Step title="필요 시 백필">
    애플리케이션이 간극을 용납할 수 없다면, RPC에서 그 슬롯 창을 백필하십시오: 범위 내 트랜잭션을 열거하려면 `getSignaturesForAddress`를 사용하고, 각각의 트랜잭션을 가져오려면 `getTransaction`를 사용합니다. 이는 수동 조정 단계이며, 파싱된 스트림 자체는 재생하지 않습니다.
  </Step>
</Steps>

```typescript theme={"system"}
import WebSocket from "ws";

const URL = "wss://<ENDPOINT>/?api-key=<API_KEY>";
const filters = [
  { programs: ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"] },
];

let lastSlotSeen: number | null = null;
let backoffMs = 1000;

function connect() {
  const ws = new WebSocket(URL);

  ws.on("open", () => {
    backoffMs = 1000;
    filters.forEach((filter, i) => {
      ws.send(JSON.stringify({
        jsonrpc: "2.0",
        id: i + 1,
        method: "parsedTransactionSubscribe",
        params: [filter],
      }));
    });
  });

  ws.on("message", (data) => {
    const msg = JSON.parse(data.toString());
    if (msg.method === "parsedTransactionNotification") {
      const { slot } = msg.params.result.context;

      // Across reconnects, the slot bounds the backfill window.
      if (lastSlotSeen !== null && slot > lastSlotSeen) {
        // backfill candidates: slots lastSlotSeen+1 .. slot-1 while disconnected
      }
      lastSlotSeen = slot;
    }
  });

  ws.on("close", (code) => {
    console.warn(`connection closed (${code}); reconnecting in ${backoffMs}ms`);
    setTimeout(connect, backoffMs);
    backoffMs = Math.min(backoffMs * 2, 30_000);
  });
}

connect();
```

`context.slot`는 재연결 후에도 남습니다: 연결 끊김 전 완전히 처리한 가장 높은 슬롯을 추적하고, 그 이후의 모든 것을 백필 창으로 취급합니다.

## JSON-RPC 오류 처리

실패한 요청은 결과 대신 JSON-RPC 오류를 반환하므로, `error.code`에 따라 분기할 수 있습니다:

| 코드       | 의미                                                   |
| -------- | ---------------------------------------------------- |
| `-32700` | 구문 오류(잘못된 JSON)                                      |
| `-32600` | 잘못된 요청                                               |
| `-32601` | 메서드를 찾을 수 없음                                         |
| `-32602` | 잘못된 매개변수: 잘못된 공개 키, 알 수 없는 필드, 지원되지 않는 커밋 또는 세부 사항 값 |
| `-32000` | 필터 제한 초과                                             |
| `-32001` | 서버 준비 안 됨; 지연 시간을 두고 다시 시도                           |
| `-32002` | 속도 제한(초당 10개 메시지)                                    |
| `-32006` | 너무 많은 구독(연결 당 25개)                                   |

`-32602`와 `-32000`는 요청 자체가 잘못되었음을 의미합니다 — 필터를 수정하고 그대로 다시 시도하지 마십시오. `-32001`와 `-32002`는 일시적입니다; 재연결에 사용하는 같은 지연 시간을 두고 다시 시도하십시오.

## 다음 단계

<CardGroup cols={2}>
  <Card title="빠른 시작" icon="bolt" href="/docs/ko/parsed-streams/quickstart">
    전체 프로토콜 참조: 메서드, 필터 필드, 제한.
  </Card>

  <Card title="Jupiter 스왑 추적" icon="arrow-right-arrow-left" href="/docs/ko/parsed-streams/guides/track-jupiter-swaps">
    이 연결이 구독할 수 있는 필터를 구축합니다.
  </Card>
</CardGroup>
