- 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>
4.5 KiB
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() →
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 |