개념
두 요구가 동시에 빠듯하다
레슨 2 에서 원장 정합성을, 모듈 51 에서 성능 시험 심화를 다뤘다. 주문·체결 시스템은 그 둘이 동시에 걸리는 드문 환경이다.
- 정합성 — 주문 한 건이 중복 체결되거나 사라지면 즉시 금전 사고다
- 시간 — 장 시작 직후 몇 분에 하루 주문의 상당 부분이 몰린다
그리고 느려지면 정합성이 깨진다. 응답이 늦으면 사용자가 다시 누르고, 타임아웃이 걸리면 재전송이 돌고, 그 결과가 중복 주문이다. 성능 결함이 정합성 결함으로 번지는 구조이고, 이것이 이 레슨의 중심이다.
주문의 상태 모델을 판정 기준으로 쓴다
주문은 상태를 갖고 움직인다. 모듈 39 레슨 2·10 에서 쓴 방식 그대로, 허용 경로와 금지 전이 를 판정 기준으로 만든다.
[접수 대기] → [거래소 접수] → [일부 체결] → [전량 체결]
│ │
│ └→ [잔량 취소] → [종료]
├→ [거부]
└→ [취소 요청] → [취소 완료] / [취소 거부]금지 전이가 시험의 핵심 이다. 전형적으로 이런 것들이다.
| 금지 전이 | 일어나면 |
|---|---|
| 전량 체결 → 추가 체결 | 초과 체결. 주문 수량보다 많이 산다 |
| 취소 완료 → 체결 | 취소한 주문이 체결된다. 가장 위험한 결함 |
| 체결 → 미접수 | 체결 기록이 사라진다 |
| 거부 → 체결 | 거부된 주문이 살아 있다 |
| 같은 체결이 두 번 반영 | 중복 체결. 수량·금액이 두 배 |
두 번째가 실무에서 가장 무섭다. 취소 요청과 체결이 거래소에서 교차하는 순간이 실제로 존재한다 — 취소를 보냈는데 그 사이 체결이 이미 성립한 경우다. 시스템이 "취소 성공" 과 "체결 성립" 을 동시에 사용자에게 보이면 사고가 된다. 올바른 처리는 거래소의 판정을 따르는 것이고, QA 가 확인할 것은 교차 순간에 우리 시스템이 한 가지 결론만 내놓는가 다.
상태 전이를 확인하려면 최종 상태만 보면 안 된다. 전이 이력을 수집해 경로를 검사한다 — 모듈 39 레슨 10 의 세 축(최종 상태·허용 경로·금지 전이) 과 같은 구조다.
체결 우선순위와 주문 유형 — 경계가 여기서 나온다
국내 주식시장의 매매체결 원칙으로 공개 자료가 설명하는 것은 가격 우선 → 시간 우선 이다. 낮은 매도호가가 높은 매도호가에 우선하고, 높은 매수호가가 낮은 매수호가에 우선하며, 같은 가격이면 먼저 접수된 호가가 우선한다. 그 밖의 보조 우선순위와 각 시장·상품별 세부 규칙은 거래소 업무규정에서 확인한다(원문 확인).
여기서 시간 우선이 배제되는 경우 가 있다는 점이 QA 에게 중요하다. 공개 자료는 시가 등이 상·하한가로 결정되는 단일가매매에서 상한가 매수호가 또는 하한가 매도호가(시장가호가 포함) 를 동시에 접수된 호가로 간주해 시간 우선순위를 배제 한다고 설명한다. 즉 평소와 다른 배분 규칙이 적용되는 구간 이 있고, 그 구간이 시험되지 않으면 배분 결함이 운영에서 처음 드러난다.
주문 유형도 경계를 만든다. 공개 자료가 설명하는 유형 중 최유리 지정가 는 주문 접수 시점의 상대방 최우선호가 가격으로 지정되는 주문이다 — 매도면 그 시점 가장 높은 매수 가격, 매수면 가장 낮은 매도 가격이다.
"주문 접수 시점" 이라는 말이 시험 포인트 다. 접수와 지정 사이에 호가가 바뀌면 어느 가격이 쓰이는가. 호가가 비어 있으면 어떻게 되는가. 이것이 경계 조건이고, 주문 유형별 처리 규칙과 호가 공백 시의 동작은 거래소 규정과 우리 시스템 명세에서 확인한다(원문 확인).
QA 가 만들 것은 주문 유형 × 시장 상태 결정표 다.
| 주문 유형 | 정규장 | 단일가 구간 | 변동성 완화 발동 중 | 호가 공백 |
|---|---|---|---|---|
| 지정가 | ||||
| 시장가 | ||||
| 조건부 지정가 | ||||
| 최유리 지정가 | ||||
| 최우선 지정가 |
칸을 채우는 값은 거래소 규정과 시스템 명세에서 가져온다. 비어 있는 칸이 있으면 그 자체가 질의 항목이다 — 명세에 적혀 있지 않은 조합이 실제로 발생한다.
시장 상태 전환이 만드는 결함
주식시장은 하루 동안 여러 상태를 지난다. 장전 시간외, 시가 단일가, 정규장, 종가 단일가, 장후 시간외. 그리고 종목별로 변동성 완화 장치(VI) 가 발동해 일정 시간 단일가 매매로 전환되는 구간이 생긴다.
공개 자료는 VI 를 개별 종목의 체결 가격이 일정 범위를 벗어나 급격히 변동할 때 일정 시간 단일가 매매로 전환해 급등락을 완화하는 장치로 설명하고, 직전 체결가 기준의 동적 VI 와 전일 종가 기준의 정적 VI 로 구분해 안내한다. 발동 기준 비율·지속 시간·시장과 종목 유형별 차이는 거래소 규정에서 확인한다 (원문 확인) — 2차 자료마다 수치가 다르게 적혀 있어 인용하지 않는다.
QA 관점에서 상태 전환은 경계 시험의 금광 이다.
| 경계 | 시험할 것 |
|---|---|
| 상태 전환 직전 접수된 주문 | 어느 규칙으로 처리되는가 |
| 상태 전환 중 접수된 주문 | 접수되는가 거부되는가 |
| VI 발동 순간 에 진행 중인 주문 | 잔량이 어떻게 되는가 |
| VI 해제 후 | 대기 주문이 올바른 순서로 처리되는가 |
| 장 종료 시 미체결 잔량 | 자동 취소되는가, 시간외로 넘어가는가 |
세 번째와 다섯 번째가 자주 빠진다. 특히 장 종료 시 처리는 주문 유형에 따라 다르고, 틀리면 다음 날 예상치 못한 체결이 발생한다.
그리고 시스템 시각과 거래소 시각의 차이 가 이 모든 경계를 흔든다. 우리 시스템이 상태 전환 시각을 1초 늦게 알면, 그 1초 사이의 주문이 틀린 규칙으로 처리된다. 시각 동기와 허용 오차를 시험 전제로 문서화 하고, 일부러 틀어 놓은 조건을 시험에 넣는다 — 모듈 62 레슨 4 의 시계 문제와 같다.
거래소 연계 — 응답을 못 받은 경우
이 영역의 가장 어려운 부분이고, 레슨 2 의 결과 불명 거래 가 여기서 구체적으로 나타난다.
주문을 보냈는데 응답이 없다. 세 가지 가능성이 있다.
- 주문이 거래소에 도달하지 않았다 → 재전송해야 한다
- 주문이 도달했고 처리됐지만 응답이 유실됐다 → 재전송하면 중복 주문
- 주문이 처리 중 이다 → 기다려야 한다
구분할 수 없다는 것이 문제의 본질 이다. 그래서 시스템은 다음 중 하나를 선택해 설계되어 있어야 한다.
- 멱등 식별자 — 주문에 고유 식별자를 붙여 거래소가 중복을 거부하게 한다
- 조회 후 재전송 — 재전송 전에 주문 상태를 조회해 확인한다
- 보수적 대기 — 재전송하지 않고 조회로만 상태를 확정한다
QA 가 확인할 질문은 네 개다.
- 어느 방식인가. 명세에 적혀 있는가
- 조회 자체가 실패하면 어떻게 되는가
- 사용자에게 무엇을 보이는가 — "처리 중" 인가 "실패" 인가. "실패" 로 보이고 실제로는 체결된 경우 가 최악이다
- 대조 장치가 있는가 — 우리 주문 기록과 거래소 체결 내역을 맞춰 보는 절차
네 번째가 핵심 이다. 모듈 62 레슨 4 의 대조 지점, 레슨 2 의 대사와 같은 구조다. 우리 시스템의 체결 건수·수량·금액과 거래소에서 받은 내역이 맞는지를 정기적으로 비교 하는 장치가 없으면, 어긋난 것을 발견할 방법이 없다. 그리고 이 대조는 장중에도 돌아야 한다 — 하루 끝에 발견하면 이미 늦다.
시험 설계는 이렇게 된다. 거래소 쪽을 흉내 내는 모의 서버 를 두고 비정상 응답을 마음대로 만든다 — 모듈 62 레슨 3 의 에뮬레이터 발상과 같고, 거기서 다룬 원칙이 그대로 적용된다. 정상 응답만 만드는 모의 서버는 가치가 거의 없다. 지연, 무응답, 순서 뒤바뀜, 중복 응답, 다른 주문 번호로 응답, 형식 깨진 응답을 설정으로 만들 수 있어야 한다.
장 시작 피크 — 평균이 아니라 모양을 재현한다
주문 시스템의 부하는 하루 내내 고르지 않다. 장 시작 직후 짧은 구간에 집중되고, 종가 무렵에 다시 오른다. 모듈 51 레슨 1 의 워크로드 모델링이 여기서 필수가 된다.
평균 초당 주문 수로 부하를 걸면 아무것도 알 수 없다. 재현해야 할 것은 셋이다.
1) 모양. 장 시작 순간 급격히 오르고 수 분 안에 떨어지는 곡선. 평탄한 부하로는 큐 적체와 그 뒤의 지연 누적이 나타나지 않는다.
2) 혼합. 피크 구간에는 주문만 몰리는 것이 아니다. 조회(잔고·호가·체결 내역), 취소·정정, 그리고 시세 수신 이 동시에 폭증한다. 조회가 주문 경로를 막는지가 중요한 질문이고, 주문만 걸어서는 확인되지 않는다.
3) 집중. 특정 종목에 주문이 몰린다. 종목을 고르게 분산한 부하는 종목 단위 잠금 경쟁 을 재현하지 못한다. 실제로는 소수 종목에 집중되고, 그 종목의 처리가 전체를 막을 수 있다.
판정 기준도 달라진다. 모듈 31 레슨 4 에서 다룬 대로 평균이 아니라 분포 로 보고, 특히 꼬리 를 본다. 주문 처리의 p99 가 몇 초로 늘어나면 사용자는 재시도하고, 재시도는 중복 주문 위험을 만든다.
그리고 처리량이 아니라 "지연이 누적되기 시작하는 지점" 을 찾는 것이 목표다. 초당 N 건을 처리했다는 숫자보다, 어느 지점부터 큐가 쌓이기 시작하고 회복에 얼마가 걸리는가 가 운영 판단에 쓰인다.
복수 시장 환경
국내에 대체거래소가 출범해 같은 종목이 둘 이상의 시장에서 거래되는 환경 이 만들어졌다는 보도가 있다. 제도의 현행 내용, 적용 범위, 주문 라우팅과 최선집행에 관한 규정은 감독 당국·거래소·대체거래소의 공개 안내에서 확인한다(원문 확인).
QA 관점에서 이 변화가 만드는 시험 항목의 성격 은 예측할 수 있다.
- 라우팅 판정 — 어느 시장으로 보낼지 결정하는 로직이 명세대로 동작하는가
- 시장 간 시세 통합 — 두 시장의 호가를 합쳐 보여 줄 때 정합성이 맞는가
- 한 시장 장애 시 — 다른 시장으로 전환되는가, 전환 중 주문이 유실되지 않는가
- 집계 정합성 — 체결 내역·잔고가 시장별로 나뉘어도 합계가 맞는가
- 시장별 규칙 차이 — 거래 시간·호가 단위·주문 유형이 다를 수 있다
구체적 규칙은 반드시 현행 규정에서 확인 하고, 이 레슨은 시험 항목의 축만 둔다.
실무에서 왜 필요한가
증권 시스템 장애는 보도되는 사고 가 된다. 장 시작에 주문이 지연되거나, 취소한 주문이 체결되거나, 잔고가 틀리면 고객 손실과 감독 당국 보고로 이어진다. 그리고 장중에는 되돌릴 수 없다 — 시장은 계속 돌고, 잘못된 체결은 이미 성립했다.
이 환경에서 QA 가 기여하는 자리는 셋이다.
첫째, 상태 모델을 판정 기준으로 만드는 것. 금지 전이 목록이 있으면 정합성 시험이 체계가 되고, 없으면 "해 봤는데 괜찮았다" 가 된다. 특히 취소와 체결의 교차 순간은 설계 문서를 읽고 질문해야 발견되는 영역이다.
둘째, 비정상 응답을 만들 수 있는 환경을 요구하는 것. 거래소 연계의 결함은 정상 응답에서 나오지 않는다. 모의 서버에 비정상 모드가 없으면 그 결함은 시험될 수 없고, 운영에서 처음 만난다.
셋째, 피크의 모양을 재현하는 것. 평균 부하로 통과한 시스템이 장 시작에 무너지는 일은 흔하다. 모양·혼합·집중 세 축을 반영한 부하 모델을 만들어 두면 그 결함을 미리 만난다.
가장 저평가된 기여는 장중 대조 장치를 요구하는 것 이다. 우리 기록과 거래소 내역을 장중에 맞춰 보는 절차가 없으면, 어긋남을 하루 끝에나 발견한다. 그 몇 시간 동안 사고는 커진다.
채용시장에서의 위치
이 영역은 증권사·자산운용사의 IT 조직, 증권 전산 전문 기업, 트레이딩 솔루션 기업 의 QA 자리다. 공고에는 "증권 원장", "주문·체결", "HTS·MTS", "거래소 연계", "장 시작 부하" 같은 말이 적힌다.
특징은 도메인 지식의 비중이 매우 높다 는 점이다. 호가·체결·단일가·VI·주문 유형을 모르면 시험 설계를 할 수 없고, 그 지식은 문서로 배우는 데 시간이 걸린다. 그래서 한 번 들어가면 경력이 길게 쌓이고 이동도 같은 업권 안에서 일어난다.
경쟁력이 되는 것은 셋이다. 첫째, 상태 모델과 금지 전이로 생각하는 능력 이다. 면접에서 "취소와 체결이 교차하면 어떻게 하시겠습니까" 는 이것을 보는 질문이다. 둘째, 비정상 응답 시나리오를 설계하는 능력 이다. 셋째, 피크 부하의 모양을 설명하는 능력 이다 — "평균 TPS" 로 답하면 약하고, 모양·혼합·집중을 들면 다르다.
그리고 이 분야에서는 규정을 확인하는 태도 가 특히 중요하다. 체결 규칙과 VI 기준은 거래소 규정이 정하고 개정된다. 외운 수치로 시험 기준을 세우면 틀리고, 그 틀림이 운영 사고로 연결된다.