# KBX External Integration & Resilience Governance v19

## 1. 목적
외부연계 실패를 Business Transaction 실패와 혼동하지 않는다. Domain Commit이 완료되었다면 사용자는 동일 저장/확정 Command를 반복하지 않는다.

## 2. 상태 분리
`Business State`와 `Integration State`는 별도다.

예: 주문 확정 완료 / WMS 출고지시 전송 대기.

## 3. Retry 책임
- Polly: 요청 수명 안의 짧은 transient retry/timeout/circuit breaker.
- Hangfire: 프로세스 재시작을 견뎌야 하는 durable retry.
- Outbox/Inbox: 전달 유실/중복 방지.
- PostgreSQL: attempt/receipt의 source of truth.

Polly retry를 장시간 스케줄러처럼 사용하지 않는다.

## 4. 실패 분류
Transient: network, timeout, HTTP 408/429/5xx, circuit-open.
Permanent: contract-invalid, HTTP 400/401/403/404, domain-rejected.

Permanent 실패는 자동 retry하지 않고 Operations Exception으로 승격한다.

## 5. 사용자 UX
정상 저장 성공 후 연계 지연은 `저장 실패`가 아니다.

- 업무: 완료
- 연계: 전송 대기 / 자동 재시도 / 실패

사용자가 업무 Command를 다시 눌러 중복 데이터를 만들지 않게 한다.

## 6. 특정 외부 서비스
현재 첨부 KBX 기준 문서에는 KRX/OPENDART/KIS의 실제 Endpoint/Quota/Auth 규칙이 정의되어 있지 않으므로 v19 계약에는 임의로 넣지 않았다. 각 Adapter 온보딩 시 공식 공급자 문서를 기준으로 별도 Integration Definition을 추가한다.
