# RTGS 프로토타입 아키텍처 설계서

| 항목 | 내용 |
|---|---|
| 문서명 | 소액 RTGS(실시간총액결제) 프로토타입 아키텍처 설계서 |
| 버전 | v1.0 |
| 작성일 | 2026-07-10 |
| 작성 | 루비(AI) · 검토 양희정 팀장(한국은행 RTGS시스템팀) |
| 분류 | SW 산출물 — 아키텍처 설계 |
| 대상 시스템 | `C:\ai-dev\workspace\rtgs` (로컬 포터블 프로토타입, 1센터 DC1) |
| 관련 문서 | 개발일지 · 워크플로우 · 로컬 테스트 시나리오 · 복원력방안(과제⑧ v2.0) · PoC 1~3차 결과보고 |

---

## 1. 개요

### 1.1 목적
클라우드 PoC(3회차, "접수"까지 검증)의 아키텍처를 로컬에서 **업무기능 완결(신청→접수→청산·정산→완결 ACCC)** 로
재현하고, 복원력방안(Active-Active-Active)의 미검증 급소를 검증하기 위한 프로토타입의 **소프트웨어/배포 아키텍처**를 정의한다.

### 1.2 범위
- 1센터(DC1) 로컬 구성의 논리·물리(OS-WAS-DB) 아키텍처, SW 스택, 데이터/인터페이스/보안 설계.
- 다센터(DC2/DC3) A-A-A 확장 설계는 §11에 방향만 제시(구현은 고사양 PC 이관 후).

### 1.3 용어
| 약어 | 의미 |
|---|---|
| RTGS | Real-Time Gross Settlement(실시간총액결제) |
| A-A-A | Active-Active-Active(3센터 동시 가동) |
| BMI | Business Message Identifier(거래식별자 22자리) |
| 저널 | 전역순번이 부여된 처리 명단(Kafka 단일 파티션) |
| 정족수 | Quorum(N/2+1). 3센터=2 |
| 선저널 | Write-ahead journal(잔액연산 전 순번 확정) |
| WAS | Web Application Server(본 시스템은 Spring Boot 내장 Tomcat) |

---

## 2. 아키텍처 원칙 (복원력방안 반영)

1. **단일 전역 순번기**로 입구에서 전역순번 부여 → 저널 → N센터 **결정론적 재생**(동일순서·동일업무).
2. **원장 = RDB(PostgreSQL) 강한 일관성** — 잔액 확정의 권위 저장소.
3. **정족수(2/3) + 펜싱**으로 split-brain 차단(1센터=자기 과반, 구조 선반영).
4. **선(先)저널(write-ahead)** 후 잔액연산 → 노드사(死) 무손실 승계.
5. **완결 규율** — 과반 확정 후 최종(ACCC).
6. **경량 명령문 + 원전문 해시(SHA-256)** — 센터 간엔 수백B 구조체만 복제, 원전문은 별도 저장.
7. **순서=Sequencer(상태O) / 분산·관문=Gucci·GSLB(상태X)** 역할 분리.
8. **포터블 네이티브** — 모든 런타임을 `C:\ai-dev\apps` 하위에 무설치 배치(회사 PC 가상화 차단으로 Docker 불가).

---

## 3. 논리 아키텍처

> **그림 3-0. 업무 흐름도(기준)** — 3센터 A-A-A 동일 순서·동일 업무 처리
>
> ![RTGS 업무 흐름도](2센터흐름도.png)

### 3.1 계층 구조

**그림 3-1. 컴포넌트·데이터 흐름 (7개 서비스)**
```mermaid
flowchart TD
  EXT["참가기관 / k6"] --> G["Gucci 관문 :8095<br/>인증·유량·재전송·콜백"]
  CON["운영·관리 콘솔<br/>React :5174"] --> C
  CON --> LV["LouisVuitton :8099<br/>시스템관리"]
  G --> C["Chanel :8091<br/>접수·검증·통보"]
  C -->|rtgs.inbound| K
  K["Kafka :9092<br/>저널/결과/통보"] --> S["Sequencer :8090<br/>전역순번"]
  S -->|rtgs.journal| K
  K --> D["Dior :8092<br/>접수동기화"]
  K --> H["Hermes :8093<br/>정산·원장엔진"]
  H -->|rtgs.result| K
  K --> P["Prada :8094<br/>완결"]
  P -->|rtgs.notify| K
  D --> PG[("PostgreSQL :5433<br/>원장")]
  H --> PG
  P --> PG
  C --> PG
  G -->|콜백 송부| EXT
```

**그림 3-2. 계층 구조**
```
 ┌── 표현 계층 ─────────────────────────────────────────────┐
 │  운영/관리 콘솔 (React + Vite, :5174)                       │
 └───────────────┬──────────────────────────────────────────┘
 ┌── 경계/관문 계층 ────────────▼───────────────────────────┐
 │  Gucci(:8095) — 로그인·API인증·유량제어·재전송차단·결과콜백 │
 └───────────────┬──────────────────────────────────────────┘
 ┌── 접속/연계 계층 ────────────▼───────────────────────────┐
 │  Chanel(:8091) — pacs.008 접수·XSD검증·경량화·결과통보     │
 └───────────────┬──────────────────────────────────────────┘
 ┌── 코어(순번/정산) 계층 ──────▼───────────────────────────┐
 │  Sequencer(순번) → [저널] → Dior(접수동기화)              │
 │                             Hermes(정산·원장엔진)         │
 │                             Prada(완결·결과동기화)         │
 └───────────────┬──────────────────────────────────────────┘
 ┌── 데이터/원장 계층 ──────────▼───────────────────────────┐
 │  PostgreSQL(원장·강한 일관성)  ·  Kafka(입구/저널/결과/통보) │
 └───────────────┬──────────────────────────────────────────┘
 ┌── 관리/관측 계층 ────────────▼───────────────────────────┐
 │  LouisVuitton(:8099) 시스템관리  ·  ELK 로그(9200/5000/5601)│
 └──────────────────────────────────────────────────────────┘
```

### 3.2 서비스(컴포넌트) 구성 — 7개 (명품 코드네임)
| # | 서비스 | 코드네임 의미 | 유형 | 논리포트 | 책임 |
|---|---|---|---|---|---|
| 1 | **Sequencer** | 전역 순번기 | Headless(JVM) | 8090 | 전역순번·결정론적값 확정 → 저널 발행. **순번 영속화**(재기동 시 MAX(global_seq) 복원) |
| 2 | **Chanel** | Contact Hub…Entry Liaison | **Web(Tomcat)** | 8091 | pacs.008 접수·XSD검증·경량화·원전문 저장·입구 발행 / **결과통보**(pacs.002 생성·아웃박스) |
| 3 | **Dior** | Data Integration…Relay | Headless(JVM) | 8092 | 저널 소비 → 원장 PDNG 기록(접수 동기화) |
| 4 | **Hermes** | …Rapid Memory Execution…Settlement | Headless(JVM) | 8093 | 저널 순차소비(cc=1)·순서교정·선저널·당좌 차/대변(강한 일관성)·ACSP |
| 5 | **Prada** | Persistent Repository…Aggregation | Headless(JVM) | 8094 | 결과 소비·완결 규율(과반)·ACCC 확정·조회사본·**결과통보 발행** |
| 6 | **Gucci** | Global User Communication Control Interface | **Web(Tomcat)** | 8095 | 외부 경계 관문: 로그인·JWT·API인증·유량제어·재전송차단·리버스프록시·결과 콜백송부 |
| 7 | **LouisVuitton** | Leading Operations Unified Info Systems… | **Web(Tomcat)** | 8099 | 시스템관리: DB초기화·코드·사용자권한·대사 대시보드 |

> **유형 구분**: Web 서비스(Chanel·Gucci·LouisVuitton)만 내장 Tomcat으로 HTTP 리슨. 코어 처리 서비스
> (Sequencer·Dior·Hermes·Prada)는 Kafka 컨슈머 JVM. **관측성(B4)** 도입으로 내장 Tomcat을
> 활성화해 예약 포트(8090/8092/8093/8094)에 `/actuator`(health·prometheus)만 노출한다(업무 HTTP 아님).

---

## 4. 물리(배포) 아키텍처 — OS · WAS · DB 스택 ★

### 4.1 배포 토폴로지 (로컬 1센터, 단일 호스트)
```
 ┌──────────────── 물리 호스트 1대 (개발 PC, Windows 11) ────────────────┐
 │ 포터블 루트: C:\ai-dev\apps (런타임) · C:\ai-dev\home (데이터/상태)      │
 │                                                                        │
 │  [WAS 계층 — JVM 프로세스]                                              │
 │   내장 Tomcat: Chanel:8091 · Gucci:8095 · LouisVuitton:8099            │
 │   Headless JVM: Sequencer · Dior · Hermes · Prada  (전부 JDK 21)        │
 │        │ JDBC(5433)                     │ Kafka(9092)                   │
 │        ▼                                ▼                              │
 │  [DB 계층]  PostgreSQL 16.4 :5433   [MQ] Apache Kafka 3.8.1(KRaft):9092 │
 │   data: home\pgsql-data              data: home\kafka\kraft-logs        │
 │                                                                        │
 │  [프론트]  Node.js 26 + Vite dev server :5174 (개발)                    │
 │  [관측]   Elasticsearch:9200 · Logstash:5000(TCP) · Kibana:5601         │
 │            data: home\es-data                                           │
 └────────────────────────────────────────────────────────────────────────┘
```
* 프로토타입은 **단일 호스트에 전 구성요소 공존**. 운영/BMT는 계층별 물리 분리 + 3센터 배치(§11).

**그림 4-1. 배포 스택 (단일 호스트)**
```mermaid
flowchart TB
  subgraph HOST["개발 PC · Windows 11 · C:/ai-dev"]
    subgraph WAS["WAS · JDK21 · Spring Boot 내장 Tomcat"]
      W1["Chanel :8091"]
      W2["Gucci :8095"]
      W3["LouisVuitton :8099"]
    end
    subgraph CORE["Headless JVM · Kafka 컨슈머"]
      c1["Sequencer"]
      c2["Dior"]
      c3["Hermes"]
      c4["Prada"]
    end
    DB[("PostgreSQL 16.4 :5433")]
    MQ["Kafka 3.8.1 KRaft :9092"]
    OBS[("ELK 8.15.2<br/>9200/5000/5601")]
    FE["Vite :5174 · Node 26"]
  end
  FE --> W1
  WAS --> DB
  WAS --> MQ
  CORE --> DB
  CORE --> MQ
  WAS -->|로그| OBS
  CORE -->|로그| OBS
```

### 4.2 OS-WAS-DB 스택 매트릭스
| 구분 | 구성요소 | 제품/버전 | 포트 | 데이터 경로 | 비고 |
|---|---|---|---|---|---|
| **OS** | 운영체제 | Windows 11 Enterprise 10.0.26100 (x64) | — | — | CPU 가상화 차단 → Docker 미사용, 네이티브 배치 |
| **런타임** | JVM | Eclipse Temurin **JDK 21.0.11 LTS** | — | `apps\jdk-21` | 빌드·실행 공통(전역 JAVA_HOME은 jdk-26 별도) |
| **WAS** | 앱서버 | Spring Boot **3.3.4** 내장 **Apache Tomcat** | 8091/8095/8099 | — | Web 3종. 코어 4종은 headless JVM |
| **언어/빌드** | 언어 | **Kotlin 2.0.20** / Java 21 toolchain | — | — | — |
| | 빌드 | **Gradle 8.10.2** (Kotlin DSL, 멀티모듈) | — | `home\gradle` | JDK26 미지원 → JDK21 고정 |
| | DB 마이그레이션 | **Flyway**(Spring Boot 관리 버전) | — | `db/migration/V*.sql` | 스키마 형상관리(LouisVuitton 실행) |
| **DB(원장)** | RDBMS | **PostgreSQL 16.4** | 5433 | `home\pgsql-data` | 강한 일관성 원장. acs(5432) 회피 |
| **MQ/브로커** | 이벤트 | **Apache Kafka 3.8.1** (KRaft, 무 Zookeeper) | 9092 | `home\kafka\kraft-logs` | 입구·저널·결과·통보. 저널은 단일 파티션 |
| **로그** | 검색엔진 | **Elasticsearch 8.15.2** | 9200 | `home\es-data` | 인덱스 `rtgs-logs-*` |
| | 수집 | **Logstash 8.15.2** | 5000(TCP) | — | json_lines → ES. encoder 7.4 |
| | 시각화 | **Kibana 8.15.2** | 5601 | — | Discover "RTGS Logs" |
| **메트릭** | 수집 | **Prometheus 3.13.0** | 9090 | `home\prometheus-data` | 7서비스 `/actuator/prometheus` 스크랩(5s), `infra\start-prometheus.cmd` |
| | 시각화 | **Grafana 13.1.0** (OSS) | 3000 | `home\grafana-data` | Prometheus 데이터소스+RTGS Overview 대시보드 자동, `infra\start-grafana.cmd` |
| **프론트** | 런타임 | **Node.js 26.3.0** | — | — | 개발 서버 |
| | 프레임워크 | **React 18.3.1 + Vite 5.4.2 + TS 5.5.4** | 5174 | — | 운영/관리 콘솔 |
| **부하** | 테스트 | **k6 0.56.0** | — | — | 성능/스파이크 |
| **(미사용)** | 문서DB | MongoDB 7.0.14 | (27017) | — | EDR 파일락 크래시 → PostgreSQL로 대체 |

### 4.3 프로세스·환경
- 기동: `run-dc1.cmd`(인프라 + 7서비스) · `infra\start-elk-native.cmd`(ELK) · `run-frontend.cmd`(콘솔). 종료: `stop-dc1.cmd`.
- 환경변수: `C:\ai-dev\scripts\env.cmd`(JDK21_HOME/GRADLE_HOME/PATH). 센터 파라미터 `CENTER_ID=DC1`, `CENTER_COUNT=1`.
- 각 서비스는 `java -jar <service>-0.1.0.jar`(Spring Boot fat jar)로 독립 실행.

---

## 5. 데이터 아키텍처

### 5.1 저장소 역할 분리
| 저장소 | 역할 | 근거 |
|---|---|---|
| PostgreSQL | **권위 원장**(잔액·거래상태·선저널·조회사본·원전문·통보·사용자·콜백) | 강한 일관성(이중지급 방지) |
| Kafka | 입구 완충 + **전역순서 저널 전파** + 결과/통보 | 순서 공유·비동기·완충 |
| (MongoDB) | 원전문/조회사본 (클라우드/BMT) | 로컬은 EDR 이슈로 PostgreSQL 대체 |

### 5.2 PostgreSQL 테이블 (DB: `rtgs`)
| 테이블 | 용도 | 소유(주 기록) |
|---|---|---|
| `account` | 참가기관 당좌계좌 잔액(19개 기관 시드) | Hermes |
| `transfer` | 거래 원장(BMI PK, 상태·순번·금액) | Dior/Hermes/Prada |
| `journal_log` | 선저널(global_seq PK) | Hermes |
| `raw_message` | 원전문 pacs.008 XML + SHA-256 | Chanel |
| `settlement_view` | 조회 전용 사본(완결 확정) | Prada |
| `notification` | 결과통보 아웃박스(pacs.002, delivered/attempts) | Chanel(적재)/Gucci(송부확정) |
| `app_user` | 사용자·권한(ADMIN/ORG_S/ORG_R) + secret | LouisVuitton/Gucci |
| `institution_endpoint` | 기관 콜백 URL 레지스트리 | Gucci |

* 컬럼 한글명은 `COMMENT ON COLUMN`(데이터 사전)으로 관리 → 화면 라벨의 단일 출처.
* **스키마 형상관리 = Flyway**: `backend/louisvuitton/src/main/resources/db/migration/V*.sql`가 유일 출처.
  LouisVuitton 기동 시 자동 적용(`flyway_schema_history` 기록). 기존 DB는 baseline 처리, 신규 DB는 V1부터 생성.
  변경은 새 `V+1__*.sql` 추가(수기 ALTER·기적용 마이그레이션 수정 금지).

### 5.3 Kafka 토픽
| 토픽 | 발행 → 소비 | 파티션 | 용도 |
|---|---|---|---|
| `rtgs.inbound` | Chanel → Sequencer | 1 | 접수 원시 요청 |
| `rtgs.journal` | Sequencer → Dior·Hermes | **1(전역순서)** | 전역순번 저널 |
| `rtgs.result` | Hermes → Prada | 1 | 결제 결과(ACSP/RJCT) |
| `rtgs.notify` | Prada → Chanel | 1 | 완결 결과통보 트리거 |

### 5.4 상태 전이 (TxSts)
`RCVD`(접수) → `ACTC`(순번) → `PDNG`(원장기록) → `ACSP`(정산반영) → `ACCC`(입금처리완료) / 실패 `RJCT`.

**그림 5-1. 상태 전이도**
```mermaid
stateDiagram-v2
  [*] --> RCVD: 접수(Chanel)
  RCVD --> ACTC: 순번(Sequencer)
  ACTC --> PDNG: 원장기록(Dior)
  PDNG --> ACSP: 정산(Hermes)
  ACSP --> ACCC: 완결·과반(Prada)
  ACCC --> [*]
  RCVD --> RJCT: 검증실패(XSD/업무규칙)
  ACSP --> RJCT: 잔액부족/미등록기관
  RJCT --> [*]
```

---

## 6. 인터페이스 설계

### 6.1 전문(ISO 20022, 공식 XSD)
| 전문 | 표준/버전 | 방향 | 검증 |
|---|---|---|---|
| 결제의뢰 | **pacs.008.001.08** (FIToFICstmrCdtTrf) | 참가기관 → RTGS | 공식 XSD(XXE 차단, DOM 파싱) |
| 결과통보 | **pacs.002.001.10** (FIToFIPmtStsRpt) | RTGS → 참가기관 | 정식 네임스페이스 생성 |
| 식별자 | BMI 22자리 = 영업일(8)+기관(4)+일련(10) | — | 멱등키 |

### 6.2 주요 API
| 계층 | 메서드·경로 | 인증 | 설명 |
|---|---|---|---|
| 관문(Gucci) | `POST /gucci/auth/login` | — | 로그인 → JWT 발급 |
| | `POST /gucci/pay/customer` | Bearer+nonce | 인증 접수(→Chanel 프록시) |
| | `GET /gucci/inquiry/{bmi}` · `/accounts` | Bearer | 인증 조회 |
| | `GET /gucci/health/centers` · `GET/PUT /gucci/callbacks` | —/ADMIN | 헬스·콜백 레지스트리 |
| 코어(Chanel) | `POST /pay/customer`, `GET /inquiry/{bmi}`, `/accounts` | (내부) | 접수·조회 |
| | `GET /notifications[/{bmi}]`, `/rawmessage/{bmi}`, `/meta/labels` | (내부) | 통보·원전문·데이터사전 |
| 관리(LouisVuitton) | `POST /admin/reset`, `/admin/institutions|users|status-codes|summary|ledger/*` | (관리) | 시스템관리 |

---

## 7. 처리 흐름 (요약)
```
신청 → [Chanel] RCVD·XSD·경량화 → rtgs.inbound
     → [Sequencer] 전역순번·ACTC → rtgs.journal
        ├ [Dior] PDNG(접수동기화)
        └ [Hermes] 순서교정·선저널·잔액 차/대변(강한 일관성)·ACSP → rtgs.result
             → [Prada] 과반확정·ACCC·조회사본 → (커밋 후) rtgs.notify
                  → [Chanel] pacs.002 생성·아웃박스 → [Gucci] 콜백 송부(재시도/ACK)
```
**그림 7-1. 거래 처리 시퀀스**
```mermaid
sequenceDiagram
  participant ORG as 참가기관(ORG_S)
  participant G as Gucci
  participant C as Chanel
  participant S as Sequencer
  participant H as Hermes
  participant P as Prada
  ORG->>G: 로그인 → JWT
  ORG->>G: pacs.008 (Bearer,nonce)
  G->>C: 인증·검사 후 프록시
  C-->>ORG: pacs.002 (RCVD)
  C->>S: rtgs.inbound
  S->>H: rtgs.journal (ACTC, Dior도 소비→PDNG)
  H->>H: 선저널·잔액 차/대변 (ACSP)
  H->>P: rtgs.result
  P->>P: 과반 확정 (ACCC)
  P->>C: rtgs.notify
  C->>G: 결과통보(pacs.002)
  G->>ORG: 콜백 송부 (ACK)
```

* 상세는 「RTGS 프로토타입 워크플로우.md」 참조.

---

## 8. 비기능 요구 설계

### 8.1 성능
- 목표 10,000~20,000 TPS(개요). 저널 **단일 파티션**이 순서 보장의 대가로 순번기 처리량 상한이 됨 → 성능 급소로 계측(sim).
- Gucci **유량제어**(기관별 50/10s 기본)로 코어·순번기 보호(백프레셔).

### 8.2 가용성 (정족수)
- 3센터 정족수=2: **1센터 다운=서비스 지속 / 2센터 다운=안전 정지**(장애). 1센터 로컬은 자기=과반.
- Web 서비스는 무상태(세션리스 JWT) → 수평 확장·GSLB 분산 적합.

### 8.3 복원성 (무손실)
- **선저널 + Kafka 오프셋 재생**: 원장엔진(Hermes) 재기동 시 유실 없이 승계.
- **순번 영속화**: 순번기 재기동 시 MAX(global_seq)에서 이어서 발번.

### 8.4 데이터 정합성
- 전역순번 직렬화 + 강한 일관성 트랜잭션 → **이중지급 0 / 총액 보존** 불변식. 원장=저널=조회사본 대사.
- 멱등성: BMI 기준 `ON CONFLICT` upsert(중복 접수 무해).

### 8.5 보안
| 영역 | 설계 |
|---|---|
| 인증 | Gucci 로그인 → **JWT(HS256)**. 자격증명=app_user(권한 마스터), 비밀키 **BCrypt+솔트 해시** 저장(기동 시 평문 자동 승격) |
| 인가 | 역할(ADMIN/ORG_S/ORG_R) + **기관 바인딩**(토큰 org == 전문 송신기관) |
| 관리자 콘솔 | LouisVuitton `/admin/**` 은 **ADMIN JWT 필수**(인터셉터 검증). Gucci 발급 토큰을 동일 서명키로 검증. 초기암호 변경(must_change_password) 지원. 테스트계정 a/1 |
| API 보호 | 유량제어 · **재전송 차단**(nonce+timestamp) · 감사로그(ELK) |
| 전문 무결성 | 원전문 **SHA-256** 해시, XSD 검증, **XXE 차단**(DTD/외부엔티티 비허용) |
| 전달 보장 | 결과 콜백 at-least-once(재시도+ACK) + 수신측 dedup 전제 |
| (후속) | mTLS·비밀키 해시/회전·펜싱 토큰 |

### 8.6 관측성
- **로그**: 전 서비스 Logback(JSON, `service`/`center` 필드) → Logstash(:5000) → ES(`rtgs-logs-*`) → Kibana.
- **메트릭(B4)**: 전 서비스 Micrometer → `/actuator/prometheus` 노출. 업무 메트릭 `rtgs.settlements`(정산·status),
  `rtgs.settle`(정산 지연 Timer), `rtgs.finality`(완결·status), `rtgs.journal.gap`(순서 gap), 접수 TPS/지연은
  `http_server_requests`(Chanel /pay), Kafka consumer lag는 Micrometer 자동. **Prometheus 3.13.0(:9090)** 설치·7타깃 스크랩(5s) + **Grafana 13.1.0(:3000)** "RTGS Overview" 대시보드(접수 TPS·정산율·완결·Kafka lag·JVM) 완료.
- **헬스(B5)**: 전 서비스(헤드리스 포함)가 `service_heartbeat`에 주기 하트비트 → LouisVuitton `/admin/health` 및
  관리자 대시보드에서 UP/STALE 표시(DB 기반 liveness).
- 감사 이벤트(AUTH/AUTHZ/RATE/REPLAY/ORGBIND/PAY/DELIVER)와 처리 로그 중앙 수집.

---

## 9. 검증 설계 (복원력 급소, sim/)
| ID | 축 | 검증 | 상태 |
|---|---|---|---|
| S1 | 기능성 | 정합성·총액보존·계층대사 | **PASS** |
| S2 | 복원성 | Hermes 강제종료·재기동 무손실 승계 | **PASS** |
| S4 | 기능성 | 저널 순번 역전 주입 → 재정렬 | **PASS** |
| S3/S5 | 가용성/성능 | 정족수·펜싱 / 스파이크 완충 | 다센터(§11) |

---

## 10. 형상·배포 운영
- 소스: `backend`(Gradle 멀티모듈 7+1 common) · `frontend` · `infra` · `iso20022` · `sim` · `loadtest` · `docs`.
- 산출물: 서비스별 Spring Boot fat jar(`*-0.1.0.jar`). 프론트는 Vite 빌드.
- 스키마: **Flyway** `db/migration/V1__baseline.sql`(+ 이후 V2…) — LouisVuitton 기동 시 자동 적용. (구 `postgres-init.sql`은 legacy)
- 반영: 백엔드=재빌드+해당 서비스 재기동(무관 서비스 무중단), 프론트=Vite HMR.

---

## 11. 확장 아키텍처 (다센터 A-A-A, 향후 · 고사양 PC 이후)
```
                        ┌── DC1 (7서비스 + PostgreSQL rtgs_dc1)
[단일 Sequencer(리더선출)]─저널(Kafka 공유)─┼── DC2 (동일 + rtgs_dc2)
                        └── DC3 (동일 + rtgs_dc3)
  · 컨슈머 그룹 센터별 분리 · 센터별 DB/포트 오프셋 · 정족수 2/3 자동전환 · 펜싱
  · Gucci 센터별 배치 + 앞단 GSLB(무상태 라우팅) · 3센터 데이터 동일성 대사
```
- 순번기: active-standby 리더선출(4번째 사이트 불필요) — GSLB로 순서 결정 금지(무상태라 순서 권위 없음).
- 헬스체크(Gucci G3): 관측·멤버십 입력용, 실제 페일오버는 정족수+펜싱(단순 ping 페일오버는 split-brain).

---

## 12. 제약·전제·미결
- **제약**: 단일 호스트(가상화 차단으로 Docker 불가) · 로컬 1센터 · MongoDB 미사용.
- **전제**: 사전확인(잔액·계좌)은 참가기관(클라이언트) 책임, RTGS 코어는 기관 당좌계좌 간 이체만.
- **미결/후속**: 다센터 S3/S5, 프론트 Gucci 경유 로그인 UI, mTLS·비밀키 해시, Logstash 힙 256m, PC 이관.

---

## 부록 A. 포트 일람
Sequencer(논리)8090 · Chanel 8091 · Dior(논리)8092 · Hermes(논리)8093 · Prada(논리)8094 ·
Gucci 8095 · LouisVuitton 8099 · Frontend 5174 · PostgreSQL 5433 · Kafka 9092 ·
ES 9200 · Logstash 5000 · Kibana 5601. (acs와 전면 분리: acs 8080/5173/5432)

## 부록 B. 디렉터리
```
C:\ai-dev\apps\   포터블 런타임(jdk-21, gradle, kafka, postgresql, elk, k6, nodejs)
C:\ai-dev\home\   데이터·상태(pgsql-data, kafka, es-data, gradle 캐시)
C:\ai-dev\workspace\rtgs\  backend · frontend · infra · iso20022 · sim · loadtest · docs
```

*본 설계서는 개발 진행에 따라 갱신한다.*
