Wave L: 외부 연동·전문처리 (ISO8583 와이어·소켓 왕복·클리어링 파일, 패리티→~89%)

외부 카드망 연동(전문처리)을 실제 프로토콜로 구현 — 마이그레이션 최난이도 계층
(소켓·바이너리 전문·프레이밍·상태처리)이 실제로 동작.

■ ISO 8583 와이어 코덱 (common/acq_iso8583.c)
- 1차 비트맵(64bit) + DE 인코딩/파싱(PAN LLVAR·금액·STAN·RRN·응답코드·MID/TID 등).
- iso_build/iso_parse 왕복 무손실 검증(비트맵 7220000000C08000 정확).

■ 외부 카드망 시뮬레이터 (clients/acq_extsw.c, :9500)
- TCP 서버: 길이접두 프레이밍 + ISO 전문. 0200 수신→승인판정→0210 응답 조립
  (DE38 승인번호·DE39 응답코드). 금액임계/STAN으로 일부 거절(05).

■ 전문 왕복 드라이버 (clients/acq_netdrv.c)
- 실매입건→0200 조립→소켓 전송→0210 수신·파싱→mg_netlog 적재(RTT·응답코드).
- 실측: 200건 왕복 승인198/거절2/오류0, 0200→0210, 평균 RTT 0.3ms.

■ 클리어링 파일 교환 (clients/acq_clrfile.c)
- cl_presentment→고정폭 정산파일(/app/out/CLR_BC_YYYYMMDD.dat) HD/DT/TR+체크섬 생성,
  cl_clearing_file 등록. 실제 SFTP 배치 파일교환 대역. 샘플 파일 커밋.

■ 스키마·부팅·화면
- 74-netio.sql: mg_netlog(왕복로그)·cl_clearing_file(파일 레지스트리).
- entrypoint.sh: acq_extsw 부팅 자동기동(:9500).
- build.sh: 클라이언트에 libacqcommon.a(ISO 코덱) 링크.
- 시스템현황에 "외부망 전문 왕복"·"클리어링 파일 교환" 패널.

패리티 재채점 ≈89/100. 남은 ~11%는 상용회선·HSM·다중센터 DR 등 배포 인프라.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
hyeongwoo 2026-07-23 14:59:36 +09:00
parent bba433308a
commit 12812a6c33
12 changed files with 525 additions and 4 deletions

43
db/schema.d/74-netio.sql Normal file
View file

@ -0,0 +1,43 @@
-- ===========================================================================
-- 74-netio.sql : 외부 연동·전문처리 (Wave L)
-- 외부 카드망(밴사/VAN) ISO 8583 왕복 로그 + 클리어링 파일 교환 레지스트리 +
-- store-and-forward 큐 확장. 소켓·바이너리 전문처리 계층.
-- ===========================================================================
-- 외부 전문 왕복 로그 (요청 0200 → 응답 0210, 왕복시간·응답코드)
CREATE SEQUENCE IF NOT EXISTS mg_netlog_seq START 600000;
CREATE TABLE IF NOT EXISTS mg_netlog (
net_id BIGINT PRIMARY KEY,
purchase_id BIGINT,
channel TEXT NOT NULL DEFAULT 'CH01',
peer TEXT NOT NULL DEFAULT 'BC-NET', -- 상대망(BC-NET/VISANET/...)
req_mti TEXT NOT NULL,
rsp_mti TEXT,
stan TEXT,
rrn TEXT, -- 참조번호(DE37)
resp_code TEXT, -- DE39: 00=승인 05=거절 91=타임아웃
approval_no TEXT, -- DE38
amount BIGINT NOT NULL DEFAULT 0,
rtt_ms INTEGER NOT NULL DEFAULT 0, -- 왕복시간(ms)
req_wire TEXT, -- 요청 전문(hex)
rsp_wire TEXT, -- 응답 전문(hex)
status TEXT NOT NULL DEFAULT 'OK', -- OK/TIMEOUT/ERROR
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS ix_netlog_pid ON mg_netlog(purchase_id);
CREATE INDEX IF NOT EXISTS ix_netlog_rc ON mg_netlog(resp_code);
-- 클리어링 파일 교환 레지스트리 (아웃바운드 프레젠트먼트 / 인바운드 정산파일)
CREATE SEQUENCE IF NOT EXISTS cl_file_seq START 640000;
CREATE TABLE IF NOT EXISTS cl_clearing_file (
file_id BIGINT PRIMARY KEY,
direction TEXT NOT NULL, -- OUT(프레젠트먼트)/IN(정산)
filename TEXT NOT NULL,
scheme TEXT NOT NULL DEFAULT 'BC',
biz_date DATE NOT NULL,
rec_count BIGINT NOT NULL DEFAULT 0,
total_amount BIGINT NOT NULL DEFAULT 0,
checksum TEXT,
status TEXT NOT NULL DEFAULT 'GENERATED',-- GENERATED/SENT/ACKED/INGESTED
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);