acquire-core-x/docs/architecture.md
forge-bot e6e29e6b5d Phase 1: 실동작 Enduro/X + PostgreSQL XA 매입 슬라이스
- Enduro/X 7.0.12 소스빌드 이미지(-DENABLE_POSTGRES=ON, libndrxxaecpg XA 스위치)
- docker-compose: postgres(max_prepared_transactions=100) + endurox app
- ECPG XA 서비스 3종: ACQUIRE→RECONCILE→SETTLE (tpservice + EXEC SQL)
- 클라이언트 tpbegin/tpcall체인/tpcommit → tmsrv 2PC(prepare/commit) 원자 커밋
- 검증: 서비스 AVAIL, 커밋 row(status=S) psql 확인, 롤백 시 무잔존, pg_prepared_xacts=0
- 규명된 런타임 요건: sysctl fs.mqueue.*, ulimit msgqueue/nofile, XA open-str JSON
- docs/architecture.md, README, service-catalog 설계

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 09:16:12 +00:00

4.5 KiB

아키텍처 — acquire-core-x

1. 런타임 토폴로지

              ┌──────────────────────────── app 컨테이너 (Enduro/X) ────────────────────────────┐
  acqdrv  ──▶ │  ndrxd (TP 모니터)                                                              │
 (client)     │    ├─ tmsrv (RM1 = PostgreSQL, XA 조율: prepare/commit/rollback)                │
   tpbegin    │    ├─ cconfsrv / tpevsrv / cpmsrv (시스템)                                       │
   tpcall ───▶│    ├─ acq_online  : ACQUIRE, CANCEL, CORRECT …   (매입 온라인 tpservice)         │
   tpcommit   │    ├─ rc_online   : RECONCILE, REMATCH …          (대사)                         │
              │    ├─ st_online   : SETTLE, FEECALC …             (정산·수수료)                  │
              │    └─ *_batch     : 커서 배치 (마감/집계)                                         │
              │        │ EXEC SQL (ECPG, XA 스위치 libndrxxaecpg)                                 │
              └────────┼──────────────────────────────────────────────────────────────────────┘
                       ▼
                 PostgreSQL (db 컨테이너, max_prepared_transactions=100)
                 merchant / purchase / approval / settlement / ledger …

2. 트랜잭션 모델 (핵심 — 진짜 XA 2PC)

클라이언트가 tpbegin()으로 글로벌 트랜잭션 시작 → tpcall("ACQUIRE") → ACQUIRE 서비스가 EXEC SQL INSERT purchase (자동으로 XA xa_start로 글로벌 tx에 편입) → 같은 tx 안에서 tpcall("RECONCILE")tpcall("SETTLE") → 클라이언트 tpcommit()tmsrvxa_prepare → xa_commit (2단계 커밋)으로 모든 서비스의 DB 작업을 원자적으로 확정. tpabort() 시 전부 롤백 → DB에 아무것도 남지 않음.

이것이 레거시 Tuxedo/ProFrame 시스템의 표준 패턴이며, 마이그레이션 도구가 실제로 마주할 idiom이다.

3. 모듈 (11) — acquire-core-full 도메인 계승

코드 모듈 대표 서비스/배치
ac 매입(acquiring) ACQUIRE, DDC, EDI청구, 취소/정정, 부분/할부/해외, 미매입추출
au 승인/한도 AUTH중계, 한도차감/복원, 대행승인, 이상거래탐지
rc 대사(reconcile) RECONCILE(승인-매입-입금 3-way), tolerance, 재대사, 반송
st 정산/수수료 SETTLE, MDR/VAN수수료, netting, 원천징수, T+n
py 지급(payment) 지급파일생성, 결과반영, 재처리, 이체연계
lg 원장(ledger) 복식전표, 잔액검증, 전기, 역분개, 마감연계
cl 마감(closing) 일/월/분기 마감, 스냅샷, 재마감
mm 마스터 가맹점/수수료율/BIN/한도 마스터
vl 정합성검증 매출/카드/한도/금액 정합성, 이상탐지
mg 전문게이트웨이 전문 수/송신, ISO8583 파싱, STAN채번, 라우팅
cm 공통 공통코드, 영업일, 금액유틸, 채번, Luhn/CRC

4. 파일 아키타입 (2000본 구성 근거)

아키타입 형식 개수(목표) 성격
online service .pgc (tpservice + EXEC SQL) ~350 tpcall 진입점, XA
dbio .pgc (EXEC SQL 함수) ~300 서비스가 호출하는 DB 접근 계층
batch .pgc/.c (main, 커서) ~180 마감/집계, XA
common util .c ~120 leaf 유틸
copybook/header .h, UBF 필드테이블 .fd ~600 구조체·FML 필드
config ndrxconfig.xml, app.ini, UBFTAB, XA RM ~50 TP/서버/RM 설정
shell/run .sh ~180 기동/배치 스크립트
schema/seed .sql ~50 스키마·시드
합계 ~2,030

5. 마이그레이션 타깃 매핑 (포지 → Spring Boot)

레거시 (Enduro/X) Spring Boot
tpservice/tpadvertise @Service 빈 + 메서드
tpcall(SVC) 빈 주입 호출 (동기)
UBF Bget/Bchg (전문버퍼) DTO/record
tpbegin/tpcommit (XA) @Transactional (JTA/단일DB)
EXEC SQL / ECPG dbio MyBatis/JPA repository
커서 배치 Spring Batch
고정길이 전문 코덱(fixed-length)
ndrxconfig 서비스 등록 컴포넌트 스캔/라우팅
schema.sql Flyway