# 재연결과 상태 복구

외부 WS는 연결별 sequence를 제공합니다. 과거 이벤트를 다시 받는 영구 replay cursor는 제공하지 않습니다. 재연결은 이전 연결의 연장이 아니라 새로운 상태 동기화입니다.

## 공개 스트림

1. 연결 종료 또는 데이터 sequence 누락을 감지합니다.
2. 지수 백오프와 jitter를 적용해 새로 연결합니다.
3. 사용 중이던 ticker 구독을 다시 보냅니다.
4. 구독 확인 후 도착하는 현재 ticker부터 상태를 새로 구성합니다.

구독 확인에는 sequence가 없고, 데이터 sequence는 새 연결에서 1부터 시작합니다.

## 개인 스트림

1. 아직 결과를 받지 못한 생성·취소 명령을 **결과 불명** 상태로 기록합니다.
2. 새로운 timestamp와 HMAC 서명으로 개인 스트림에 다시 연결합니다.
3. 첫 프레임이 `snapshot`, `sequence: 0`인지 확인합니다.
4. snapshot으로 주문·잔고 상태를 구성하고, 이후 모든 sequence를 연속 처리합니다.
5. 끊긴 시각을 포함하도록 REST `/v1/fills`를 조회해 누락 체결을 대조합니다. 실시간 `executionId`와 REST `fillId`가 다르므로 두 값을 같은 ID로 조인하지 마세요.
6. 결과 불명 주문은 미체결·주문 이력·체결 이력으로 확인한 후 후속 행동을 결정합니다.

복구 중 발생하는 새 이벤트도 계속 수신·반영해야 합니다. REST 조회가 반환됐다는 이유로 더 최신 WS 상태를 오래된 값으로 덮어쓰지 마세요. snapshot의 `ordersHasMore`가 true이면 잘린 주문 집합을 전체 상태로 간주하지 않습니다.

## 재접속해도 해결되지 않는 오류

| 상황 | 다음 행동 |
| --- | --- |
| INVALID_API_KEY, NO_PERMISSION, close 1008 | 키·권한 확인 후 필요하면 재발급 |
| INVALID_SIGNATURE | 서명할 경로·쿼리·본문 바이트 확인 |
| TIMESTAMP_OUT_OF_RANGE | 호스트 시간 동기화와 receive window 확인 |
| 업그레이드 HTTP 404 | 외부 호스트 `api-ws.btxpro.co.kr`와 스트림 경로 확인 |
| close 1013 / EVENT_BUFFER_OVERFLOW | 수신 처리 속도 개선 후 새 snapshot 구성 |
| 명령 ENGINE_TIMEOUT | 주문 결과 대조. 동일 명령 자동 재전송 금지 |

인증 오류를 무한 재접속으로 처리하지 마세요. HTTP 업그레이드와 WS 명령 모두 IP 기준 예산을 소비합니다.

## Go SDK의 차이

`StreamTickers`·`StreamUser`의 `Reconnect: true`는 연결·sequence 오류에 백오프 재연결을 수행합니다. 개인 스트림은 새 snapshot을 받습니다. 인증·콜백 오류는 종료됩니다.

양방향 `OpenUserStream` 세션은 자동으로 재연결하거나 주문 명령을 다시 보내지 않습니다. 호출자가 새 세션을 열고 상태를 대조해야 합니다.
