바이낸스
바이낸스 Order Book Snapshot 뜻 2026|호가 스냅샷·업데이트 ID·재동기화
현물 REST 호가 스냅샷과 Diff. Depth 연결 절차를 설명합니다. lastUpdateId·U·u, 버퍼·수량 교체·0 삭제·누락 재동기화와 관측 깊이의 한계를 정리했습니다.

바이낸스 Order Book Snapshot 뜻 2026|호가 스냅샷·업데이트 ID·재동기화
바이낸스 Order Book Snapshot은 특정 시점의 매수·매도 호가 가격대와 수량을 묶어 받은 자료입니다. 실시간 호가창을 만들 때 출발점으로 사용할 수 있지만, 한 번 받은 자료만으로 이후 시장 변화를 계속 알 수 있는 것은 아닙니다. 변경 이벤트와 올바르게 연결해야 현재 상태를 유지할 수 있습니다.
호가 숫자가 화면에 보인다고 자료가 완전하고 최신이라고 보장되지는 않습니다. 초기 스냅샷과 스트림 사이에 누락이 있거나 수량을 잘못 더하면 그럴듯한 호가창이 실제와 달라질 수 있습니다. 데이터 연결과 데이터 일관성을 분리해서 확인해야 하는 이유입니다.
이 글은 2026년 10월 28일 확인한 Binance Spot REST·WebSocket 공식 문서를 기준으로 합니다. 선물 depth 동기화 절차나 다른 거래소의 업데이트 규칙을 섞지 않습니다. ID와 수량 예시는 가상의 학습 자료이며 실제 거래 신호가 아닙니다.
1. 스냅샷과 변경 이벤트의 차이
스냅샷은 사진처럼 한 시점의 상태를 보여줍니다. 변경 이벤트는 이후 특정 가격대의 수량이 어떻게 바뀌었는지 알려주는 자료입니다. 사진과 변화 기록이 같은 순서 체계로 연결되어야 현재 상태를 계산할 수 있습니다. 둘 중 하나만으로 모든 시점의 호가를 알 수 있는 것은 아닙니다.
REST의 GET /api/v3/depth 응답에는 lastUpdateId와 bids, asks가 포함됩니다. bids는 매수 측 가격대, asks는 매도 측 가격대이며 각 항목은 가격과 수량으로 읽습니다. 주문 하나하나의 개인 식별 정보가 아니라 가격대별 수량 자료라는 점을 구분해야 합니다.
스냅샷은 체결 내역이 아님
호가 수량은 아직 남아 있는 주문의 가격대별 상태를 이해하는 자료입니다. 체결 내역은 실제 발생한 거래를 보여줍니다. 호가가 줄었다는 사실만으로 그 감소분이 모두 체결됐다고 단정할 수 없습니다. 취소·수정 같은 변화도 별도로 고려해야 합니다.
따라서 호가 자료만 보고 특정 사용자가 매도했다거나 큰 체결이 발생했다고 확정하지 않습니다. 실제 거래량과 방향을 분석하려면 체결 데이터의 의미를 함께 확인해야 합니다. 서로 다른 자료가 답하는 질문을 분리하는 것이 정확한 해석의 시작입니다.
스냅샷은 내 주문 목록이 아님
시장 전체의 가격대별 자료와 내 계정의 미체결 주문 목록은 다릅니다. 같은 가격에 내 주문이 있어도 공개 호가 수량 전체가 내 주문 수량인 것은 아닙니다. 계정 주문의 접수·체결·취소는 별도 사용자 데이터와 조회 경로로 확인해야 합니다.
공개 호가를 이용해 내 주문이 사라졌다고 추측하는 것도 위험합니다. 표시 범위 밖으로 밀렸거나 자료가 오래됐을 수 있습니다. 원래 주문 식별자로 실제 상태를 확인하는 절차가 필요합니다.
| 자료 | 알려주는 것 | 알려주지 않는 것 |
|---|---|---|
| REST depth 스냅샷 | 한 시점의 가격대별 호가 | 이후 모든 변화 |
| Diff. Depth 이벤트 | 가격대별 수량 갱신 | 독립적인 전체 초기 상태 |
| 체결 데이터 | 실제 발생한 거래 | 남아 있는 전체 호가 |
| 계정 주문 내역 | 내 주문의 상태 | 시장 전체 호가 구성 |
| 화면 캡처 | 표시된 순간의 화면 | 업데이트 연속성 증명 |
2. lastUpdateId·U·u를 구분
스냅샷의 lastUpdateId는 그 자료의 업데이트 기준점을 나타냅니다. Diff. Depth 이벤트의 대문자 U는 이벤트 안의 첫 업데이트 ID, 소문자 u는 마지막 업데이트 ID입니다. 대문자와 소문자가 다른 필드이므로 변수 이름을 정리하면서 의미를 합치지 않아야 합니다.
이 ID들은 이벤트가 어느 구간을 포함하는지 이해하는 데 쓰입니다. 숫자가 크다는 사실 자체가 가격 상승이나 거래량 증가를 뜻하지 않습니다. 시간 스탬프와도 다른 목적을 가진 값이므로 ID를 시각처럼 해석하지 않습니다.
왜 단일 번호가 아니라 범위인가
하나의 이벤트가 여러 업데이트를 포함할 수 있으므로 시작과 끝을 함께 읽어야 합니다. 다음 이벤트의 첫 ID가 현재 상태 다음에 이어지는지 판단하는 데 이 범위가 필요합니다. 마지막 ID 하나만 보면 중간 누락 여부를 충분히 판단하지 못할 수 있습니다.
스냅샷을 가져오는 동안에도 시장 변화는 계속 발생합니다. 스트림 이벤트를 먼저 버퍼에 모으고 스냅샷 기준점과 연결하는 절차는 이 시간 차이를 처리하기 위한 것입니다. HTTP 응답을 받은 시각과 스냅샷의 업데이트 기준점은 같은 개념이 아닙니다.
로컬 업데이트 ID
프로그램이 유지하는 호가장에도 마지막으로 반영한 업데이트 ID가 필요합니다. 처음에는 스냅샷의 lastUpdateId로 설정하고 이벤트를 적용하면 해당 이벤트의 u로 갱신합니다. 단순히 마지막 수신 시각만 기록하는 것으로 이 순서 검사를 대신할 수 없습니다.
로컬 ID는 자료의 연속성을 확인하는 상태입니다. 여러 심볼을 처리한다면 심볼마다 별도로 관리해야 합니다. 다른 심볼의 ID를 비교하거나 공통 카운터 하나로 합치면 의미가 없어집니다.
3. 공식 초기화 순서
Binance Spot WebSocket Streams 공식 문서의 로컬 호가장 관리 절차는 스트림 연결과 버퍼링을 먼저 시작하고 REST 스냅샷을 가져오는 흐름을 안내합니다. 스냅샷을 먼저 받고 나중에 스트림을 켜면 그 사이의 변화를 놓칠 수 있기 때문입니다.
첫 이벤트의 U를 기록한 다음 스냅샷의 lastUpdateId를 비교합니다. 현재 공식 문서는 lastUpdateId가 첫 이벤트의 U보다 엄격하게 작으면 스냅샷 조회 단계로 돌아가라고 안내합니다. 인터넷의 오래된 코드 조각보다 현재 제품의 공식 절차를 기준으로 해야 합니다.
버퍼에서 오래된 이벤트 제외
스냅샷의 lastUpdateId 이하에서 끝나는 이벤트, 즉 u가 lastUpdateId 이하인 버퍼 이벤트는 제외합니다. 이미 스냅샷에 포함된 범위의 이벤트를 다시 반영하지 않기 위한 단계입니다. 초기 버퍼 정리 조건과 이후 실시간 적용 조건의 문구를 임의로 섞지 않습니다.
현재 문서는 남은 첫 버퍼 이벤트의 [U, u] 범위와 스냅샷 기준점의 관계를 확인하도록 안내합니다. 이 연결 검사를 통과한 뒤 스냅샷을 로컬 상태로 설정하고 버퍼 이벤트를 순서대로 적용합니다. 연결 조건이 맞지 않으면 그럴듯한 화면을 만들기 위해 임의로 건너뛰지 않아야 합니다.
초기화 중에는 준비 상태를 표시
스트림에 연결되었어도 아직 스냅샷과 연결하지 못했다면 호가장이 준비된 것은 아닙니다. 화면이나 내부 상태에서 연결됨과 동기화 완료를 구분해야 합니다. 소비자가 준비되지 않은 자료를 실시간 분석에 사용하지 않도록 하는 것이 중요합니다.
버퍼가 계속 쌓이는데 스냅샷이 실패하면 무한히 메모리를 늘리는 대신 복구 정책을 마련해야 합니다. 재시도 간격, 버퍼 한도, 초기화 재시작 조건은 클라이언트 설계에 해당합니다. 공식 서버가 모든 환경에 같은 구현값을 보장한다고 설명하지 않습니다.
4. 이벤트 적용 규칙
공식 문서는 이벤트의 마지막 업데이트 ID u가 로컬 호가장의 업데이트 ID보다 작으면 해당 이벤트를 무시하도록 안내합니다. 또한 이벤트의 첫 ID U가 로컬 ID+1보다 크면 일부 이벤트를 놓친 것으로 보고 로컬 호가장을 버리고 처음부터 다시 시작하도록 설명합니다.
정상적인 흐름에서는 다음 이벤트의 U가 이전 이벤트의 u+1과 같다고 안내됩니다. 그러나 구현은 단순히 모든 이벤트가 한 번호씩 증가한다고 가정하는 것과 다릅니다. 범위와 현재 상태를 비교하는 공식 조건을 읽어야 합니다.
누락을 발견하면 재동기화
중간 이벤트가 없는 상태에서 이후 이벤트만 계속 적용하면 일부 가격대의 수량이 틀린 채 남을 수 있습니다. 최신 이벤트 하나가 전체 호가장을 모두 덮어주는 자료가 아니기 때문입니다. 그래서 누락을 발견했을 때 스냅샷부터 다시 연결하는 과정이 필요합니다.
이때 단순히 로컬 ID만 최신 u로 올려서 경고를 없애면 자료의 정확성이 회복된 것이 아닙니다. 실제 상태가 비어 있는 구간을 숨긴 셈입니다. 데이터 품질 경고를 지우는 것과 데이터를 복구하는 것은 구분해야 합니다.
수량은 더하는 것이 아니라 설정
이벤트의 b와 a에 들어 있는 가격대별 수량은 해당 가격대의 새로운 수량으로 설정합니다. 기존 수량에 증감량처럼 더하는 규칙이 아닙니다. 가격대가 없으면 새로 넣고 수량이 0이면 해당 가격대를 제거합니다.
이 원칙을 잘못 이해하면 매번 수량이 누적되어 실제보다 큰 유동성이 있는 것처럼 보일 수 있습니다. 자료가 빠르게 움직일수록 오류가 커질 수 있으므로 작은 가상 예시로 덮어쓰기와 삭제를 먼저 확인하는 것이 좋습니다.
| 상황 | 처리 의미 |
|---|---|
| 기존 가격대에 새 수량 수신 | 그 수량으로 교체 |
| 없는 가격대에 양수 수량 수신 | 새 가격대 삽입 |
| 수량 0 수신 | 해당 가격대 제거 |
| U가 로컬 ID+1보다 큼 | 누락으로 보고 재초기화 |
| 오래된 이벤트 | 공식 ID 조건에 따라 제외 |
5. 스냅샷 깊이의 한계
현재 공식 문서는 API 스냅샷이 각 측 최대 5,000개 가격대로 제한된다고 설명합니다. 초기 스냅샷 밖에 있는 가격대는 이후 변화가 오기 전까지 그 수량을 알 수 없을 수 있습니다. 따라서 로컬 호가장이 시장의 모든 가격대를 완전하게 알고 있다고 주장하면 안 됩니다.
많은 가격대를 조회했다고 모든 잠재 유동성을 알 수 있는 것도 아닙니다. 공개 호가 자료와 숨겨진 주문 구조, 미래 주문 유입은 다릅니다. 스냅샷은 현재 공개 자료의 제한된 관측이라는 점을 유지해야 합니다.
범위 밖을 0으로 간주하지 않기
보이지 않는 가격대의 수량을 0이라고 단정하면 깊이와 예상 체결 비용을 잘못 계산할 수 있습니다. 정보가 없는 것과 수량이 0이라고 확인된 것은 다릅니다. 계산 결과에 관측 범위가 어디까지인지 표시하는 것이 좋습니다.
특히 큰 주문의 예상 비용을 계산할 때 관측된 가격대가 부족하면 그 이후 가격을 임의로 연장하지 않습니다. 자료 부족을 알려야 하며 전체 주문이 그 가격 안에서 체결될 것처럼 보여주면 안 됩니다. 추정과 보장 사이의 차이를 분명히 해야 합니다.
REST limit과 호출 비용
Spot REST 시장 데이터 문서는 depth 조회의 limit과 요청 가중치를 설명합니다. 더 깊은 자료 조회는 호출 예산과 연결되므로 무한 반복 스냅샷 조회가 해결책은 아닙니다. 현재 문서의 한도와 가중치를 확인해 필요한 깊이를 선택해야 합니다.
스냅샷을 자주 받는 것과 변경 스트림을 정확하게 연결하는 것은 다른 문제입니다. 잦은 REST 조회만으로 두 조회 사이의 모든 변화를 복원할 수는 없습니다. 목적에 맞는 자료와 동기화 방법을 선택해야 합니다.
6. 다섯 가지 동기화 사례
예시 1. 스냅샷보다 오래된 버퍼 이벤트
스냅샷 lastUpdateId가 1,000이고 버퍼 이벤트의 u가 995라고 가정합니다. 이 이벤트는 초기 버퍼 정리에서 제외할 범위입니다. 이미 스냅샷 기준점보다 앞선 내용을 새 변화처럼 반영하면 상태를 뒤로 돌릴 수 있습니다.
제외 여부는 수신 시각이 늦었다는 이유만으로 결정하지 않습니다. 네트워크에서 늦게 도착한 오래된 이벤트가 있을 수 있으므로 업데이트 ID를 기준으로 공식 절차를 따릅니다. 시각과 순서 ID를 함께 기록하면 이런 차이를 진단하기 쉽습니다.
예시 2. 가격대 수량 교체
로컬 매수 가격 100에 수량 3이 저장되어 있는데 새 이벤트가 같은 가격의 수량 5를 알려준다고 가정합니다. 새 상태는 8이 아니라 5입니다. 이벤트의 수량을 증분으로 더하는 구현은 실제보다 큰 호가 잔량을 만들게 됩니다.
단위 테스트에서는 같은 이벤트를 다시 적용했을 때도 수량이 10으로 늘지 않는지 확인할 수 있습니다. 다만 수량 덮어쓰기가 중복 이벤트 관리 전체를 대신하는 것은 아닙니다. ID 처리와 다른 파생 통계의 중복 계산도 별도로 확인해야 합니다.
예시 3. 수량 0으로 가격대 삭제
매도 가격 101에 수량 2가 있었는데 새 이벤트가 수량 0을 알려준다고 가정합니다. 해당 가격대는 로컬 호가장에서 제거합니다. 0 수량의 줄을 계속 유지하면 최우선 가격 선택이나 누적 깊이 계산이 잘못될 수 있습니다.
없는 가격대의 0 업데이트를 만났을 때도 데이터 구조가 무너지지 않도록 처리해야 합니다. 삭제를 기록할지 여부는 구현 선택이지만 최종 호가 상태에서 존재하는 양수 가격대와 동일하게 취급하지 않습니다. 원본 이벤트와 현재 상태는 목적이 다릅니다.
예시 4. 업데이트 구간 누락
로컬 업데이트 ID가 1,005인데 다음 이벤트의 U가 1,010이라고 가정합니다. 1,006부터 이어지는 구간이 없으므로 공식 조건상 누락을 감지할 수 있습니다. 이후 이벤트를 그냥 반영하고 ID를 최신으로 올리는 것만으로는 빠진 가격대 변화를 복원할 수 없습니다.
로컬 호가장을 검증되지 않은 상태로 표시하고 공식 초기화 절차를 다시 수행합니다. 재동기화가 끝나기 전에는 이 자료로 계산한 깊이나 비용을 현재 확정값처럼 제공하지 않습니다. 복구 완료 기준은 연결 성공이 아니라 상태와 이벤트의 연속성 확보입니다.
예시 5. 스냅샷 바깥의 가격대
초기 스냅샷에 포함되지 않은 먼 가격대가 아직 변화 이벤트에도 나타나지 않았다고 가정합니다. 그 가격대의 수량을 모르는 상태일 수 있습니다. 자료에 줄이 없다는 이유만으로 시장 전체에 해당 가격의 주문이 없다고 확정하지 않습니다.
큰 주문의 예상 체결 가격을 계산하다가 관측 범위를 넘으면 계산을 중단하거나 자료 부족을 표시할 수 있습니다. 임의로 마지막 가격을 계속 적용해 전체 비용을 채우면 과도하게 낙관적인 결과가 나올 수 있습니다. 관측된 범위와 추정 범위를 나누어 설명해야 합니다.
7. 구현 흐름을 상태로 나누기
처음 연결 중, 이벤트 버퍼링 중, 스냅샷 대기, 연결 조건 확인, 정상 갱신, 누락 감지, 재동기화처럼 단계를 나누면 진단이 쉬워집니다. 모든 상황을 “연결됨” 또는 “끊김” 두 가지로만 표현하면 자료의 실제 사용 가능 상태를 숨길 수 있습니다.
각 단계에서 어떤 자료를 소비자에게 제공할지 정해야 합니다. 예를 들어 마지막 정상 자료를 보여줄 수는 있지만 현재 자료가 아니라는 표시가 필요합니다. 잘못된 최신 표시보다 명확한 갱신 대기가 사용자 판단에 더 도움이 됩니다.
초기화 작업의 경쟁 방지
네트워크 오류가 여러 번 발생하면 스냅샷 요청과 재연결이 겹칠 수 있습니다. 오래된 초기화 작업의 응답이 나중에 도착해 새 상태를 덮어쓰는 문제가 생기지 않도록 작업 세대를 구분하는 설계를 검토할 수 있습니다. 이는 클라이언트 구현상의 방어 방법입니다.
같은 심볼에 여러 초기화 루틴이 동시에 쓰기를 하면 ID 비교가 맞더라도 상태가 섞일 수 있습니다. 누가 현재 로컬 호가장을 갱신할 권한을 가지는지 구조를 명확히 해야 합니다. 공식 순서 검사를 올바른 자료 묶음에 적용하는 것이 중요합니다.
버퍼 처리 순서
버퍼 이벤트를 적용하는 동안 새 이벤트도 들어올 수 있습니다. 초기 버퍼와 이후 실시간 이벤트를 어떤 순서로 이어 붙일지 정해야 합니다. 임의로 최신 이벤트부터 처리하면 중간 상태를 건너뛰거나 ID가 뒤섞일 수 있습니다.
버퍼를 비우는 작업과 수신하는 작업 사이에 손실이 없도록 자료 구조를 선택합니다. 성능 최적화를 위해 이벤트를 합칠 때도 공식 의미와 연속성 검사가 유지되는지 확인해야 합니다. 빠른 처리보다 먼저 일관된 처리가 확보되어야 합니다.
8. 연결과 시간 관리
현재 Spot WebSocket 문서는 연결 수명과 ping·pong 규칙을 설명합니다. 연결이 계속 유지될 것이라고 가정하지 말고 재연결과 재동기화를 정상 운영의 일부로 설계해야 합니다. 구체적인 제한과 메시지 규칙은 작성 시점 이후 바뀔 수 있으므로 운영 전 현재 문서를 확인하세요.
이벤트의 거래소 시각과 로컬 수신 시각을 분리해 기록하면 지연을 이해하는 데 도움이 됩니다. 다만 시계가 서로 정확히 맞는지 확인하지 않은 단순 차이를 절대적인 네트워크 지연으로 단정하지 않습니다. 시간 동기화 상태도 진단 맥락에 포함됩니다.
재연결은 상태 복구의 시작
소켓이 다시 열렸다는 사실만으로 이전 호가장이 최신이 되지는 않습니다. 끊긴 동안 어떤 업데이트를 놓쳤는지 확인해야 합니다. 공식 로컬 호가장 절차에 맞춰 새 스냅샷과 스트림을 연결하는 흐름이 필요합니다.
연결이 자주 끊기면 원인과 호출 예산을 함께 살펴봅니다. 무제한 재연결·스냅샷 요청은 부하와 제한 문제를 악화시킬 수 있습니다. 적절한 대기와 오류 분류를 적용하되 오래된 자료를 최신처럼 사용하는 방식으로 문제를 감추지 않습니다.
밀리초와 마이크로초
현재 스트림 문서는 기본 시간 단위와 선택적 마이크로초 설정을 안내합니다. 시간을 처리할 때 사용하는 연결의 단위를 명확히 해야 합니다. 한 경로의 밀리초를 다른 경로의 마이크로초와 그대로 비교하면 지연과 순서 분석이 크게 틀릴 수 있습니다.
업데이트 ID는 시간 단위를 바꾸는 대상이 아닙니다. 숫자가 크고 증가한다고 타임스탬프처럼 나누거나 날짜로 변환하지 않습니다. 자료마다 필드의 목적과 단위를 명시해 처리하는 것이 좋습니다.
9. 호가 데이터로 할 수 있는 것과 한계
일관된 호가 자료가 있으면 관측 범위 안의 스프레드, 누적 수량, 특정 크기의 주문에 대한 단순 비용 추정 등을 계산할 수 있습니다. 그러나 계산 직후 호가가 바뀔 수 있고 실제 주문의 우선순위와 체결 과정도 다릅니다. 계산 결과를 실행 보장으로 제시하지 않습니다.
호가가 많다고 그 수량이 실제 주문 도착 시에도 그대로 남아 있다고 보장할 수는 없습니다. 공개 잔량은 취소되거나 바뀔 수 있습니다. 반대로 현재 보이지 않는 미래 주문 유입도 있을 수 있습니다. 스냅샷은 현재 관측 자료이지 미래 유동성의 약속이 아닙니다.
수량 감소의 원인 추정
호가 수량이 줄었다면 체결, 취소, 수정 등 여러 맥락을 생각할 수 있습니다. 공개 depth 자료만으로 특정 원인을 전부 분해할 수 있다고 주장하지 않습니다. 체결 스트림과 함께 보더라도 시각·집계·연결 방식의 한계를 고려해야 합니다.
큰 호가가 사라졌다는 관측을 특정 투자자의 의도나 시장 조작으로 단정하는 것도 근거가 부족할 수 있습니다. 기술 자료 설명에서는 확인된 변화와 해석을 분리해야 합니다. 숫자의 움직임이 곧 사람의 동기를 알려주는 것은 아닙니다.
표시 범위와 계산 범위
화면에 상위 몇 줄만 표시하더라도 내부 계산은 더 넓은 범위를 사용할 수 있고 그 반대도 가능합니다. 사용자가 보는 깊이와 프로그램이 계산에 사용하는 깊이가 무엇인지 명확히 해야 합니다. 화면 줄 수만으로 원본 스냅샷 limit을 추측하지 않습니다.
가격을 화면에서 묶어 보여주는 경우 원래 가격대 자료와 묶음 단위도 구분해야 합니다. 표시용 집계를 원본 업데이트에 직접 적용하면 삭제·수량 교체가 꼬일 수 있습니다. 원본 상태를 유지하고 표시용 변환을 분리하는 설계가 도움이 됩니다.
10. 오류 진단 표
| 증상 | 먼저 확인할 항목 | 피해야 할 조치 |
|---|---|---|
| 수량이 계속 커짐 | 덧셈 대신 덮어쓰기 여부 | 누적값을 실제 유동성으로 표시 |
| 0 수량이 최우선에 남음 | 가격대 삭제 처리 | 0 줄을 정상 호가로 유지 |
| 연결은 정상인데 자료 이상 | ID 연속성·초기화 상태 | 연결 상태만으로 정상 판정 |
| 재연결 뒤 가격이 튐 | 스냅샷 재연결 절차 | 이전 호가장 그대로 재사용 |
| 특정 심볼만 불일치 | 심볼별 버퍼·ID 분리 | 공통 ID로 전체 처리 |
| 깊은 가격대 계산 부족 | 초기 스냅샷 범위 | 모르는 수량을 0으로 단정 |
| 늦은 응답이 상태 덮어씀 | 초기화 작업 세대 | 오래된 응답 무조건 적용 |
오류를 진단할 때는 마지막 정상 업데이트 ID, 새 이벤트의 U·u, 초기 스냅샷 ID, 연결 세대를 함께 남기면 도움이 됩니다. 가격·수량 일부만 보면 순서 문제를 복원하기 어렵습니다. 필요한 공개 데이터만 기록하고 계정 비밀 정보는 포함하지 않습니다.
11. 가상 데이터로 검증하는 순서
작은 호가장으로 삽입, 수량 교체, 삭제를 먼저 확인합니다. 이후 오래된 이벤트, 연결 가능한 범위, 명확한 누락, 재초기화 상황을 나누어 검토합니다. 모든 검증을 실제 거래와 함께 수행할 필요는 없으며 공개 데이터 처리 논리는 별도로 확인할 수 있습니다.
스냅샷 요청이 느린 상황과 버퍼가 많이 쌓이는 상황도 고려합니다. 정상적인 빠른 응답에서만 동작하는 코드는 실제 네트워크 변동에 취약할 수 있습니다. 오래된 초기화 응답이 도착하는 경우와 새 연결 이벤트가 들어오는 경우를 분리해 검토하세요.
파생 지표의 중복 처리
호가 수량은 덮어쓰므로 같은 값이 다시 들어와도 최종 상태가 같을 수 있습니다. 하지만 이벤트 수나 변화량을 별도로 누적하는 지표는 중복 적용의 영향을 받을 수 있습니다. 현재 호가 상태의 정확성과 파생 통계의 정확성을 따로 확인해야 합니다.
예를 들어 갱신 이벤트를 수신할 때마다 수량을 거래량처럼 합산하면 전혀 다른 값이 됩니다. depth 수량은 체결량이 아닙니다. 어떤 지표가 어떤 원본 의미를 사용하는지 먼저 정의해야 잘못된 통계가 만들어지는 것을 막을 수 있습니다.
정상 복구의 완료 기준
복구는 새 소켓을 열었다는 로그로 끝나지 않습니다. 새 스냅샷과 버퍼 연결이 확인되고 이후 이벤트가 공식 순서 규칙에 따라 적용되는지 확인해야 합니다. 소비자에게 자료 사용 가능 상태를 전달하는 시점도 이 기준과 연결해야 합니다.
복구 중에 마지막 정상 자료를 보존했다면 새 자료로 바꾼 시각을 기록할 수 있습니다. 사용자가 보았던 값이 언제의 자료인지 설명할 수 있어야 합니다. 조용히 오래된 자료를 계속 갱신하는 듯 표시하는 방식은 진단과 신뢰 모두에 불리합니다.
12. 가격대 정렬과 자료 보존
매수와 매도 가격대는 최우선 호가를 찾는 방향이 다릅니다. 일반적인 호가 해석에서 매수는 높은 가격이, 매도는 낮은 가격이 우선합니다. 내부 저장을 문자열 순서로 정렬하면 숫자 크기와 다른 결과가 나올 수 있으므로 가격을 비교하는 방식부터 확인해야 합니다.
예를 들어 문자열 9와 100을 문자 순서로 비교하는 것과 수치로 비교하는 것은 다릅니다. 소수 가격도 마찬가지입니다. 정렬·키 생성·수량 교체에서 동일한 가격을 같은 가격대로 인식하도록 수치 표현 규칙을 일관되게 적용해야 합니다. 화면 표시를 위해 붙인 쉼표나 통화 기호는 원본 가격 키와 분리합니다.
매수와 매도 자료를 별도로 보관
같은 숫자의 가격이 수신되더라도 bids와 asks의 방향 정보가 사라지면 어느 쪽을 갱신할지 알 수 없습니다. 하나의 가격 맵을 공유하는 구조라면 방향까지 키에 포함하는 등 의미를 보존해야 합니다. 삭제 이벤트도 해당 측의 가격대에 적용해야 합니다.
자료를 파일에 저장할 때는 심볼, 연결 세대, 스냅샷 ID, 마지막 적용 ID를 함께 남기면 복원 상태를 판단하기 쉽습니다. 그러나 파일을 불러왔다고 실시간 연결의 연속성이 자동 확보되는 것은 아닙니다. 저장된 상태는 과거 관측이며 현재 사용하려면 누락과 연결 조건을 다시 확인해야 합니다.
원본 기록과 현재 상태를 구분
현재 호가장에서는 삭제된 가격대가 사라지는 것이 맞지만, 진단용 원본 기록에는 어떤 이벤트로 삭제됐는지 남길 수 있습니다. 두 저장소는 목적이 다릅니다. 현재 상태를 이벤트 로그처럼 계속 늘리거나 원본 로그를 현재 상태처럼 해석하면 자료 구조가 혼동됩니다.
원본 기록을 보존할 때는 용량과 보존 기간도 계획해야 합니다. 모든 이벤트를 영구 저장하는 것이 모든 시스템의 정답은 아닙니다. 필요한 진단 범위와 저장 비용을 고려하되, 문제가 발생했을 때 ID 연결과 수량 적용을 재현할 최소 자료가 무엇인지 먼저 정의하는 편이 좋습니다.
화면 갱신 속도와 데이터 처리 속도
화면을 너무 자주 그리면 사용자 인터페이스가 느려질 수 있지만, 표시 주기를 줄인다고 원본 이벤트를 임의로 버려도 되는 것은 아닙니다. 데이터 상태는 순서대로 정확하게 갱신하고 화면은 별도 주기로 최신 상태를 보여주는 구조를 검토할 수 있습니다.
이때 화면의 마지막 갱신 시각과 내부 데이터의 마지막 이벤트 시각을 구분하면 지연 원인을 찾기 쉽습니다. 화면 렌더링이 늦은 것인지 네트워크 수신이 늦은 것인지 알 수 있어야 합니다. 모든 지연을 거래소의 데이터 지연으로 단정하지 않습니다.
소비자가 읽는 순간의 일관성
한 이벤트의 매수·매도 변경을 적용하는 도중 다른 분석 작업이 상태를 읽으면 일부만 갱신된 자료를 볼 수 있습니다. 사용하는 실행 환경에 맞춰 이벤트 적용과 상태 공개의 경계를 정해야 합니다. ID는 새 값인데 일부 가격대는 이전 값인 상태를 정상 스냅샷처럼 제공하지 않도록 주의합니다.
이 설계는 공식 메시지의 의미를 유지하기 위한 클라이언트 측 문제입니다. 특정 프로그래밍 언어나 동시성 도구 하나가 모든 환경의 정답은 아닙니다. 중요한 것은 소비자가 읽은 가격대 묶음과 마지막 업데이트 ID가 같은 처리 단계의 결과인지 확인할 수 있는가입니다.
13. FAQ
Q1. 바이낸스 Order Book Snapshot은 실시간 호가 전체인가요?
한 시점의 제한된 가격대 자료입니다. 이후 상태를 유지하려면 변경 이벤트와 올바르게 연결해야 합니다. 최대 조회 깊이와 초기 범위 밖의 정보 한계도 고려해야 합니다.
Q2. REST 스냅샷만 계속 조회하면 되나요?
목적에 따라 단순 조회는 가능하지만 조회 사이의 모든 변화를 복원하는 것은 아닙니다. 일관된 로컬 호가장을 유지하려면 공식 스트림 연결 절차를 이해해야 합니다. 호출 예산도 함께 고려하세요.
Q3. 왜 스트림을 먼저 연결하나요?
스냅샷을 가져오는 동안 발생하는 변경 이벤트를 버퍼에 모으기 위해서입니다. 스냅샷 이후에 연결하면 그 사이의 자료를 놓칠 수 있습니다. 초기 기준점과 이벤트 범위를 연결하는 검사가 중요합니다.
Q4. U와 u는 같은 필드인가요?
아닙니다. U는 이벤트의 첫 업데이트 ID, u는 마지막 업데이트 ID입니다. 대소문자를 바꾸거나 하나로 합치면 범위 검사 의미를 잃습니다. 스냅샷의 lastUpdateId와도 구분해야 합니다.
Q5. 이벤트 수량을 기존 값에 더하나요?
해당 가격대의 새 수량으로 설정합니다. 증감량처럼 더하는 규칙이 아닙니다. 잘못 더하면 실제보다 큰 호가가 만들어질 수 있으므로 작은 예시로 교체 동작을 확인하세요.
Q6. 수량이 0이면 어떻게 하나요?
해당 가격대를 로컬 호가장에서 제거합니다. 0 수량을 정상적인 최우선 호가처럼 남기지 않습니다. 없는 가격대의 삭제 업데이트도 처리 과정이 무너지지 않도록 해야 합니다.
Q7. U가 로컬 ID+1보다 크면요?
현재 공식 절차는 이벤트 누락으로 보고 로컬 호가장을 버린 뒤 처음부터 다시 시작하도록 안내합니다. ID만 최신으로 바꾸어 누락을 숨기면 자료가 복구되지 않습니다.
Q8. 스냅샷 밖의 가격대는 수량이 0인가요?
모르는 상태일 수 있습니다. 초기 범위 밖의 가격대는 변화가 오기 전까지 수량을 알지 못할 수 있다는 공식 주의가 있습니다. 정보 부재를 0으로 확정하지 마세요.
Q9. 최대 깊이를 받으면 시장을 완전히 알 수 있나요?
공식 스냅샷에는 가격대 수 제한이 있으며 미래 주문이나 숨겨진 구조까지 보여주는 자료가 아닙니다. 관측 가능한 공개 범위와 전체 유동성을 동일하게 보지 않습니다. 계산 결과의 적용 범위를 표시해야 합니다.
Q10. 호가 감소는 모두 체결량인가요?
그렇게 단정할 수 없습니다. 취소·수정 등 다른 변화가 관련될 수 있습니다. 실제 체결을 확인하려면 체결 데이터의 의미를 별도로 읽어야 하며 depth 수량을 거래량처럼 합산하지 않습니다.
Q11. 재연결되면 기존 자료를 계속 써도 되나요?
연결 중단 동안의 누락을 확인해야 합니다. 연결 성공과 상태 동기화 완료는 다릅니다. 공식 초기화 절차로 현재 상태와 이벤트의 연속성을 확보한 뒤 자료 사용 가능 여부를 판단하세요.
Q12. 선물과 같은 절차를 쓰나요?
제품별 공식 문서를 확인해야 합니다. 이 글은 Spot 기준이며 다른 제품의 필드나 초기화 조건을 섞지 않습니다. 비슷한 이름의 depth 이벤트라도 동일한 절차라고 가정하면 안 됩니다.
Q13. 호가로 예상한 가격에 반드시 체결되나요?
아닙니다. 주문 도착 전 호가가 바뀔 수 있고 실제 실행 과정도 영향을 받습니다. 관측 자료를 이용한 비용 추정과 체결 보장은 다릅니다. 자료 범위와 지연의 한계를 함께 고려해야 합니다.
Q14. 업데이트 ID를 시간으로 바꾸면 되나요?
업데이트 순서와 범위를 나타내는 값이며 타임스탬프와 목적이 다릅니다. 시간 단위 변환을 적용하지 않습니다. 이벤트 시각과 로컬 수신 시각은 별도 필드로 관리하세요.
Q15. 다음에는 어떤 데이터를 보면 좋나요?
호가 상태와 대비되는 실제 거래 자료인 Aggregate Trades로 이어집니다. 남아 있는 주문과 이미 발생한 체결을 구분하고, 집계된 거래량과 방향 필드를 올바르게 읽는 데 도움이 됩니다.
14. 운영 체크리스트
- 현물과 다른 제품의 동기화 규칙을 구분했다.
- 스트림 연결 후 이벤트 버퍼링을 시작한다.
- 스냅샷 lastUpdateId와 첫 이벤트 범위를 확인한다.
- 초기 버퍼의 오래된 이벤트를 공식 조건대로 제외한다.
- U와 u를 대소문자까지 구분한다.
- 심볼별 로컬 업데이트 ID를 따로 관리한다.
- 수량은 더하지 않고 새 값으로 설정한다.
- 수량 0의 가격대를 제거한다.
- 누락이 있으면 재초기화한다.
- 연결됨과 동기화 완료를 구분한다.
- 초기 스냅샷 범위 밖의 한계를 표시한다.
- 재연결·버퍼·지연 응답의 경쟁을 점검한다.
- depth 수량과 실제 체결량을 구분한다.
- 비용 추정을 체결 보장으로 표시하지 않는다.
핵심 정리
| 단계 | 중요한 확인 |
|---|---|
| 초기 수신 | 이벤트를 먼저 버퍼링 |
| 스냅샷 | lastUpdateId와 가격대 자료 확보 |
| 연결 | 공식 ID 범위 조건 확인 |
| 갱신 | 수량 교체·0 삭제·ID 업데이트 |
| 장애 | 누락을 숨기지 않고 재동기화 |
| 활용 | 관측 깊이·시각·추정 한계 표시 |
바이낸스 Order Book Snapshot을 제대로 사용하는 핵심은 깊은 자료를 많이 받는 것보다 스냅샷과 변경 이벤트를 일관되게 연결하는 데 있습니다. 현재 상태를 신뢰할 수 있는지 먼저 확인한 뒤 스프레드나 유동성 계산에 활용해야 합니다.
이 글은 시장 데이터 구조를 설명하는 정보성 자료입니다. 특정 주문의 체결 가격이나 투자 성과를 보장하지 않습니다. 실제 구현 전 최신 Binance 공식 문서와 사용하는 제품의 동기화 규칙을 확인하세요.
바이낸스 가입하고 혜택 확인하기+
바이낸스 가입하기
바이낸스 회원가입부터 이메일 인증, KYC, OTP 설정까지 COINSIGN의 단계별 가이드를 확인하면서 진행할 수 있습니다.
바이낸스 가입하기바이낸스 가입방법 8단계 가이드 보기 →