# 아키텍처 — 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()` → `tmsrv`가 **xa_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 |