바이낸스
바이낸스 Client Order ID 뜻 2026|주문 식별·재시도·중복 주문 관리
newClientOrderId·clientOrderId·origClientOrderId·orderId의 차이를 정리합니다. 응답 유실, 재시작, 취소·수정 이력과 중복 주문을 줄이기 위한 기록 흐름을 설명합니다.

바이낸스 Client Order ID 뜻 2026|주문 식별·재시도·중복 주문 관리
바이낸스 Client Order ID는 클라이언트가 주문을 추적하는 데 사용하는 주문 식별 문자열입니다. 거래소가 부여하는 orderId와 구분하며, 계정 UID나 블록체인 TxID와도 다른 값입니다. 자동 주문에서는 “어떤 거래 의사로 보낸 요청이 어떤 실제 주문이 되었는가”를 연결할 때 중요합니다.
응답을 받지 못했다고 주문이 접수되지 않았다고 단정할 수 없는 상황이 있습니다. 이때 주문 식별자를 남기지 않았다면 같은 주문을 다시 보낼지, 기존 주문을 조회할지 결정하기 어려워집니다. Client Order ID는 이런 추적을 돕지만, 값 하나만 넣으면 모든 중복 주문이 자동으로 방지되는 기능은 아닙니다.
이 글은 Binance Spot REST API의 newClientOrderId, clientOrderId, origClientOrderId와 주문 조회 흐름을 설명합니다. 2026년 10월 27일 공식 문서를 확인했으며, 취소·수정·주문 목록에서는 필드의 역할이 달라질 수 있다는 점을 구분합니다. 실제 계정 주문을 실행하는 튜토리얼이 아니라 설계와 진단을 위한 안내입니다.
먼저 식별자 네 가지를 나누기
| 이름 | 역할 | 주의점 |
|---|---|---|
| newClientOrderId | 새 주문 등에 지정하는 클라이언트 식별자 | 엔드포인트별 의미 확인 |
| clientOrderId | 응답에서 확인하는 클라이언트 주문 식별자 | 요청값·실제 응답 연결 |
| origClientOrderId | 기존 주문을 조회·취소할 때 지정하는 값 | 원래 대상 주문을 가리킴 |
| orderId | 거래소가 부여하는 주문 ID | 심볼·계정 맥락과 함께 보관 |
취소 요청의 newClientOrderId는 새 매수·매도 주문을 만든다는 뜻이 아닐 수 있습니다. 필드 이름에 new가 있다고 모든 요청에서 “새 거래 주문 번호”라고 해석하면 혼동이 생깁니다. 메서드와 경로를 먼저 보고 그 안의 파라미터 의미를 읽는 것이 기본입니다.
1. Client Order ID가 필요한 이유
거래 의사와 네트워크 요청은 다르다
전략이 “이 조건에서 한 번 주문한다”고 결정한 것과 HTTP 요청을 보낸 것은 서로 다른 사건입니다. 네트워크가 끊기면 같은 거래 의사를 전달하기 위해 여러 통신 시도가 생길 수 있습니다. 이를 모두 새로운 주문 의사로 처리하면 중복 실행 위험이 생깁니다.
내부 작업 ID와 clientOrderId를 연결해 두면 어떤 작업에서 어떤 주문을 보내려 했는지 추적할 수 있습니다. 이후 거래소 응답의 orderId까지 저장하면 내부 판단, 전송 시도, 실제 주문을 이어서 볼 수 있습니다. 이것은 클라이언트의 운영 설계이며 거래소가 모든 내부 작업 상태를 대신 저장한다는 뜻은 아닙니다.
사람이 화면에서 주문 목록을 볼 때도 주문 번호가 필요하듯, 자동화에는 기계가 일관되게 찾을 수 있는 식별자가 필요합니다. 시간과 가격만으로 주문을 추정하면 같은 시각에 비슷한 주문이 여러 개 있을 때 구분하기 어렵습니다. 식별자는 이런 애매함을 줄이는 데 쓰입니다.
순서 번호와 비밀값은 다르다
Client Order ID는 인증 비밀이나 비밀번호가 아닙니다. 그렇다고 이메일, 전화번호, 고객 이름 같은 개인정보를 넣어야 하는 것도 아닙니다. 외부 로그와 응답에 나타날 수 있는 값이므로, 불필요한 민감 정보 없이 주문을 구별할 수 있는 형식을 선택하는 편이 좋습니다.
전략의 내부 의미를 지나치게 자세히 담으면 로그 공유 시 운영 정보가 노출될 수 있습니다. 필요한 구분자만 포함하고, 자세한 설명은 접근이 제한된 내부 기록에 연결할 수 있습니다. 식별자 하나를 사람이 읽기 쉬운 보고서 전체처럼 만들 필요는 없습니다.
2. 공식 문서에서 확인한 기본 규칙
Spot REST API 공식 문서의 신규 주문 파라미터는 newClientOrderId를 열린 주문 사이에서 고유한 ID로 설명하고, 보내지 않으면 자동 생성한다고 안내합니다. 같은 ID를 다시 사용한 주문의 수락 조건도 해당 신규 주문 항목에서 확인해야 합니다.
현재 문서는 같은 newClientOrderId의 이전 주문이 체결된 경우에 다시 수락될 수 있다는 조건을 제시합니다. 이 점 때문에 clientOrderId를 영구적인 “한 번만 실행” 보장 장치로 해석해서는 안 됩니다. 재사용 가능성과 클라이언트의 중복 방지 요구는 서로 다른 문제입니다.
실무 설계에서는 한 번 사용한 식별자를 장기간 다시 쓰지 않는 정책을 고려할 수 있습니다. 이는 추적을 쉽게 하기 위한 클라이언트의 권장 설계이지, 거래소가 모든 과거 ID의 영구 재사용을 금지한다는 설명은 아닙니다. 공식 수락 조건과 자체 기록 정책을 구분해서 문서화하세요.
자동 생성에 맡길 때 생기는 고려 사항
ID를 생략해 자동 생성하도록 할 수 있지만, 응답을 받지 못한 상황에서는 생성된 값을 즉시 알지 못할 수 있습니다. 따라서 실패 복구와 추적 요구가 큰 프로그램은 전송 전에 식별자를 정하고 저장하는 방식이 유용할 수 있습니다.
그렇다고 자동 생성 방식이 잘못된 기능이라는 뜻은 아닙니다. 사용 환경과 복구 절차에 따라 선택할 수 있습니다. 중요한 것은 어떤 방식을 쓰든 응답 유실, 프로그램 재시작, 주문 조회가 필요한 경우를 미리 설계하는 것입니다.
3. orderId와 함께 저장해야 하는 이유
orderId는 거래소가 주문에 부여하는 식별자이고 clientOrderId는 클라이언트가 지정할 수 있는 식별자입니다. 둘 중 하나만 모든 상황을 대표한다고 가정하기보다 응답에서 확인한 값을 함께 보관하면 조회와 원인 분석에 도움이 됩니다.
여기에 symbol과 계정·환경 구분도 필요합니다. 테스트 환경에서 만든 기록을 운영 계정의 주문과 혼동하거나, 서로 다른 거래쌍의 숫자 ID를 맥락 없이 비교하지 않도록 합니다. 데이터베이스의 기본키 설계는 사용하는 API의 식별 범위를 고려해야 합니다.
내부 작업 ID, clientOrderId, orderId를 한 칸에 번갈아 덮어쓰면 어느 시점부터 값의 의미가 바뀌었는지 알기 어렵습니다. 각각 별도 필드로 저장하고 연결 관계를 남기는 편이 낫습니다. 수동으로 문제를 조사하는 사람도 같은 용어로 기록을 읽을 수 있어야 합니다.
| 기록 항목 | 저장 목적 |
|---|---|
| 내부 작업 ID | 전략이 결정한 한 번의 작업 추적 |
| 전송 시도 ID | 네트워크 요청 시도 구분 |
| clientOrderId | 요청 전후 주문 연결 |
| orderId | 거래소가 확인한 주문 추적 |
| symbol·계정·환경 | 식별자 해석의 맥락 유지 |
| 상태·확인 시각 | 마지막으로 검증한 사실 표시 |
4. 전송 전에 해야 할 일
거래 의사를 먼저 기록
전송 직전에 clientOrderId만 메모리에 만들고 응답 뒤에 저장하는 구조는 프로그램이 중간에 종료되면 기록이 사라질 수 있습니다. 전송하려는 작업과 식별자를 먼저 지속적으로 남기고, 실제 요청 상태를 단계적으로 갱신하는 방식을 검토하세요.
예를 들어 준비됨, 전송 중, 결과 확인 필요, 접수 확인, 종료 확인 같은 내부 상태를 둘 수 있습니다. 이는 Binance의 공식 주문 상태 이름이 아니라 프로그램의 운영 상태입니다. 공식 NEW·FILLED·CANCELED 등과 섞어 같은 필드에 넣지 않는 편이 명확합니다.
최신 거래 조건을 따로 확인
식별자가 고유하다고 주문이 적절한 것은 아닙니다. 가격·수량·잔고·심볼 상태·필터·시간 유효성 등 주문의 다른 조건도 확인해야 합니다. Client Order ID는 주문 내용을 검증하거나 수익성을 평가하는 기능이 아닙니다.
장시간 큐에 대기한 작업이라면 식별자를 보존하면서도 거래 의사를 다시 평가할 필요가 있습니다. 오래된 작업에 새 ID만 붙여 보내면 추적은 가능해도 판단 자체가 낡았을 수 있습니다. 시간 관리와 식별자 관리를 함께 보되 서로 대신한다고 생각하지 않습니다.
동시 실행 충돌을 점검
여러 프로세스가 같은 초의 시각만으로 ID를 만들면 충돌할 수 있습니다. 서로 다른 서버가 같은 생성 규칙을 쓰는지, 재시작 후 순번이 초기화되는지, 작업 복제 시 ID가 복사되는지 확인합니다. 형식이 보기 좋다는 것보다 충돌을 통제할 수 있는지가 중요합니다.
구체적인 길이·문자 규칙은 사용하는 엔드포인트의 현재 규격을 확인해야 합니다. 다른 제품에서 허용된 형식을 현물에도 그대로 복사하지 마세요. 이 글은 확인하지 않은 문자 수 한도를 임의로 제시하지 않습니다.
5. 응답을 받은 뒤의 처리
정상 응답에서는 실제 clientOrderId와 orderId가 예상한 작업과 연결되는지 확인합니다. 요청을 보냈다는 사실만 저장하고 응답의 식별자를 버리면 나중에 조회 결과를 연결하기 어렵습니다. 특히 여러 주문을 병렬 처리할 때는 응답 순서만으로 대응시키지 않는 것이 좋습니다.
주문 접수는 전량 체결과 다릅니다. 응답에서 주문 식별자를 확인했다고 바로 “거래 완료”로 기록하면 부분 체결이나 미체결 상태를 놓칩니다. 접수 상태, 누적 체결량, 최종 종료 상태를 구분해서 저장해야 합니다.
REST 응답과 User Data Stream의 주문 업데이트를 함께 사용하는 경우에는 동일 주문으로 합칠 수 있어야 합니다. 두 경로에서 같은 체결을 보았다고 체결량을 두 번 더하지 않도록 설계합니다. 주문 식별자는 데이터 연결의 기준 중 하나이며, 개별 체결 식별과 이벤트 처리도 별도로 필요합니다.
6. 응답을 받지 못한 경우의 복구
공식 REST 문서는 처리 시간 초과가 Matching Engine에서의 실패를 항상 의미하지 않는다고 설명합니다. 따라서 통신 실패를 받았다는 이유만으로 새로운 주문을 즉시 생성하는 것은 신중해야 합니다.
먼저 결과 불명확 상태를 기록합니다. 원래 요청의 clientOrderId, symbol, 전송 시각, 내부 작업 ID를 보존하고, 공식 주문 조회 또는 User Data Stream에서 결과를 확인하는 흐름을 사용합니다. 이미 확인된 사실과 아직 모르는 사실을 분리하면 복구 판단이 쉬워집니다.
조회 결과가 바로 보이지 않는 상황도 고려해야 합니다. 한 번의 조회 실패를 모든 경우에 미접수 확정으로 바꾸지 않고, 오류 메시지와 데이터 출처·계정·환경을 확인합니다. 이 글은 특정 대기 시간 후 미접수를 확정할 수 있다는 보장 규칙을 만들지 않습니다.
재시도와 새 주문은 다르다
같은 거래 의사의 통신 복구인지, 새롭게 판단한 별도 주문인지 먼저 구분합니다. 새로운 ID를 발급했다고 과거의 불명확한 요청이 사라지는 것은 아닙니다. 오히려 두 주문 사이의 연결을 잃어 조사하기 어려워질 수 있습니다.
반대로 같은 ID를 다시 쓰면 영구적으로 중복이 막힌다고 기대하는 것도 잘못입니다. 공식 재사용 조건을 고려하면 ID 하나만으로 모든 시점의 멱등성이 보장된다고 볼 수 없습니다. 내부 작업 기록과 거래소 상태 대조가 함께 필요합니다.
7. 조회와 취소에서 필드 읽기
주문을 조회하거나 취소할 때는 orderId 또는 origClientOrderId를 사용하는 경로가 있습니다. 정확히 어떤 조합이 필요한지는 각 엔드포인트 설명을 따릅니다. 이름이 비슷하다는 이유로 신규 주문의 newClientOrderId를 대상 조회 필드처럼 넣으면 안 됩니다.
일부 경로는 두 식별자를 함께 제공했을 때의 검색 순서나 일치 조건을 설명합니다. 따라서 둘을 모두 보내면 더 확실하다고 무작정 추가하지 않습니다. 저장된 두 값이 같은 주문을 가리키는지 검증한 뒤 해당 경로의 규칙대로 요청해야 합니다.
취소 요청은 원래 주문을 가리키는 값과 취소 자체를 식별하는 값이 함께 등장할 수 있습니다. 취소 응답의 clientOrderId를 새 거래 주문 ID처럼 해석하지 않도록 원본과 취소 이력을 연결하세요. 동일한 필드 이름도 작업 맥락에 따라 역할을 확인해야 합니다.
취소되면 과거 체결이 없어지는가
주문 취소는 이미 발생한 체결을 되돌리는 기능이 아닙니다. 일부 체결된 주문을 취소했다면 누적 체결량과 취소된 잔량을 함께 봐야 합니다. Client Order ID를 바꾸거나 취소 이력을 새로 만들었다고 과거 거래 기록이 사라지는 것은 아닙니다.
따라서 내부 원장에서는 “취소”라는 상태 하나만 저장하지 말고 실제 체결량과 수수료 기록도 연결합니다. 취소 요청과 체결 이벤트가 가까운 시점에 발생하면 마지막으로 확인한 주문 상태를 다시 대조할 필요가 있습니다. 이벤트 도착 순서만으로 거래소의 최종 상태를 추정하지 마세요.
8. 수정과 Cancel Replace의 식별자
Order Amend Keep Priority는 기존 주문의 수량을 줄이는 수정과 관련되고, Cancel Replace는 취소와 새 주문 제출을 묶는 흐름입니다. 두 기능의 식별자 관계를 동일하게 취급하면 원래 주문과 새 주문의 이력이 엉킬 수 있습니다.
현재 수정 경로 문서는 수정 후 새 clientOrderId를 지정하는 옵션과 현재 값을 다시 사용할 수 있는 조건을 안내합니다. 이런 기능을 쓰면 한 거래소 주문의 시간별 클라이언트 식별자가 달라질 수 있다는 점을 기록 구조에 반영해야 합니다. 이전 값을 단순 삭제하지 말고 이력으로 연결하세요.
Cancel Replace에서는 취소 대상과 새 주문 대상을 분리해서 추적합니다. 일부 단계만 성공하는 경우를 고려해야 하므로 응답 전체를 하나의 성공·실패 값으로 압축하지 않는 편이 좋습니다. 취소 실패 또는 신규 주문 실패가 각각 무엇을 의미하는지 실제 응답으로 확인합니다.
이 글의 목적은 해당 기능의 모든 실행 규칙을 다시 설명하는 것이 아니라 식별자 연결을 잃지 않는 기준을 제시하는 것입니다. 수량 수정과 가격 변경, 우선순위, 부분 실패 조건은 각각의 최신 공식 기능 문서를 확인해야 합니다.
9. 다섯 가지 사례
예시 1: 응답이 유실된 첫 주문
프로그램이 작업 A에 식별자 A001을 배정하고 전송했지만 응답을 받지 못했다고 가정합니다. 로컬 기록에 A001이 남아 있다면 원래 주문을 확인하는 출발점이 생깁니다. 이때 A002라는 새 값을 만들어 같은 내용의 주문을 즉시 보내는 것은 원래 주문의 존재 여부를 해결하지 않습니다.
우선 A001과 심볼·계정·전송 시각을 사용해 결과를 대조합니다. 확인된 주문이 있다면 해당 주문 상태를 이어서 관리합니다. 확인이 끝나지 않았다면 불명확 상태를 유지하고, 새로운 거래 의사를 실행할지 판단하는 절차와 분리해야 합니다.
예시 2: 재시작 후 순번이 다시 1부터 시작
ID를 단순히 ORDER-1, ORDER-2처럼 메모리의 숫자로 만들고 재시작 시 1로 돌아가는 프로그램을 생각해 보겠습니다. 이전 주문과 새 주문의 기록이 충돌하거나, 동일 ID 요청이 거절되거나, 이후 조회 이력이 혼동될 수 있습니다.
지속적으로 보관되는 생성 상태나 충돌 가능성을 통제하는 다른 방식을 검토합니다. 어떤 형식을 선택하든 실제 API의 허용 규격을 확인해야 합니다. 예쁜 문자열보다 재시작·다중 서버·복구 상황에서도 의미가 유지되는 설계가 중요합니다.
예시 3: 이전 주문이 이미 체결된 뒤 같은 ID 재사용
공식 신규 주문 문서는 같은 ID의 이전 주문이 체결된 경우 재수락될 수 있는 조건을 설명합니다. 따라서 “예전에 이 ID를 보냈으니 같은 ID는 절대 새 주문이 될 수 없다”는 가정은 위험합니다. 영구적인 중복 방지 장치로 읽을 수 없는 이유입니다.
클라이언트는 내부 작업 A가 이미 실행 완료됐는지 별도로 기록해야 합니다. 같은 작업이 다시 들어왔다면 거래소의 거절에만 의존하지 않고 자체 상태를 먼저 확인합니다. 이 설계는 거래소의 ID 규칙을 대체하는 것이 아니라 그 위에서 작업 중복을 관리하는 것입니다.
예시 4: 부분 체결 뒤 취소
수량 10의 가상 주문에서 4가 체결된 뒤 나머지를 취소했다고 가정합니다. 주문 식별자는 전체 주문을 찾는 기준이지만, 체결량 4와 취소된 잔량 6은 다른 사실입니다. 취소 응답만 보고 주문 전체가 없었던 일이 됐다고 기록해서는 안 됩니다.
원래 주문 ID, 취소 이력, 개별 체결 기록을 연결합니다. 이후 잔고나 손익을 대조할 때도 실제 체결된 부분을 반영해야 합니다. 여기서 숫자는 단순 예시이며 실제 수량 단위와 수수료는 해당 거래쌍과 체결 내역으로 확인합니다.
예시 5: REST 응답과 스트림 이벤트가 모두 도착
REST 응답으로 접수를 확인한 뒤 같은 주문의 executionReport가 도착했다고 가정합니다. 두 메시지는 별개의 두 주문이 아니라 하나의 주문을 서로 다른 경로에서 알리는 것일 수 있습니다. 식별자를 통해 같은 주문에 연결해야 합니다.
체결 이벤트도 중복 처리 여부를 관리해야 합니다. clientOrderId만으로 개별 체결을 모두 구분하려고 하면 하나의 주문에서 여러 체결이 발생한 상황을 표현하기 어렵습니다. 주문 식별과 체결·실행 식별을 나눠 설계하는 것이 다음 단계입니다.
10. 내부 원장과 상태 모델
주문 원장에는 “보내려고 함”과 “접수 확인됨”을 구분할 수 있는 상태가 필요합니다. 로그에 전송 함수가 실행됐다는 기록이 있다고 서버 접수를 확정할 수는 없습니다. 실제 응답이나 조회 결과로 확인한 시각을 별도로 남기는 편이 좋습니다.
또한 최종 상태라고 생각했던 값이 뒤늦은 데이터와 충돌할 때 처리할 정책이 필요합니다. 오래된 이벤트가 늦게 도착했는지, 로컬 반영이 중복됐는지, 다른 환경의 데이터를 읽었는지 확인합니다. 단순히 마지막으로 도착한 메시지를 무조건 최신 상태로 덮어쓰는 구조는 재검토할 필요가 있습니다.
운영자에게 보여주는 문구도 중요합니다. “실패” 대신 “응답 미수신·주문 확인 필요”라고 구체적으로 표시하면 불필요한 재주문을 줄이는 데 도움이 됩니다. 이는 사용자에게 불안을 주기 위한 표현이 아니라 현재 아는 사실의 범위를 정확히 전달하는 방법입니다.
보관할 최소 연결 관계
| 연결 | 확인 목적 |
|---|---|
| 작업 → 전송 시도 | 하나의 의사에 몇 번 통신했는지 |
| 전송 시도 → clientOrderId | 원래 주문을 무엇으로 찾을지 |
| clientOrderId → orderId | 거래소가 확인한 주문과 연결 |
| 주문 → 체결 목록 | 실제 실행량과 비용 확인 |
| 주문 → 수정·취소 이력 | 식별자와 상태 변화 추적 |
이 관계는 도구나 프로그래밍 언어와 무관하게 생각해 볼 수 있습니다. 작은 프로그램이라도 파일이나 데이터베이스에 일관되게 보관하면 복구에 도움이 됩니다. 다만 저장 성공과 전송 사이의 장애까지 고려해야 하므로 구현을 실제 운영 환경에서 검증해야 합니다.
11. 자주 하는 실수
첫 번째는 ID를 주문의 성공 여부로 오해하는 것입니다. 요청에 식별자가 있다는 사실은 추적 가능한 이름을 붙였다는 뜻이지 접수·체결을 보장하지 않습니다. 실제 상태를 확인하는 절차는 여전히 필요합니다.
두 번째는 재시도마다 무조건 새 ID를 발급하는 것입니다. 새 ID는 새로운 요청을 구분하는 데 편리할 수 있지만, 원래 거래 의사와 연결이 끊기면 중복 원인을 찾기 어렵습니다. 작업 식별자와 전송 시도 식별자를 따로 두면 이런 혼동을 줄일 수 있습니다.
세 번째는 같은 ID를 다시 쓰면 절대 중복되지 않는다고 믿는 것입니다. 공식 수락 조건은 영구적인 멱등성 약속과 다릅니다. 이미 체결된 주문, 수정으로 바뀐 클라이언트 ID, 여러 환경의 기록 등을 고려해야 합니다.
네 번째는 취소 요청의 필드 이름을 신규 주문과 똑같이 읽는 것입니다. 어떤 값을 대상으로 삼고 어떤 값을 새 이력의 식별자로 쓰는지 경로별 설명을 확인하세요. 이름만 외우는 것보다 요청·응답의 역할을 이해하는 것이 중요합니다.
복구 절차를 검토할 때의 추가 질문
저장과 전송 사이에서 프로그램이 종료되면
전송 전 기록을 남겼지만 실제 요청은 나가지 않은 경우와, 요청은 나갔지만 응답 기록 전에 종료된 경우는 로컬 파일만 보면 비슷하게 보일 수 있습니다. 따라서 저장 상태를 무조건 접수 사실로 취급하지 말고, 복구 때 거래소의 실제 주문 상태와 대조해야 합니다. 전송 전 기록은 확인의 출발점이지 접수 증명서는 아닙니다.
복구 절차는 한 방향으로만 진행되도록 설계하는 편이 명확합니다. 먼저 미확인 작업을 모으고, 원래 식별자와 환경을 확인하고, 공식 조회 결과를 연결한 다음에 새 행동을 판단합니다. 파일에 미완료라고 적혀 있다는 이유만으로 모든 작업을 다시 보내는 방식은 피해야 합니다.
운영자가 수동으로 다시 실행했을 때
자동 재시도뿐 아니라 사람이 화면에서 다시 실행 버튼을 누르는 상황도 고려해야 합니다. 화면에 원래 작업과 주문 확인 상태가 보이지 않으면 사용자는 실패했다고 생각해 새 주문을 만들 수 있습니다. 결과 불명확 상태를 구체적으로 표시하고 관련 식별자를 확인할 수 있게 만드는 것이 중요합니다.
다시 실행이 같은 거래 의사의 복구인지 별도 판단으로 만든 신규 주문인지 기록해야 합니다. 두 경우가 같은 버튼으로 처리되더라도 내부 이력에서는 구분할 수 있어야 합니다. 이 기록은 사후 책임을 돌리기 위한 것이 아니라 실제 계정의 주문이 왜 두 개 생겼는지 설명하기 위한 자료입니다.
주문 목록과 개별 주문의 식별자를 구분
OCO나 다른 주문 목록 기능에서는 목록 식별자와 구성 주문의 식별자가 함께 등장할 수 있습니다. 부모 목록을 찾는 값과 개별 주문을 찾는 값을 같은 칸에 넣지 않는 것이 좋습니다. 하나의 목록에서 여러 주문이 관리되는 구조라면 목록 상태와 각 주문의 체결 상태도 별도로 추적해야 합니다.
이 글의 일반 신규 주문 예시를 모든 주문 목록 파라미터에 그대로 적용하지 마세요. listClientOrderId처럼 목적이 다른 이름이 있다면 해당 경로의 문서를 확인합니다. 목록 전체가 종료됐다는 사실과 각 구성 주문이 어떤 방식으로 종료됐는지는 다른 질문입니다.
로그 보관 기간과 검색 가능성
식별자를 저장해도 나중에 찾을 수 없다면 복구 효과가 줄어듭니다. 내부 작업 ID로 검색했을 때 전송 시도, 응답, 조회 결과, 수정·취소 이력이 연결되는지 확인해 보세요. 여러 파일에 흩어진 기록을 시간순으로만 정렬하는 것보다 명시적인 연결 관계가 도움이 됩니다.
보관 기간과 접근 권한은 계정 자료의 민감도를 고려해 정해야 합니다. 모든 과거 주문을 무제한 공개 저장할 필요는 없습니다. 필요한 운영 기록을 보호된 위치에 보관하고 외부 문의 시에는 인증 정보와 개인정보를 제거한 최소 자료만 공유하세요.
복구가 끝났다는 판단
원래 주문을 찾았다는 것만으로 복구가 끝난 것은 아닐 수 있습니다. 그 주문이 현재 열려 있는지, 일부 체결됐는지, 이미 종료됐는지 확인하고 내부 원장을 맞춰야 합니다. 수량·수수료·상태를 대조한 뒤 해당 작업의 확인이 완료됐다고 기록하는 것이 명확합니다.
여러 전략이 같은 계정을 사용할 때
서로 다른 전략이 같은 계정에 주문을 내면 각 전략의 로컬 목록만으로 계정 전체를 설명하기 어렵습니다. 식별자 생성과 기록 규칙이 충돌하지 않는지 확인하고, 어느 전략이 만든 주문인지 내부 연결 정보를 남기는 것이 좋습니다. 이때 전략 구분자를 넣었다는 이유로 거래소가 그 주문들을 별도 계정처럼 취급한다고 생각해서는 안 됩니다.
한 전략이 다른 전략의 주문을 실수로 조회·취소 대상으로 잡지 않도록 대상 식별과 권한 범위를 점검합니다. 공통 계정 상태를 읽는 기능과 개별 전략의 주문을 변경하는 기능은 목적이 다릅니다. 기록을 공유하더라도 실제 변경 동작은 사용자가 승인한 범위 안에서만 이루어져야 합니다.
사람이 읽는 이름과 기계 식별자를 분리
사용자 화면에는 “오전 실행 작업”처럼 이해하기 쉬운 이름을 보여주고, 내부에서는 별도의 안정적인 식별자를 사용할 수 있습니다. 사람이 제목을 바꿨다고 주문의 추적 키까지 바뀌면 과거 이력을 찾기 어려워집니다. 표시 이름과 식별자의 수명을 구분하는 설계가 도움이 됩니다.
외부 문의에 주문을 설명할 때도 주문 ID와 심볼, 확인 시각을 정확히 구분해 전달해야 합니다. 인증 비밀이나 전체 계정 자료를 붙일 필요는 없습니다. 어떤 주문을 조사하는지 식별할 수 있는 최소 정보를 선택하고, 실제 지원 채널이 요구하는 절차를 따릅니다.
12. FAQ
Q1. 바이낸스 Client Order ID와 orderId는 같은가요?
아닙니다. clientOrderId는 클라이언트가 지정할 수 있는 식별자이고 orderId는 거래소가 부여하는 주문 ID입니다. 응답에서 둘을 함께 보관하면 내부 작업과 실제 주문을 연결하는 데 도움이 됩니다.
Q2. newClientOrderId는 필수인가요?
현재 Spot 신규 주문 문서는 생략 시 자동 생성한다고 안내합니다. 다만 응답 유실 시의 추적 요구를 고려해 선택해야 합니다. 생략할 수 있다는 사실이 복구 기록이 필요 없다는 뜻은 아닙니다.
Q3. UID나 TxID를 넣으면 되나요?
UID는 계정 식별, TxID는 블록체인 거래 추적 등 다른 목적의 값입니다. 주문 식별자를 대신하는 것으로 사용하지 않습니다. 불필요한 개인정보나 외부 식별자를 포함하지 않는 자체 형식을 검토하세요.
Q4. 같은 ID면 주문이 두 번 실행되지 않나요?
영구적으로 한 번만 실행된다고 보장할 수 없습니다. 공식 신규 주문의 재사용 수락 조건과 내부 작업 중복 관리는 다릅니다. 원래 주문 상태와 내부 완료 기록을 함께 확인해야 합니다.
Q5. 응답을 못 받으면 새 ID로 다시 보내면 되나요?
먼저 원래 주문의 존재와 상태를 확인해야 합니다. 응답 유실은 미접수 확정과 다를 수 있습니다. 새로운 ID는 원래 주문을 없애지 않으므로 결과 불명확 상태를 분리해서 관리하는 편이 중요합니다.
Q6. origClientOrderId는 언제 쓰나요?
기존 주문을 조회하거나 취소하는 경로에서 대상 주문의 clientOrderId를 지정할 때 사용됩니다. 정확한 필수 조건과 orderId와의 조합은 각 엔드포인트 문서를 확인해야 합니다.
Q7. 취소 요청의 newClientOrderId는 새 주문인가요?
항상 그렇지 않습니다. 취소를 식별하는 값으로 설명되는 경로가 있습니다. new라는 단어만 보고 새 거래 주문이 생성된다고 해석하지 말고 요청의 메서드·경로와 파라미터 설명을 함께 읽으세요.
Q8. 시간만 붙여 ID를 만들면 충분한가요?
동일 시각에 여러 프로세스가 생성하거나 재시작 후 값이 반복될 수 있는지 확인해야 합니다. 시간 문자열만으로 충돌이 없다고 단정하지 않습니다. 허용 규격 안에서 충돌과 재사용을 통제할 수 있어야 합니다.
Q9. ID에 전략 이름을 넣어도 되나요?
해당 규격이 허용하는 범위에서 설계할 수 있지만 내부 전략 정보나 개인정보가 불필요하게 노출되지 않도록 주의합니다. 자세한 의미는 내부 기록과 연결하고 외부 식별자는 간결하게 유지하는 방법도 있습니다.
Q10. 수량 수정 뒤에도 ID는 그대로인가요?
사용하는 수정 경로와 지정한 파라미터에 따라 확인해야 합니다. 현재 Order Amend Keep Priority 경로는 수정 후 clientOrderId 관련 옵션을 안내합니다. 이전·이후 식별자를 이력으로 남기는 것이 추적에 도움이 됩니다.
Q11. 취소하면 체결 기록도 없어지나요?
아닙니다. 이미 발생한 체결은 별도로 남습니다. 부분 체결 후 취소라면 실제 체결량과 취소된 잔량을 구분해야 하며, 식별자 변경이 과거 거래를 되돌리는 것은 아닙니다.
Q12. REST와 스트림의 같은 주문을 두 개로 저장해도 되나요?
원본 메시지는 따로 보관할 수 있지만 주문 상태는 동일 주문으로 연결해야 합니다. 같은 체결을 두 번 합산하지 않도록 주문 식별과 체결 식별을 나누고 중복 처리 정책을 마련하세요.
Q13. 조회에서 주문을 못 찾으면 미접수인가요?
한 번의 조회 실패만으로 모든 경우에 단정하지 않습니다. 계정·환경·심볼·식별자 값과 실제 오류를 확인해야 합니다. 결과가 불명확한 상황을 명시적으로 기록하고 공식 조회 절차로 대조하세요.
Q14. API Secret을 ID 안에 넣어도 되나요?
넣지 않아야 합니다. 식별자는 인증 비밀을 담는 곳이 아니며 응답과 로그에 나타날 수 있습니다. 주문 추적에 필요한 비민감한 값만 사용하고 Secret은 별도로 보호해야 합니다.
Q15. 다음으로 연결되는 개념은 무엇인가요?
executionReport입니다. Client Order ID로 주문을 찾은 뒤에는 접수·부분 체결·취소·만료 등 상태 변화를 읽어야 합니다. 이벤트 종류와 누적 체결량을 구분하면 실제 실행 결과를 더 정확히 관리할 수 있습니다.
13. 실전 체크리스트
- 내부 작업 ID와 거래소 주문 식별자를 분리했다.
- 전송 전에 clientOrderId와 작업을 저장한다.
- 계정·환경·symbol을 함께 보관한다.
- 현재 엔드포인트의 허용 형식과 재사용 조건을 확인했다.
- 재시작과 다중 서버에서 충돌 가능성을 검토했다.
- 접수 확인과 전량 체결을 구분한다.
- 응답 미수신을 결과 불명확으로 기록할 수 있다.
- 새 주문 전 원래 주문 조회 절차가 있다.
- 취소·수정의 이전·이후 식별자를 연결한다.
- 부분 체결량을 취소 상태와 별도로 보관한다.
- REST와 스트림의 중복 반영을 방지한다.
- 개별 체결과 주문 전체의 식별을 구분한다.
- ID에 개인정보나 인증 비밀을 넣지 않는다.
- 복구 후 실제 주문·체결 내역을 대조한다.
핵심 정리
| 핵심 질문 | 판단 기준 |
|---|---|
| 무엇을 위한 값인가 | 클라이언트와 거래소 주문을 연결하는 추적 |
| 성공을 보장하는가 | 식별과 접수·체결은 별개 |
| 중복 방지에 충분한가 | 내부 작업 기록과 상태 확인도 필요 |
| 응답 유실 뒤 첫 행동 | 원래 식별자로 결과 확인 |
| 취소·수정에서 중요한 것 | 대상과 새 이력의 식별자 구분 |
바이낸스 Client Order ID는 주문에 이름을 붙이는 기능에서 시작하지만, 운영에서는 재시도와 복구를 이해하는 연결점이 됩니다. 고유한 문자열을 만드는 것에서 끝내지 말고, 그 문자열이 어떤 거래 의사와 실제 주문·체결을 가리키는지 끝까지 추적해야 합니다.
이 글은 API와 주문 기록 구조에 대한 정보성 설명입니다. 주문 실행·복구 결과를 보장하지 않으며, 실제 운영 전 최신 Binance 공식 문서와 사용하는 도구의 동작을 확인하세요.
바이낸스 가입하고 혜택 확인하기+
바이낸스 가입하기
바이낸스 회원가입부터 이메일 인증, KYC, OTP 설정까지 COINSIGN의 단계별 가이드를 확인하면서 진행할 수 있습니다.
바이낸스 가입하기바이낸스 가입방법 8단계 가이드 보기 →