> ## 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.

# WebSocket의 notifyOn 필터링

> LaserStream WebSocket 스트림에서 notifyOn 옵션을 사용하여 no-op 계정 업데이트를 건너뛰고 실제로 계정에 기록할 때만 알림을 받습니다.

[`accountSubscribe`](/docs/ko/api-reference/rpc/websocket/accountsubscribe) 및 [`programSubscribe`](/docs/ko/api-reference/rpc/websocket/programsubscribe) WebSocket 메서드의 `notifyOn` 옵션을 사용하면 **쓰기 잠금이 되었지만 기록되지 않은** 계정의 업데이트를 구독에서 건너뛸 수 있습니다. 동일한 필터가 gRPC에서도 제공됩니다 — gRPC 버전은 [notifyOn 필터링](/docs/ko/laserstream/notify-on-filtering)을 참조하세요.

## 문제: 쓰기 잠금이 중복 업데이트를 생성합니다

Solana에서 검증자는 거래가 계정을 쓰기 잠근 경우마다 계정 업데이트를 발생시킵니다 — 명령어가 실제로 계정에 기록되지 않아 그 램포트와 데이터가 변하지 않은 경우에도 그렇습니다. 바쁜 계정의 경우, 이는 새로운 정보를 전달하지 않고 대역폭을 소비하는 중복 "변경 사항 없음" 알림의 지속적인 스트림을 의미합니다.

## 필터 모드

`notifyOn`는 두 가지 문자열 값 중 하나를 가질 수 있습니다:

| 값         | 알림을 보내는 경우                     | 사용 용도                                      |
| --------- | ------------------------------ | ------------------------------------------ |
| `"lock"`  | 거래가 계정을 쓰기 잠그는 경우, 기록 여부와 관계없이 | 기본값 — 거래에 의해 단순히 접촉된 계정을 포함한 전체 가시성        |
| `"write"` | 거래가 실제로 계정에 기록할 때              | no-op 소음을 줄이기 위해 — 대부분의 소비자는 아무 것도 잃지 않습니다 |

알아두면 좋은 두 가지 세부 사항:

* **동일한 데이터를 기록해도** 기록으로 간주되며 전달됩니다. `write`는 잠금만 발생하는 접촉을 필터링하며, 동일한 바이트를 남기는 기록을 필터링하지 않습니다. 실제로 이러한 동일한 데이터 기록은 드물게 발생합니다 — 대부분의 경우 업데이트 중 5% 미만입니다.
* `write`가 제거하는 업데이트는 이미 받은 상태의 정확한 복제본입니다. 알림을 "이 계정이 거래에 의해 잠금되었습니다" 신호로 사용하는 경우 (예: 활동 추적), `lock`를 유지하십시오.

필드를 생략한 구독은 이전과 동일하게 작동하므로 기존 구독에 추가해도 안전합니다.

## `accountSubscribe`에서 사용하기

구성 객체에 `notifyOn`를 추가합니다:

```javascript theme={"system"}
const ws = new WebSocket('wss://mainnet.helius-rpc.com/?api-key=<API_KEY>');

ws.on('open', () => {
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'accountSubscribe',
    params: [
      '<ACCOUNT_PUBKEY>',
      {
        encoding: 'jsonParsed',
        commitment: 'confirmed',
        notifyOn: 'write' // skip no-op updates
      }
    ]
  }));
  setInterval(() => ws.ping(), 30_000);
});

ws.on('message', (data) => {
  const msg = JSON.parse(data.toString());
  if (msg.params?.result) console.log(msg.params.result);
});
```

## `programSubscribe`에서 사용하기

동일한 키가 `programSubscribe` 구성 객체에서 작동하여 프로그램이 소유하는 모든 계정에서 no-op 업데이트를 필터링합니다:

```javascript theme={"system"}
ws.send(JSON.stringify({
  jsonrpc: '2.0',
  id: 1,
  method: 'programSubscribe',
  params: [
    '<PROGRAM_ID>',
    {
      encoding: 'jsonParsed',
      commitment: 'confirmed',
      filters: [{ dataSize: 165 }],
      notifyOn: 'write' // skip no-op updates
    }
  ]
}));
```

파싱은 실패 시 열립니다: `"write"` (대소문자 구분 없음)만 옵트인합니다. 그 외의 경우 — 누락, 오타, 알 수 없는 토큰은 `lock`로 해결되므로, 실수가 발생해도 오류 없이 또는 데이터를 묵묵히 삭제하지 않고 모든 업데이트 경로를 유지합니다.

## 관련 항목

<CardGroup cols={2}>
  <Card title="accountSubscribe" icon="bolt" href="/docs/ko/api-reference/rpc/websocket/accountsubscribe">
    `notifyOn`를 포함한 전체 `accountSubscribe` 메서드 참조.
  </Card>

  <Card title="programSubscribe" icon="code" href="/docs/ko/api-reference/rpc/websocket/programsubscribe">
    `notifyOn`를 포함한 전체 `programSubscribe` 메서드 참조.
  </Card>

  <Card title="notifyOn 필터링 (gRPC)" icon="filter" href="/docs/ko/laserstream/notify-on-filtering">
    LaserStream gRPC 계정 필터에 동일한 필터 적용.
  </Card>

  <Card title="How to Use accountSubscribe" icon="wallet" href="/docs/ko/rpc/websocket/account-subscribe">
    WebSocket을 통한 계정 업데이트 스트리밍 가이드.
  </Card>
</CardGroup>
