DBMS: MySQL 8.4 ยท InnoDB ยท utf8mb4_0900_ai_ci
๋์: 39๊ฐ ๋น์ฆ๋์ค ํ
์ด๋ธ + 8๊ฐ ๋น์ฆ๋์ค ์ธ ํ
์ด๋ธ (ledger_entry_id_sequence, batch_execution_lock, batch_execution_history, business_date_cutoff, cob_checkpoint, SPRING_SESSION, SPRING_SESSION_ATTRIBUTES, EVENT_PUBLICATION) ยท ํ
์ด๋ธ ๋ชฉ๋ก ๊ธฐ์ค 394๊ฐ ์ปฌ๋ผ
๊ทผ๊ฑฐ DDL: src/main/resources/db/migration/ ๋ด V ํ์ผ๋ค
์์ ์คํค๋ง ๋ ํผ๋ฐ์ค์ ๋๋ค. ๊ฐ์ ์ด๋ ฅยท๊ฐ์ถ ๊ทผ๊ฑฐยทํ์ธ ํ์ ํญ๋ชฉ์ DB_ERD_v3.md์ ์์ต๋๋ค.
| ํ๊ธฐ | ์๋ฏธ |
|---|---|
| PK | ๊ธฐ๋ณธํค |
| FK | ์ธ๋ํค. Null ์ด ์์ ์ฐธ์กฐ ๋์์ ์ ์๋ค |
| UK | ์ ๋ํฌ ํค |
Null = X |
NOT NULL |
Null = O |
NULL ํ์ฉ |
๊ธ์ก์ ์ ๋ถ BIGINT(์ ๋จ์ ์ ์), ๊ธ๋ฆฌ๋ DECIMAL(5,2)(์ฐ %), ๊ณ์ข๋ฒํธ๋ CHAR(12), ๊ฑฐ๋๋ฒํธ๋ CHAR(20)์
๋๋ค.
์๊ฐ์ DATETIME(6)์
๋๋ค. MySQL์ DATETIME์ ์๊ฐ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง ์๋ ๋ฒฝ์๊ฐ(wall-clock) ๊ทธ๋๋ก๋ฅผ ์ ์ฅํ๋ฉฐ ์๋ UTC ๋ณํ์ด ์์ต๋๋ค โ KST๋ ์ ํ๋ฆฌ์ผ์ด์
(Hibernate hibernate.jdbc.time_zone, JDBC connectionTimeZone, JpaAuditingConfig์ Clock)์ด ๊ฐ์ ์ฐ๊ณ ์ฝ์ ๋ ์งํค๋ ์ ์ฅยทํ์ ๊ณ์ฝ์
๋๋ค.
| # | ํ ์ด๋ธ | ์ค๋ช | ๋ด๋น | ์ปฌ๋ผ |
|---|---|---|---|---|
| 1 | customer |
๊ณ ๊ฐ | P6 | 19 |
| 2 | terms |
์ฝ๊ด | P6 | 10 |
| 3 | customer_terms_agreement |
ํ์๊ฐ์ ์ฝ๊ด ๋์ | P6 | 4 |
| 4 | verification_request |
์ธ์ฆ ์์ฒญ | P6 | 13 |
| 5 | notification |
์๋ฆผ | P1 | 9 |
| 6 | product |
์ํ | P3 | 25 |
| 7 | product_rate_tier |
์ํ ๊ธฐ๊ฐ๋ณ ๊ธ๋ฆฌ | P3 | 3 |
| 8 | product_preferential_rate |
์ํ ์ฐ๋๊ธ๋ฆฌ | P3 | 4 |
| 9 | product_terms |
์ํ-์ฝ๊ด ์ฐ๊ฒฐ | P3 | 3 |
| 10 | account |
๊ณ์ข | P2 | 23 |
| 11 | account_number_sequence |
๊ณ์ข๋ฒํธ ์ฑ๋ฒ ๊ท์น | P2 | 8 |
| 12 | transaction_sequence |
๊ฑฐ๋๋ฒํธ ์ผ๋ จ๋ฒํธ ์ฑ๋ฒ | P4 | 4 |
| 13 | transfer |
์ด์ฒด ๊ฑฐ๋ | P4 | 26 |
| 14 | ledger_entry |
์์ฅ | P4 | 14 |
| 15 | ledger_entry_id_sequence |
์์ฅ PK ์ ์ฉ ์ฑ๋ฒ | P4 | 1 |
| 16 | favorite_account |
์์ฃผ ์ฐ๋ ๊ณ์ข | P4 | 6 |
| 17 | transfer_limit |
์ด์ฒดํ๋ | P1 | 5 |
| 18 | transfer_limit_daily_usage |
์ผ๋ณ ํ๋ ์ฌ์ฉ์ก | P1 | 5 |
| 19 | transfer_limit_history |
์ด์ฒดํ๋ ๋ณ๊ฒฝ ์ด๋ ฅ | P1 | 6 |
| 20 | product_subscription |
์ํ๊ฐ์ | P3 | 19 |
| 21 | subscription_terms_agreement |
์ํ ์ฝ๊ด ๋์ | P3 | 5 |
| 22 | scheduled_transfer |
์์ฝ์ด์ฒด | P3 | 18 |
| 23 | auto_transfer |
์๋์ด์ฒด ๋ฑ๋ก | P5 | 18 |
| 24 | auto_transfer_execution |
์๋์ด์ฒด ํ์ฐจ ์คํ๊ฒฐ๊ณผ | P5 | 8 |
| 25 | idempotency_key |
๋ฉฑ๋ฑํค | P5 | 9 |
| 26 | audit_log |
๊ฐ์ฌ ๋ก๊ทธ | P5 | 8 |
| 27 | common_code |
๊ณตํต์ฝ๋ | P5 | 8 |
| 28 | batch_execution_lock |
๋ฐฐ์น ์ค๋ณต ํธ๋ฆฌ๊ฑฐ ๋ฐฉ์ง ๋ฝ | P5 | 3 |
| 29 | gl_account |
๊ณ์ ๊ณผ๋ชฉ | P3 | 6 |
| 30 | gl_voucher |
์ ํ | P3 | 6 |
| 31 | gl_journal_entry |
๋ถ๊ฐ | P3 | 8 |
| 32 | business_date |
ํ์ฌ ์์ ์ผ | P5 | 4 |
| 33 | holiday |
ํด์ผ ๋ฌ๋ ฅ | P5 | 4 |
| 34 | gl_voucher_sequence |
์ ํ๋ฒํธ ์ผ๋ จ๋ฒํธ ์ฑ๋ฒ | P3 | 4 |
| 35 | auth_token |
์ผํ์ฑ ์ธ์ฆ ํ ํฐ | P4 | 9 |
| 36 | otp_issue_lock |
OTP ๋ฐ๊ธ ์ ๊ธ | P4 | 3 |
| 37 | terms_view_history |
์ํ ์ฝ๊ด ์ด๋ ์ด๋ ฅ | P4 | 4 |
| 38 | batch_execution_history |
๋ฐฐ์น ์คํ ์คํ ๊ธฐ๋ก | P5 | 8 |
| 39 | ledger_reconciliation_mismatch |
์์ฅ-์์ก ๋์ฌ ๋ถ์ผ์น ๋ชฉ๋ก | P4 | 6 |
| 40 | admin_permission |
๊ด๋ฆฌ์ ๊ถํ | P1 | 3 |
| 41 | account_status_history |
๊ณ์ข ์ํ ์ ์ด ์ด๋ ฅ | P2 | 8 |
| 42 | business_date_cutoff |
์์ ์ผ ๋ง๊ฐ cutoff | P5 | 4 |
| 43 | interest_payment |
์์ ๊ธ ์ด์ ์ง๊ธ ์ด๋ ฅ | P2 | 9 |
| 44 | SPRING_SESSION |
๊ณต์ฉ HTTP ์ธ์ | P6 | 7 |
| 45 | SPRING_SESSION_ATTRIBUTES |
์ง๋ ฌํ๋ ์ธ์ ์์ฑ | P6 | 3 |
| 46 | EVENT_PUBLICATION |
์ด๋ฒคํธ ๋ฐํ ๊ธฐ๋ก (Spring Modulith) | P1 | 9 |
| 47 | cob_checkpoint |
COB ์ฌ์์ ์ฒดํฌํฌ์ธํธ | P5 | 5 |
Spring Session JDBC ํ์ค ์คํค๋ง. Flyway V202610221420์ผ๋ก๋ง ์์ฑํ๋ฉฐ JPA ์ํฐํฐ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
์ธ์
์ ์๊ฐ์ ํ๋ ์์ํฌ ๊ณ์ฝ์ ๋ฐ๋ผ UTC epoch ๋ฐ๋ฆฌ์ด BIGINT์ด๊ณ ์
๋ฌด ํ
์ด๋ธ์ KST DATETIME(6) ๊ท์ฝ์ ์์ธ๋ค.
| ํ ์ด๋ธ | ์ปฌ๋ผ | ํ์ | ํคยทNULL | ์๋ฏธ |
|---|---|---|---|---|
| SPRING_SESSION | PRIMARY_ID | CHAR(36) | PK, NOT NULL | ๋ด๋ถ ์ธ์ ํ UUID |
| SPRING_SESSION | SESSION_ID | CHAR(36) | UK, NOT NULL | ์ฟ ํค๋ก ์ฐ๊ฒฐํ๋ ์ธ์ ID |
| SPRING_SESSION | CREATION_TIME | BIGINT | NOT NULL | ์์ฑ epoch ms |
| SPRING_SESSION | LAST_ACCESS_TIME | BIGINT | NOT NULL | ๋ง์ง๋ง ์ ๊ทผ epoch ms |
| SPRING_SESSION | MAX_INACTIVE_INTERVAL | INT | NOT NULL | ๋ฌด์กฐ์ ๋ง๋ฃ ์ด: ๊ณ ๊ฐ 600, ๊ด๋ฆฌ์ 1800(PH-49a-โก ๋ก๊ทธ์ธ ์ ์ฑ ) |
| SPRING_SESSION | EXPIRY_TIME | BIGINT | INDEX, NOT NULL | ๋ง๋ฃ epoch ms |
| SPRING_SESSION | PRINCIPAL_NAME | VARCHAR(100) | INDEX, NULL ํ์ฉ | ์ธ์ฆ ๊ณ ๊ฐ PK ๋ฌธ์์ด, ์ต๋ช ์ธ์ ์ NULL |
| SPRING_SESSION_ATTRIBUTES | SESSION_PRIMARY_ID | CHAR(36) | ๋ณตํฉ PKยทFK, NOT NULL | PRIMARY_ID ์ฐธ์กฐ, ON DELETE CASCADE |
| SPRING_SESSION_ATTRIBUTES | ATTRIBUTE_NAME | VARCHAR(200) | ๋ณตํฉ PK, NOT NULL | SPRING_SECURITY_CONTEXT ๋ฑ ์์ฑ ์ด๋ฆ |
| SPRING_SESSION_ATTRIBUTES | ATTRIBUTE_BYTES | BLOB | NOT NULL | ์ง๋ ฌํํ ์์ฑ ๊ฐ |
์ธ๋ฑ์ค: SPRING_SESSION_IX1(SESSION_ID) UNIQUE, SPRING_SESSION_IX2(EXPIRY_TIME),
SPRING_SESSION_IX3(PRINCIPAL_NAME). PRINCIPAL_NAME์ ๊ณ ๊ฐ FK๊ฐ ์๋ ํ๋ ์์ํฌ ๊ฒ์ ์ธ๋ฑ์ค๋ค.
๋ก๊ทธ์์์ ํด๋น ์ธ์
๋ง ์ญ์ ํ๊ณ ๊ณ ๊ฐ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ์ ๊ณ ๊ฐ PK๋ก ๋ชจ๋ ์ธ์
์ ์ญ์ ํ๋ค.
์ธ์
์ญ์ ๋ ํด๋น ์
๋ฌด ํธ๋์ญ์
์ ์ฐธ์ฌํ๋ฏ๋ก ์
๋ฌด ๋กค๋ฐฑ ์ ํจ๊ป ๋กค๋ฐฑํ๋ค. ๋ง๋ฃ ํ ์ ๋ฆฌ๋ ๋งค๋ถ์ด๋ฉฐ ์ธ์ฆ ๋ง๋ฃ๋ ์ฆ์ ์ ์ฉ๋๋ค.
๊ณ ๊ฐ
์ ์ ์ด๋ ฅ(๊ตฌ login_history)์ ํก์ํ๋ค. ๋์๋ณด๋๊ฐ ์ฐ๋ ๊ฐ์ด ์ง์ ยทํ์ฌ 2๊ฑด๋ฟ์ด๋ผ ๋ณ๋ ํ
์ด๋ธ์ ๋์ง ์๋๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
customer_id |
BIGINT |
PK | X | ๊ณ ๊ฐ ๋ด๋ถ ์๋ณ์. ๋ช
์ธ์ customerId. ํด๋ผ์ด์ธํธ์ ๋
ธ์ถ๋๋ ์ ์ผํ ๊ณ ๊ฐ ํค |
|
user_id |
VARCHAR(20) |
UK | X | ๊ณ ๊ฐ์ด ์ง์ ์ ํ ๋ก๊ทธ์ธ ์์ด๋. ๋ด๋ถ PK์ธ customer_id์ ๋ค๋ฅธ ํ๋ฉด ์
๋ ฅ๊ฐ์ด๋ค |
|
existing_bank_customer_id |
VARCHAR(100) |
UK | O | ์ค๋ช ๊ณ์ข ์ธ์ฆ์ผ๋ก ํ์ธํ ๊ธฐ์กด ์ํ ์์ฅ์ ๊ณ ๊ฐ ์๋ณ์. ์ฌ๊ฐ์ ํ์ ๊ธฐ์ค(ATH0303). ์ค์๋น์ค์ CI ๋๋ฆฌ ํค์ด๋ฉฐ, ์์ฅ ์ธ์ฆ ์์ด ๋ง๋ค์ด์ง ๊ธฐ์กด ํ์ NULL | |
password_hash |
CHAR(60) |
X | ๋ก๊ทธ์ธ ๋น๋ฐ๋ฒํธ์ BCrypt ํด์. ํ๋ฌธยท๋ณตํธํ ๊ฐ๋ฅ ์ํธํ ๊ธ์ง | ||
user_name |
VARCHAR(50) |
X | ๊ณ ๊ฐ ์ค๋ช
. ์๋ต ์ ์ด๋ฆ ๊ธธ์ด๋ณ ๋ง์คํน ์ ์ฉ (2์ ์ด* / 3์ ํ*๋ / 4์ ์ด์ ๋จ**์) |
||
birth_date |
DATE |
X | ์๋ ์์ผ. ์ค๋ช ๊ณ์ข ์ธ์ฆยท์์ด๋ ์ฐพ๊ธฐ์ ๋์กฐ๊ฐ. ๋ก๊ทธ ํ๋ฌธ ๊ธฐ๋ก ๊ธ์ง | ||
email |
VARCHAR(100) |
UK | X | ์ด๋ฉ์ผ ์ฃผ์. ์ฐ๋ฝ์ฒ ๊ฒธ ์ธ์ฆ ์๋จ. ์ค๋ณต ๊ฐ์ ์๋ ์ ATH0302 | |
phone_number |
VARCHAR(11) |
X | ํด๋ํฐ ๋ฒํธ. ํ์ดํ ์์ด ์ซ์๋ง ์ ์ฅํ๊ณ ์๋ต ์ ์ค๊ฐ 4์๋ฆฌ๋ฅผ ๋ง์คํนํ๋ค | ||
login_failure_count |
TINYINT |
X | 0 |
๋ก๊ทธ์ธ ๋น๋ฐ๋ฒํธ ์ฐ์ ์ค๋ฅ ํ์. 5ํ ๋๋ฌ ์ account_locked๊ฐ TRUE๋ก ๋ฐ๋๋ค (ATH0102) |
|
account_locked |
BOOLEAN |
X | FALSE |
๊ณ์ ์ ๊ธ ์ฌ๋ถ. login_failure_count 5ํ ๋๋ฌ ์ TRUE, ๊ด๋ฆฌ์ ์ ๊ธ ํด์ ๋ก FALSE ๋ณต๊ท |
|
status |
VARCHAR(12) |
X | ACTIVE |
๊ณ์ ์ํ. ACTIVE(์ ์) / SUSPENDED(์ด์ฉ์ ์ง). ๊ด๋ฆฌ์๋ง ๋ฐ๊พผ๋ค. SUSPENDED๋ฉด ๋น๋ฐ๋ฒํธ๊ฐ ๋ง์๋ ๋ก๊ทธ์ธ์ ๊ฑฐ๋ถํ๋ค(ATH0106). ๋น๋ฐ๋ฒํธ 5ํ ์ค๋ฅ ์ ๊ธ(account_locked)๊ณผ ๋ณ๊ฐ์ด๋ฉฐ ๋์ด ๋์์ ๊ฑธ๋ฆด ์ ์๋ค |
|
role |
VARCHAR(12) |
X | CUSTOMER |
๊ณ์ ๊ตฌ๋ถ. CUSTOMER(๊ณ ๊ฐ) / ADMIN(๊ด๋ฆฌ์). ๊ด๋ฆฌ์ ๋ก๊ทธ์ธ์ /admin/auth/login์ผ๋ก ๋ถ๋ฆฌ๋๊ณ ์ด ๊ฐ์ด ADMIN์ธ ๊ณ์ ๋ง ํต๊ณผํ๋ค |
|
last_login_at |
DATETIME(6) |
O | ๊ฐ์ฅ ์ต๊ทผ ๋ก๊ทธ์ธ ์๊ฐ. ๋์๋ณด๋์ currentLoginAt |
||
last_login_ip |
VARCHAR(45) |
O | ๊ฐ์ฅ ์ต๊ทผ ๋ก๊ทธ์ธ IP. ๋์๋ณด๋์ currentLoginIp |
||
previous_login_at |
DATETIME(6) |
O | ์ง์ ๋ก๊ทธ์ธ ์๊ฐ. ๋์๋ณด๋์ previousLoginAt. ๋ถ์ ์ ์์ ๊ณ ๊ฐ์ด ์์์ฑ๋ ๋จ์ |
||
password_changed_at |
DATETIME(6) |
O | ๋ก๊ทธ์ธ ๋น๋ฐ๋ฒํธ ์ต์ข ๋ณ๊ฒฝ ์ผ์. ์ง์ ๋น๋ฐ๋ฒํธ ์ฌ์ฌ์ฉ ์ ํ(ATH0003) ํ์ ๋ณด์กฐ | ||
joined_at |
DATETIME(6) |
X | ํ์๊ฐ์
์๋ฃ ์ผ์. ๊ณ ๊ฐ์ ๋ณด ์กฐํ์ joinedAt |
||
created_at |
DATETIME(6) |
X | ํ ์์ฑ ์ผ์ | ||
updated_at |
DATETIME(6) |
X | ํ ์ต์ข ์์ ์ผ์ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_customer_user_id |
user_id |
| UNIQUE | uk_customer_email |
email |
| UNIQUE | uk_customer_existing_bank_customer_id |
existing_bank_customer_id |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด | ์ค๋ช |
|---|---|---|
ck_customer_status |
status IN ('ACTIVE', 'SUSPENDED') |
๊ณ์ ์ํ๋ ์ ์ยท์ด์ฉ์ ์ง ์ค ํ๋์ฌ์ผ ํ๋ค. |
ck_customer_role |
role IN ('CUSTOMER', 'ADMIN') |
๊ณ์ ๊ตฌ๋ถ์ ๊ณ ๊ฐยท๊ด๋ฆฌ์ ์ค ํ๋์ฌ์ผ ํ๋ค. |
๊ด๋ฆฌ์ ๊ถํ (#561)
ํ ํ๋๊ฐ ๊ถํ ํ๋๋ค. ๊ถํ์ด ์๋ ๊ด๋ฆฌ์๋ ํ์ด 0๊ฐ์ด๋ฉฐ, ๊ด๋ฆฌ์์ธ์ง ์๋์ง๋ customer.role๋ก ๊ฐ๋ฆฐ๋ค.
CSV ํ ์นธ์ ๋ด์ง ์๋ ์ด์ ๋ ์คํ๋ฅผ DB๊ฐ ๋ง์ง ๋ชปํ๊ณ common_code์ ํ์๋ช
๊ณผ ๊ฐ์ด ์ด์ด์ง์ง ์๊ธฐ
๋๋ฌธ์ด๋ค(PR #572 ๋ฆฌ๋ทฐ). ๋ถ์ฌยทํ์ API๋ PH-49b ๋ชซ์ด๊ณ ์ด ์์ ์๋ ์๋๋ก๋ง ๋ฃ๋๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | NULL | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|---|---|---|
customer_id |
BIGINT |
PK, FK | X | ๊ถํ์ ๊ฐ์ง ๊ด๋ฆฌ์. customer.customer_id ์ฐธ์กฐ |
|
permission |
VARCHAR(20) |
PK | X | ๊ถํ ํ๋. GL_READยทGL_WRITEยทCUSTOMER_READยทCUSTOMER_WRITEยทAUDIT_READ. common_code์ ADMIN_PERMISSION ๊ทธ๋ฃน๊ณผ ๊ฐ์ด ๊ฐ๋ค |
|
granted_at |
DATETIME(6) |
X | ๊ถํ์ ์ค ์๊ฐ. ํ์๋ ํ ์ญ์ ๋ผ ์ด๋ ฅ์ audit_log๊ฐ ๋งก๋๋ค |
๊ธฐ๋ณธํค โ (customer_id, permission) ๋ณตํฉ. ๊ฐ์ ๊ถํ์ด ๋ ๋ฒ ๋ค์ด๊ฐ์ง ์๋๋ค.
์ธ๋ํค
| ์ด๋ฆ | ์ปฌ๋ผ | ์ฐธ์กฐ |
|---|---|---|
fk_admin_permission_customer |
customer_id |
customer(customer_id) |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด | ์ค๋ช |
|---|---|---|
ck_admin_permission |
permission COLLATE utf8mb4_0900_as_cs IN ('GL_READ', 'GL_WRITE', 'CUSTOMER_READ', 'CUSTOMER_WRITE', 'AUDIT_READ') |
๊ณ ์ 5์ข
๋ง ํ์ฉํ๋ค. common_code๋ code_group์ผ๋ก ์ฌ๋ฌ ์ข
๋ฅ๋ฅผ ํจ๊ป ๋ด์ FK๋ฅผ ๊ฑธ ์ ์์ด CHECK๋ก ๊ณ ์ ํ๊ณ , ๊ถํ์ด ๋๋ฉด ๋์ ํจ๊ป ๋ฐ๊พผ๋ค. |
์ฝ๊ด (ํ์๊ฐ์ ยท์ํ ๊ณต์ฉ)
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
terms_id |
BIGINT |
PK | X | ์ฝ๊ด ๋ด๋ถ ์๋ณ์. ๋ฒ์ ๋ง๋ค ๋ณ๋ ํ์ด๋ฏ๋ก ๊ฐ์ ํ๋ฉด ์ ID๊ฐ ๋ฐ๊ธ๋๋ค | |
terms_code |
VARCHAR(30) |
UK | X | ์ฝ๊ด ์ข
๋ฅ ์ฝ๋. ๋ฒ์ ์ด ๋ฌ๋ผ๋ ๋์ผํ ๊ฐ (์: TERMS_PRIVACY) |
|
version |
VARCHAR(10) |
UK | X | ์ฝ๊ด ๋ฒ์ ๋ฌธ์์ด. ์ํ๊ฐ์ ์ ๋์ ๋ฒ์ ๋์กฐ(PRD0006)์ ๊ธฐ์ค | |
terms_type |
VARCHAR(20) |
X | ์ฝ๊ด ์ฐ์์ ๊ตฌ๋ถ. SIGNUP(ํ์๊ฐ์
์ฝ๊ด) / PRODUCT(์ํ ๊ฐ์
์ฝ๊ด) |
||
title |
VARCHAR(200) |
X | ์ฝ๊ด ์ ๋ชฉ. ๋ชฉ๋ก ํ๋ฉด ํ์์ฉ | ||
content |
TEXT |
X | ์ฝ๊ด ์ ๋ฌธ. ์ฝ๊ด ๋ณธ๋ฌธ ์กฐํ ์๋ต์ content |
||
is_required |
BOOLEAN |
X | FALSE |
ํ์ ๋์ ์ฌ๋ถ. FALSE๋ฉด ์ ํ ์ฝ๊ด์ด๋ผ ๋ฏธ๋์ํด๋ ๊ฐ์ ์ด ์งํ๋๋ค | |
view_required |
BOOLEAN |
X | FALSE |
์ ๋ฌธ ์ด๋ ๊ฐ์ ์ฌ๋ถ. TRUE๋ฉด ๋์ ์ ์ ๋ณธ๋ฌธ์ ์ด์ด์ผ ํ๋ฉฐ ์ด๋ ฅ์ด ์์ผ๋ฉด PRD0005 | |
created_at |
DATETIME(6) |
X | ํ ์์ฑ ์ผ์ | ||
updated_at |
DATETIME(6) |
X | ํ ์ต์ข ์์ ์ผ์ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_terms_code_version |
terms_code, version |
ํ์๊ฐ์ ์ฝ๊ด ๋์
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
agreement_id |
BIGINT |
PK | X | ๋์ ์ด๋ ฅ ๋ด๋ถ ์๋ณ์ | |
customer_id |
BIGINT |
FK UK | X | ๋์ํ ๊ณ ๊ฐ โ customer.customer_id |
|
terms_id |
BIGINT |
FK UK | X | ๋์ ๋์ ์ฝ๊ด. ๋ฒ์ ์ด ํฌํจ๋ ํ์ ๊ฐ๋ฆฌํจ๋ค โ terms.terms_id |
|
agreed_at |
DATETIME(6) |
X | ๋์ ์๊ฐ. ๋ถ์ ์ ์ฆ๊ฑฐ๊ฐ ๋๋ฏ๋ก ๊ฐฑ์ ํ์ง ์๊ณ ํ์ ์๋ก ์๋๋ค |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_cta |
customer_id, terms_id |
์ธ์ฆ ์์ฒญ (์ด๋ฉ์ผยท๋น๋ฐ๋ฒํธ์ฌ์ค์ ยทOTP ํตํฉ). *AuthToken ์
auth_token
์ด๋ฉ์ผ ์ธ์ฆยท๋น๋ฐ๋ฒํธ ์ฌ์ค์ ยทOTP๋ฅผ ํ๋๋ก ํฉ์ณค๋ค. ์
๋ค ์ฝ๋ ๋ฐ๊ธ โ ๊ฒ์ฆ โ ๋ง๋ฃ โ 1ํ์ฉ ๊ตฌ์กฐ๊ฐ ๊ฐ๊ณ ์๋ณ์๊ฐ ๋ชจ๋ String์ด๋ผ ํตํฉ์ด ๊ฐ๋ฅํ๋ค. ๊ฒ์ฆ ๊ฒฐ๊ณผ๋ก ๋ฐ๊ธ๋๋ *AuthToken์ ์ด ํ
์ด๋ธ์ด ์๋๋ผ auth_token์ ์๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
verification_request_id |
VARCHAR(64) |
PK | X | ์ธ์ฆ ์์ฒญ ์๋ณ์. ์ฉ๋๋ณ ์ ๋์ด(EVF_ ์ด๋ฉ์ผ / PRR_ ๋น๋ฐ๋ฒํธ ์ฌ์ค์ / OTP_REQ_ OTP) + CSPRNG ๋์. ๋ช
์ธ์ emailVerificationIdยทpasswordResetRequestIdยทotpRequestId๊ฐ ๋ชจ๋ ์ด ์ปฌ๋ผ์ด๋ค |
|
purpose |
VARCHAR(24) |
X | ์ธ์ฆ ์์ฒญ์ ์ฉ๋. SIGN_UP / EMAIL_CHANGE / PASSWORD_RESET / OTP_TRANSACTION. ์ธ ์์ฒญ์ ํ ํ
์ด๋ธ์ ํฉ์น ๊ตฌ๋ถ ์ถ |
||
customer_id |
BIGINT |
FK | O | ์์ฒญ ๊ณ ๊ฐ. ํ์๊ฐ์
์ ์ด๋ฉ์ผ ์ธ์ฆ์ ๊ณ ๊ฐ์ด ์์ง ์์ด NULL โ customer.customer_id |
|
target |
VARCHAR(100) |
O | ์ธ์ฆ ๋์ ๊ฐ. ์ด๋ฉ์ผ ์ธ์ฆ์ ์์ ์ด๋ฉ์ผ ์ฃผ์๊ฐ ๋ค์ด๊ฐ๊ณ OTP๋ ๋น์ด ์๋ค | ||
code_hash |
CHAR(60) |
X | ์ธ์ฆ๋ฒํธยทOTP 6์๋ฆฌ์ ๋จ๋ฐฉํฅ ํด์. ํ๋ฌธ ์ ์ฅยท๋ก๊ทธ ๊ธฐ๋ก ๊ธ์ง | ||
transaction_type |
VARCHAR(32) |
O | OTP ์ ์ฉ. ์ด๋ค ๊ฑฐ๋๋ฅผ ์น์ธํ๋ ค๋ OTP์ธ์ง (IMMEDIATE_TRANSFER ๋ฑ) |
||
transaction_data |
JSON |
O | OTP ์ ์ฉ. ์ถ๊ธ๊ณ์ขยท์ ๊ธ๊ณ์ขยท๊ธ์ก ๋ฑ ๊ฑฐ๋ ํต์ฌ ์ ๋ณด. ์ต์ข ๊ฑฐ๋ API๊ฐ ์์ฒญ ๋ณธ๋ฌธ๊ณผ ๋์กฐํด ๋ณ์กฐ๋ฅผ ์ก๋๋ค (OTP0102) | ||
error_count |
TINYINT |
X | 0 |
์ธ์ฆ๋ฒํธ ์ฐ์ ์ค๋ฅ ํ์. 5ํ์ ๋๋ฌํ๋ฉด locked๊ฐ TRUE๊ฐ ๋๋ค (OTP0103) |
|
locked |
BOOLEAN |
X | FALSE |
์ ๊ธ ์ฌ๋ถ. error_count๊ฐ 5์ด๋ฉด TRUE. ์ฌ๋ฐ๊ธ ์ ๊น์ง ๊ฒ์ฆ ๋ถ๊ฐ (OTP0103) |
|
used |
BOOLEAN |
X | FALSE |
์ฌ์ฉ ์๋ฃ ์ฌ๋ถ. ๊ฒ์ฆ ์ฑ๊ณต ์ TRUE๋ก ๋ฐ๊ฟ ์ฌ์ฌ์ฉ์ ๋ง๋๋ค | |
verified_at |
DATETIME(6) |
O | ๊ฒ์ฆ ์ฑ๊ณต ์๊ฐ. ๋ฏธ๊ฒ์ฆ์ด๋ฉด NULL | ||
expires_at |
DATETIME(6) |
X | ์ ํจ์๊ฐ ๋ง๋ฃ ์๊ฐ. ๋ฐ๊ธ ์๊ฐ + 180์ด | ||
created_at |
DATETIME(6) |
X | ๋ฐ๊ธ ์์ฒญ ์๊ฐ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| INDEX | ix_vr_customer |
customer_id, purpose, created_at DESC |
| INDEX | ix_vr_target |
target, purpose, created_at DESC |
์ด๋ฉ์ผ ์ธ์ฆ๋ฒํธ ๋ฐ๊ธ์ target(์ด๋ฉ์ผ) + purpose ๋จ์๋ก ์ง๋ ฌํํฉ๋๋ค. ๊ฐ์ ์กฐํฉ์ ๋์ ์ฌ๋ฐ๊ธ๋ ๊ธฐ์กด ํ์ฑ ์์ฒญ ๋ฌดํจํ์ ์ ๊ท ์์ฒญ ์ ์ฅ์ ์์๋๋ก ์ํํ์ฌ, ๋ง์ง๋ง์ผ๋ก ์ฒ๋ฆฌ๋ ์์ฒญ ํ๋๋ง used = FALSE ์ํ๋ก ๋จ๊ฒจ์ผ ํฉ๋๋ค. SIGN_UP๊ณผ EMAIL_CHANGE์ฒ๋ผ ๋ชฉ์ ์ด ๋ค๋ฅธ ์์ฒญ์ ์๋ก ๋ฌดํจํํ์ง ์์ต๋๋ค.
์๋ฆผ
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
notification_id |
BIGINT |
PK | X | ์๋ฆผ ๋ด๋ถ ์๋ณ์. ์ฝ์ ์ฒ๋ฆฌ API์ ๊ฒฝ๋ก ๋ณ์ | |
customer_id |
BIGINT |
FK | X | ์์ ๊ณ ๊ฐ โ customer.customer_id |
|
type |
VARCHAR(24) |
UK | X | ์๋ฆผ์ ๋ฐ์์ํจ ์
๋ฌด ๊ตฌ๋ถ. TRANSFER(์ฆ์ ยท ํํ์ด์ฒด) / SCHEDULED_TRANSFER(์์ฝ์ด์ฒด) / AUTO_TRANSFER(์๋์ด์ฒด) / PRODUCT_SUBSCRIPTION(์ํ๊ฐ์
) |
|
ref_id |
BIGINT |
UK | O | ๋คํ ์ฐธ์กฐ: TRANSFER->transfer.transfer_id / SCHEDULED_TRANSFER->scheduled_transfer_id / AUTO_TRANSFER->auto_transfer_execution.execution_id / PRODUCT_SUBSCRIPTION->subscription_id | |
title |
VARCHAR(100) |
X | ์๋ฆผ ์ ๋ชฉ. ๋ชฉ๋ก ํ๋ฉด์ ํ ์ค ์์ฝ | ||
content |
VARCHAR(500) |
X | ์๋ฆผ ๋ณธ๋ฌธ ๋ฌธ๊ตฌ | ||
is_read |
BOOLEAN |
X | FALSE |
์ฝ์ ์ฌ๋ถ. ๋ฏธ์ฝ์ ๊ฑด์ ์กฐํ์ ์ง๊ณ ๋์ | |
read_at |
DATETIME(6) |
O | ์ฝ์ ์ฒ๋ฆฌ ์๊ฐ. ๋ฏธ์ฝ์์ด๋ฉด NULL | ||
occurred_at |
DATETIME(6) |
X | ์๋ฆผ ๋ฐ์ ์๊ฐ. ๋ชฉ๋ก ์ ๋ ฌ ๊ธฐ์ค |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| INDEX | ix_noti_customer |
customer_id, is_read, occurred_at DESC |
| UNIQUE | uk_noti_type_ref |
type, ref_id โ ๊ตฌ๋
์๊ฐ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ ๋ฒ ๋ฐ์๋ ์๋ฆผ์ 1๊ฑด(#706) |
์ํ
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
product_id |
BIGINT |
PK | X | ์ํ ๋ด๋ถ ์๋ณ์. ์ํ ์์ธยท๊ฐ์
API์ productId |
|
product_code |
VARCHAR(20) |
UK | X | ์ํ ์ ๋ฌด ์ฝ๋. ํ๋ฉดยท์๋ ๋ฐ์ดํฐ๊ฐ ์ํ์ ์ง์นญํ๋ ์์ ์ ํค | |
product_name |
VARCHAR(100) |
X | ํ๋ฉด์ ๋ ธ์ถํ๋ ์ํ๋ช | ||
product_group |
VARCHAR(12) |
X | SAVINGS(์ ๊ธฐ์ ๊ธ) / DEPOSIT(์ ๊ธฐ์๊ธ) | ||
deposit_type |
VARCHAR(20) |
X | ๋ฉ์
๋ฐฉ์. LUMP_SUM(ํ ๋ฒ์ ์์น) / INSTALLMENT(๋งค์ ๋ฉ์
) |
||
summary |
VARCHAR(200) |
O | ์ํ ํ ์ค ์์ฝ. ๋ชฉ๋ก ํ๋ฉด์ฉ | ||
description |
TEXT |
O | ์ํ ์์ธ ์ค๋ช . ์์ธ ํ๋ฉด์ฉ | ||
eligibility |
TEXT |
O | ๊ฐ์
์๊ฒฉ ์กฐ๊ฑด ์๋ด ๋ฌธ๊ตฌ. ์์ธ์กฐํ data.eligibility |
||
subscription_restrictions |
TEXT |
O | ๊ฐ์
์ ํ ์ฌํญ ๋ชฉ๋ก(JSON ๋ฐฐ์ด ๋ฌธ์์ด). ์์ธ์กฐํ data.subscriptionRestrictions. ์ ํ๋ฆฌ์ผ์ด์
์ StringListJsonConverter๊ฐ List<String>์ผ๋ก ๋ณํ |
||
notices |
TEXT |
O | ์ ์์ฌํญ ๋ชฉ๋ก(JSON ๋ฐฐ์ด ๋ฌธ์์ด). ์์ธ์กฐํ data.notices. subscription_restrictions์ ๋์ผํ ์ปจ๋ฒํฐ ์ฌ์ฉ |
||
base_rate |
DECIMAL(5,2) |
X | ๊ธฐ๋ณธ๊ธ๋ฆฌ(์ฐ %). ์ฐ๋๊ธ๋ฆฌ๋ฅผ ์ ์ธํ ๊ธฐ์ค๊ฐ | ||
max_rate |
DECIMAL(5,2) |
X | ์ต๊ณ ๊ธ๋ฆฌ(์ฐ %). ์ฐ๋ ์กฐ๊ฑด์ ๋ชจ๋ ์ฑ์ ์ ๋์ ์ํ. ๋ชฉ๋ก ํ๋ฉด ํ์์ฉ | ||
min_amount |
BIGINT |
X | ์ต์ ๊ฐ์ ๊ธ์ก. ๋ฏธ๋ง์ด๋ฉด PRD0001 | ||
max_amount |
BIGINT |
X | ์ต๋ ๊ฐ์ ๊ธ์ก. ์ด๊ณผํ๋ฉด PRD0001 | ||
amount_unit |
BIGINT |
X | ๊ฐ์ ๊ธ์ก ์ ๋ ฅ ๋จ์. ์ด ๊ฐ์ ๋ฐฐ์๊ฐ ์๋๋ฉด PRD0004 | ||
min_term_months |
SMALLINT |
X | ์ต์ ๊ฐ์ ๊ธฐ๊ฐ(๊ฐ์). ๋ฏธ๋ง์ด๋ฉด PRD0002 | ||
max_term_months |
SMALLINT |
X | ์ต๋ ๊ฐ์ ๊ธฐ๊ฐ(๊ฐ์). ์ด๊ณผํ๋ฉด PRD0002 | ||
interest_pay_type |
VARCHAR(20) |
X | ์ด์ ๊ณ์ฐ ๋ฐฉ์. SIMPLE(๋จ๋ฆฌ) / COMPOUND(๋ณต๋ฆฌ) |
||
sale_status |
VARCHAR(12) |
X | ํ๋งค ์ํ. ON_SALE(ํ๋งค์ค) / SUSPENDED(ํ๋งค์ค์ง). ํ๋งค์ค์ง ์ํ์ ๋ชฉ๋ก ์กฐํ์์๋ ๋น ์ง์ง๋ง ์์ธ ์กฐํ๋ 200์ผ๋ก ์๋ตํ๋ค(์ฆ๊ฒจ์ฐพ๊ธฐยท๊ณต์ ๋งํฌ ์ง์
์ง์ ๋ชฉ์ , saleStatus๋ก ํ๋ก ํธ๊ฐ ๊ตฌ๋ถ) |
||
sale_start_date |
DATE |
O | ํ๋งค ์์์ผ | ||
sale_end_date |
DATE |
O | ํ๋งค ์ข ๋ฃ์ผ | ||
new_flag |
BOOLEAN |
X | FALSE |
์ ์ํ ๋ฑ์ง ํ์ ์ฌ๋ถ | |
single_account_limit |
BOOLEAN |
X | FALSE |
1์ธ 1๊ณ์ข ์ ํ ์ํ์ธ์ง. TRUE์ธ ์ํ๋ง ์ค๋ณต ๊ฐ์ ์ PRD0301์ ๋์ง๋ค | |
created_at |
DATETIME(6) |
X | ํ ์์ฑ ์ผ์ | ||
updated_at |
DATETIME(6) |
X | ํ ์ต์ข ์์ ์ผ์ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_product_code |
product_code |
| INDEX | ix_product_group_status |
product_group, sale_status |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด |
|---|---|
ck_product_amount |
min_amount <= max_amount AND min_amount > 0 |
ck_product_term |
min_term_months <= max_term_months AND min_term_months > 0 |
ck_product_rate |
base_rate <= max_rate AND base_rate >= 0 |
์ํ ๊ธฐ๊ฐ๋ณ ๊ธ๋ฆฌ
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
product_id |
BIGINT |
PK FK | X | ๋์ ์ํ โ product.product_id |
|
term_months |
SMALLINT |
PK | X | ๊ฐ์ ๊ธฐ๊ฐ(๊ฐ์). ์ด ๊ธฐ๊ฐ์ ๊ณจ๋์ ๋ ์ ์ฉ๋ ๊ธ๋ฆฌ๋ฅผ ์ ์ํ๋ค | |
rate |
DECIMAL(5,2) |
X | ํด๋น ๊ธฐ๊ฐ์ ์ ์ฉ๋๋ ๊ธฐ๋ณธ๊ธ๋ฆฌ(์ฐ %) |
์ํ ์ฐ๋๊ธ๋ฆฌ
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
product_id |
BIGINT |
PK FK | X | ๋์ ์ํ โ product.product_id |
|
condition_code |
VARCHAR(30) |
PK | X | ์ฐ๋ ์กฐ๊ฑด ์ฝ๋. ๊ธ์ฌ์ด์ฒดยท์๋์ด์ฒด ๋ฑ๋ก ๋ฑ ์กฐ๊ฑด์ ์๋ณํ๋ค | |
condition_name |
VARCHAR(100) |
X | ์ฐ๋ ์กฐ๊ฑด ์ค๋ช . ํ๋ฉด ํ์์ฉ | ||
rate |
DECIMAL(5,2) |
X | ์กฐ๊ฑด ์ถฉ์กฑ ์ ๊ฐ์ฐ๋๋ ๊ธ๋ฆฌ(์ฐ %) |
์ํ-์ฝ๊ด ์ฐ๊ฒฐ
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
product_id |
BIGINT |
PK FK | X | ๋์ ์ํ โ product.product_id |
|
terms_id |
BIGINT |
PK FK | X | ์ฐ๊ฒฐ๋ ์ฝ๊ด (๋ฒ์ ํฌํจ) โ terms.terms_id |
|
display_order |
SMALLINT |
X | ์ํ ์์ธ์กฐํ์์ ์ด ์ฝ๊ด์ ๋ณด์ฌ์ค ์์(์ค๋ฆ์ฐจ์). โ terms ์์ฒด์ ์์ฑ์ด ์๋ |
ํ์ ๋์ ์ฌ๋ถ๋ ์ํ๋ณ ์ค๋ฒ๋ผ์ด๋ ์์ด terms.is_required ๋จ์ผ ๊ธฐ์ค์ผ๋ก ํ๋จํ๋ค.
๊ณ์ข (๋ณ๋ช ยทํ์์์ยท์ถ๊ธ๋ฑ๋ก ํก์)
๊ณ์ข๋ณ๋ช
ยทํ์์์(๊ตฌ account_preference)์ ์ถ๊ธ๊ณ์ข ๋ฑ๋ก(๊ตฌ withdrawal_account)์ ํก์ํ๋ค. balance๋ ์กฐํ์ฉ ์บ์์ด๋ฉฐ ์ง์ค์ ์์ฒ์ ledger_entry๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
account_id |
BIGINT |
PK | X | ๊ณ์ข ๋ด๋ถ ์๋ณ์. ๋ณธ์ธ ๊ณ์ข์๋ง ์ฌ์ฉํ๋ค (ํ ๊ณ ๊ฐ ๊ณ์ข๋ ๋ฒํธ๋ก ์ง์นญ) | |
account_number |
CHAR(12) |
UK | X | ํ์ดํ ์๋ ์ซ์ 12์๋ฆฌ | |
customer_id |
BIGINT |
FK | X | ์๊ธ์ฃผ โ customer.customer_id |
|
product_id |
BIGINT |
FK | O | ์
์ถ๊ธ๊ณ์ข๋ NULL โ product.product_id |
|
account_type |
VARCHAR(24) |
X | ๊ณ์ข ์ข
๋ฅ. DEMAND_DEPOSIT(์
์ถ๊ธ) / TIME_DEPOSIT(์ ๊ธฐ์๊ธ) / INSTALLMENT_SAVINGS(์ ๊ธฐ์ ๊ธ) |
||
balance |
BIGINT |
X | 0 |
ํ์ฌ ์์ก. ์กฐํ ์ฑ๋ฅ์ฉ ์บ์์ด๋ฉฐ ์ง์ค์ ์์ฒ์ ledger_entry ํฉ๊ณ๋ค. ๋ฐฐ์น๋ก ๋์ฌํ๋ค |
|
hold_amount |
BIGINT |
X | 0 |
์ง๊ธ์ ์ง ๋ณด๋ฅ์ก. ์ถ๊ธ๊ฐ๋ฅ์ก ๊ณ์ฐ ์ ์์ก์์ ์ฐจ๊ฐํ๋ค. | |
status |
VARCHAR(12) |
X | ACTIVE |
๊ณ์ข ์ํ. ACTIVE(์ ์) / SUSPENDED(๊ฑฐ๋์ ์ง) / MATURED(๋ง๊ธฐ ๋๋ฌ) / CLOSED(ํด์ง) / DORMANT(ํด๋ฉด) |
|
password_hash |
CHAR(60) |
X | ๊ณ์ข๋น๋ฐ๋ฒํธ 4์๋ฆฌ์ BCrypt ํด์ | ||
password_failure_count |
TINYINT |
X | 0 |
๊ณ์ข๋น๋ฐ๋ฒํธ ์ฐ์ ์ค๋ฅ ํ์. ๊ฒ์ฆ ์คํจ ์๋ต์ errorCount |
|
password_locked |
BOOLEAN |
X | FALSE |
๊ณ์ข๋น๋ฐ๋ฒํธ ์ ๊ธ ์ฌ๋ถ. 5ํ ์ค๋ฅ ์ TRUE๊ฐ ๋์ด ๊ฑฐ๋๊ฐ ์ ์ง๋๋ค (APW0101) | |
alias |
VARCHAR(24) |
O | ๊ณ ๊ฐ์ด ๋ถ์ธ ๊ณ์ข๋ณ๋ช . ๊ณ์ข๋ช ํ์ ์ ์ํ๋ช ๋ณด๋ค ์ฐ์ ํ๋ค | ||
display_order |
INT |
O | ๊ณ ๊ฐ์ด ์ง์ ํ ๊ณ์ข ๋ชฉ๋ก ํ์ ์์ | ||
withdrawal_registered |
BOOLEAN |
X | FALSE |
์ถ๊ธ๊ณ์ข๋ก ๋ฑ๋ก๋๋์ง. ์ด์ฒดยท์ํ๊ฐ์ ์ ์ถ๊ธ ์์ฒ์ด ๋ ์ ์๋์ง๋ฅผ ๊ฐ๋ฅธ๋ค | |
withdrawal_registered_at |
DATETIME(6) |
O | ์ถ๊ธ๊ณ์ข ๋ฑ๋ก ์๊ฐ. ๋ฏธ๋ฑ๋ก์ด๋ฉด NULL | ||
opened_date |
DATETIME(6) |
X | ๊ณ์ข ๊ฐ์ค์ผ | ||
maturity_date |
DATE |
O | ๋ง๊ธฐ์ผ. ์ยท์ ๊ธ ๊ณ์ข๋ง ๊ฐ์ด ์๋ค | ||
closed_date |
DATETIME(6) |
O | ํด์ง์ผ. | ||
closed_trade_date |
DATE |
O | ํด์ง ๋
ผ๋ฆฌ ์์
์ผ. ํด์ง ํธ๋์ญ์
์ด ์์
์ผ gate(BusinessDateGate)๋ก ์ฝ์ ๊ฐ(๊ธฐํ๋ฅผ ๋ค๋ฅธ ์๋น์ค์ ๋งก๊ธฐ๋ฉด ๊ทธ ๊ฒฐ๊ณผ์ tradeDate)์ด๋ฉฐ today()๋ก ๋ฐ๋ก ์ฝ์ง ์๋๋ค. ์ ๋ณด๊ณ CLOSE ์ด๋ฒคํธ ๊ธฐ์ค์ผ์ด๋ฉฐ ํด์ง ๊ตฌํ(PH-15ยท16)์ด ์ฑ์ด๋ค |
||
last_transaction_at |
DATETIME(6) |
O | ์ต๊ทผ ๊ฑฐ๋ ์ผ์. ์ ์ฒด ๊ณ์ข ์กฐํ์ lastTransactionAt |
||
version |
BIGINT |
X | 0 |
๋๊ด์ ๋ฝ ๋ฒ์ . ๋ฐฐ์นยท์กฐํ ๊ฒฝ๋ก์ ๊ฐฑ์ ์ถฉ๋์ ์ก๋๋ค (์ด์ฒด ์คํ ๊ฒฝ๋ก๋ ๋น๊ด์ ๋ฝ) | |
created_at |
DATETIME(6) |
X | ํ ์์ฑ ์ผ์. JPA Auditing์ด KST ๊ธฐ์ค์ผ๋ก ์๋ ์ค์ | ||
updated_at |
DATETIME(6) |
X | ํ ์ต์ข ์์ ์ผ์. JPA Auditing์ด KST ๊ธฐ์ค์ผ๋ก ์๋ ์ค์ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_account_number |
account_number |
| INDEX | ix_account_customer |
customer_id, status |
| INDEX | ix_account_withdrawal |
customer_id, withdrawal_registered |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด | ์ค๋ช |
|---|---|---|
ck_account_balance |
balance >= 0 |
๊ณ์ข ์์ก์ 0์ ์ด์์ด์ด์ผ ํ๋ค. |
ck_account_hold_amount |
hold_amount >= 0 AND hold_amount <= balance |
๋ณด๋ฅ์ก์ 0์ ์ด์์ด๋ฉฐ ์์ฅ์์ก์ ์ด๊ณผํ์ง ์๋๋ค. |
ck_account_number |
account_number REGEXP '^[0-9]{12}$' |
๊ณ์ข๋ฒํธ๋ ํ์ดํ ์๋ ์ซ์ 12์๋ฆฌ์ฌ์ผ ํ๋ค. |
ck_account_type |
account_type IN ('DEMAND_DEPOSIT', 'TIME_DEPOSIT', 'INSTALLMENT_SAVINGS') |
๊ณ์ข ์ ํ์ ์ ์ถ๊ธยท์ ๊ธฐ์๊ธยท์ ๊ธฐ์ ๊ธ ์ค ํ๋์ฌ์ผ ํ๋ค. |
ck_account_status |
status IN ('ACTIVE', 'SUSPENDED', 'MATURED', 'CLOSED', 'DORMANT') |
๊ณ์ข ์ํ๋ ์ ์ยท๊ฑฐ๋์ ์งยท๋ง๊ธฐ ๋๋ฌยทํด์งยทํด๋ฉด ์ค ํ๋์ฌ์ผ ํ๋ค. |
ck_account_password_lock_state |
์ค๋ฅ ํ์๊ฐ 0~4์ด๋ฉด password_locked = FALSE, ์ค๋ฅ ํ์๊ฐ 5์ด๋ฉด password_locked = TRUE |
๊ณ์ข๋น๋ฐ๋ฒํธ ์ฐ์ ์ค๋ฅ ํ์์ ์ ๊ธ ์ํ๊ฐ ํญ์ ์ผ์นํด์ผ ํ๋ค. |
ck_account_withdrawal_registered |
withdrawal_registered IN (FALSE, TRUE) |
์ถ๊ธ๊ณ์ข ๋ฑ๋ก ์ฌ๋ถ๋ Boolean ๊ฐ์ด์ด์ผ ํ๋ค. |
ck_account_product |
DEMAND_DEPOSIT์ด๋ฉด product_id IS NULLTIME_DEPOSIT ๋๋ INSTALLMENT_SAVINGS์ด๋ฉด product_id IS NOT NULL |
์ ์ถ๊ธ๊ณ์ข์๋ ์ํ์ด ์ฐ๊ฒฐ๋์ง ์๊ณ , ์ยท์ ๊ธ๊ณ์ข์๋ ์ํ์ด ๋ฐ๋์ ์ฐ๊ฒฐ๋์ด์ผ ํ๋ค. |
ck_account_maturity |
DEMAND_DEPOSIT์ด๋ฉด maturity_date IS NULLTIME_DEPOSIT ๋๋ INSTALLMENT_SAVINGS์ด๋ฉด maturity_date IS NOT NULL AND maturity_date >= opened_date |
์ ์ถ๊ธ๊ณ์ข์๋ ๋ง๊ธฐ์ผ์ด ์๊ณ , ์ยท์ ๊ธ๊ณ์ข์ ๋ง๊ธฐ์ผ์ ๊ฐ์ค์ผ ์ดํ์ฌ์ผ ํ๋ค. |
ck_account_withdrawal_type |
withdrawal_registered = FALSE OR account_type = 'DEMAND_DEPOSIT' |
์ถ๊ธ๊ณ์ข ๋ฑ๋ก์ ์ ์ถ๊ธ๊ณ์ข์๋ง ํ์ฉํ๋ค. |
ck_account_withdrawal_registered_at |
๋ฏธ๋ฑ๋ก์ด๋ฉด withdrawal_registered_at IS NULL๋ฑ๋ก์ด๋ฉด withdrawal_registered_at IS NOT NULL |
์ถ๊ธ๊ณ์ข ๋ฑ๋ก ์ฌ๋ถ์ ๋ฑ๋ก ์ผ์์ ์กด์ฌ ์ฌ๋ถ๊ฐ ์ผ์นํด์ผ ํ๋ค. |
ck_account_closed_date |
CLOSED์ด๋ฉด closed_date IS NOT NULL AND closed_date >= opened_dateCLOSED๊ฐ ์๋๋ฉด closed_date IS NULL |
ํด์ง ๊ณ์ข์๋ ๊ฐ์ค์ผ ์ดํ์ ํด์ง์ผ์ด ์์ด์ผ ํ๋ฉฐ, ๋ฏธํด์ง ๊ณ์ข์๋ ํด์ง์ผ์ด ์์ด์ผ ํ๋ค. |
๊ณ์ข ์ํ ์ ์ด ๊ฐ์ฌ ์ด๋ ฅ (PH-15, #671)
๊ณ์ข ์ํ ๋ณ๊ฒฝ ์ ์ ์ด ์ ยทํ ์ํ์ ์ฒ๋ฆฌ ์๊ฐ์ ๊ธฐ๋กํ๋ append-only ํ
์ด๋ธ์ด๋ค.
COB์ ACTIVE โ MATURED ์ ์ด์ ๊ณ ๊ฐ ์์ฒญ ๋ง๊ธฐํด์ง์ MATURED โ CLOSED ์ ์ด๋ฅผ ๊ธฐ๋กํ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
history_id |
BIGINT |
PK | X | AUTO_INCREMENT |
์ด๋ ฅ ์๋ณ์ |
account_id |
BIGINT |
INDEX | X | ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๊ณ์ข ID | |
previous_status |
VARCHAR(12) |
X | ๋ณ๊ฒฝ ์ ๊ณ์ข ์ํ. ๋ง๊ธฐ ์ ์ด๋ ACTIVE, ๋ง๊ธฐํด์ง๋ MATURED |
||
new_status |
VARCHAR(12) |
X | ๋ณ๊ฒฝ ํ ๊ณ์ข ์ํ. ๋ง๊ธฐ ์ ์ด๋ MATURED, ๋ง๊ธฐํด์ง๋ CLOSED |
||
maturity_date |
DATE |
O | ๊ณ์ฝ ๋ง๊ธฐ์ผ | ||
effective_business_date |
DATE |
O | ๋ง๊ธฐ ์ ์ด๋ COB์์ ๊ณ์ฐํ ๋ง๊ธฐ ์ ์ด ๊ธฐ์ค์ผ, ๋ง๊ธฐํด์ง๋ MATURITY ์ถ๊ธ ์์ฅ์ ์ค์ ๊ฑฐ๋์ผ(tradeDate) |
||
changed_at |
DATETIME(6) |
INDEX | X | ์ค์ ์ํ ์ ์ด ์ฒ๋ฆฌ ์๊ฐ | |
trigger_type |
VARCHAR(20) |
X | ์ ์ด ๋ฐ์ ์์ธ. COB(๋ฐฐ์น ๋ง๊ธฐ ์ ์ด) / CUSTOMER(๊ณ ๊ฐ ์์ฒญ ๋ง๊ธฐํด์ง) |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| PRIMARY | PRIMARY |
history_id |
| INDEX | ix_account_status_history_account_time |
account_id, changed_at |
์์ ๊ธ ์ด์ ์ง๊ธ ์ด๋ ฅ (PH-14, #687)
์์ ๊ธ ๋ง๊ธฐํด์ง ๋๋ ์ค๋ํด์ง ์ ๊ณ์ฐ๋ ์ด์์ ์์ฒ์ธ, ์ค์ ์์ฅ ๊ธฐํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ๋ค.
ํ ๊ณ์ข์ ๋ํด ์ด์ ์ง๊ธ ์ด๋ ฅ์ ์ต๋ 1๊ฑด์ด๋ค. account_id์ UNIQUE ์ ์ฝ์ผ๋ก ์ค๋ณต ์ง๊ธ์ ๋ฐฉ์งํ๋ฉฐ, ์์ฅยทGLยท๊ณ์ข ํด์ง ์ฒ๋ฆฌ์ ๋์ผํ ํธ๋์ญ์
์์ ์ ์ฅํ๋ค.
์ธํ์ด์๊ฐ 0์์ด๋ฉด ์์ฅ์ ๊ธฐํํ์ง ์์ง๋ง ์ง๊ธ ์ด๋ ฅ์ ๋จ๊ธด๋ค. ์ด ๊ฒฝ์ฐ transaction_number์ trade_date๋ NULL์ด๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
interest_payment_id |
BIGINT |
PK | X | AUTO_INCREMENT |
์ด์ ์ง๊ธ ์ด๋ ฅ ์๋ณ์ |
account_id |
BIGINT |
UK | X | ์ง๊ธ ๋์ ์ํ ๊ณ์ข ID. ๊ณ์ข๋น ์ด์ ์ง๊ธ 1ํ ๋ณด์ฅ. ๋ฌผ๋ฆฌ์ FK ์์ | |
payment_reason |
VARCHAR(12) |
X | ์ง๊ธ ์ฌ์ . MATURITY(๋ง๊ธฐํด์ง) / TERMINATION(์ค๋ํด์ง) |
||
gross_amount |
BIGINT |
X | ์ธ์ ์ด์. ์ ๋จ์ ์ ์ | ||
tax_amount |
BIGINT |
X | ์์ฒ์ง์ ์ธ๊ธ ํฉ๊ณ. ์ ๋จ์ ์ ์ | ||
net_amount |
BIGINT |
X | ์ธํ์ด์. gross_amount - tax_amount |
||
transaction_number |
CHAR(20) |
UK | O | INTEREST ์์ฅ ๊ธฐํ ๊ฑฐ๋๋ฒํธ. ์ง๊ธ์ก 0์์ด๋ฉด NULL |
|
trade_date |
DATE |
O | ์ด์ ์์ฅ ๊ฑฐ๋์ผ. LedgerDepositResult.tradeDate ์ฌ์ฉ. ์ง๊ธ์ก 0์์ด๋ฉด NULL |
||
paid_at |
DATETIME(6) |
X | ์ด์ ์ง๊ธ ์ฒ๋ฆฌ ์ผ์ (KST) |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| PRIMARY | PRIMARY |
interest_payment_id |
| UNIQUE | uk_interest_payment_account |
account_id |
| UNIQUE | uk_interest_payment_tx |
transaction_number |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด | ์ค๋ช |
|---|---|---|
ck_interest_payment_amount |
gross_amount >= 0 AND tax_amount >= 0 AND tax_amount <= gross_amount AND net_amount = gross_amount - tax_amount |
์ธ์ ์ด์ยท์ธ๊ธยท์ธํ์ด์ ์ ํฉ์ฑ |
ck_interest_payment_ledger |
net_amount = 0์ด๋ฉด ๊ฑฐ๋๋ฒํธยท๊ฑฐ๋์ผ ๋ชจ๋ NULL, net_amount > 0์ด๋ฉด ๋ชจ๋ NOT NULL |
์ค์ ์์ฅ ๊ธฐํ ์ฌ๋ถ์ ๊ฑฐ๋ ์๋ณ์ ์ผ์น |
์ํยท์ํ๋ณ ๊ณ์ข๋ฒํธ ์ฑ๋ฒ
์ํยท๊ณ์ข ์ ํยท์ํ๋ณ ๊ณ์ข๋ฒํธ ๋ฐ๊ธ ๊ท์น๊ณผ ๋ง์ง๋ง ๋ฐ๊ธ ์ผ๋ จ๋ฒํธ๋ฅผ ๊ด๋ฆฌํ๋ค.
์ํ์ฝ๋ 3์๋ฆฌ + ์ํ Prefix 2์๋ฆฌ + ์ผ๋ จ๋ฒํธ 7์๋ฆฌ
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | NULL ํ์ฉ | ๊ธฐ๋ณธ๊ฐ | ํค | ์ค๋ช |
|---|---|---|---|---|---|
sequence_id |
BIGINT | X | AUTO_INCREMENT | PK | ๊ณ์ข๋ฒํธ ์ฑ๋ฒ ๊ท์น ์๋ณ์ |
bank_code |
CHAR(3) | X | ์์ | ๊ณ์ข๋ฒํธ ์ 3์๋ฆฌ์ ํฌํจ๋๋ ์ํ์ฝ๋ | |
account_type |
VARCHAR(24) | X | ์์ | ๊ณ์ข ์ ํ (DEMAND_DEPOSIT, TIME_DEPOSIT, INSTALLMENT_SAVINGS) |
|
product_id |
BIGINT | O | NULL | FK | ์ฐ๊ฒฐ ์ํ ์๋ณ์. ์
์ถ๊ธ๊ณ์ข๋ NULL |
product_prefix |
CHAR(2) | X | ์์ | ๊ณ์ข๋ฒํธ์ ํฌํจ๋๋ ์ํ๋ณ Prefix | |
last_sequence |
BIGINT | X | 0 |
๋ง์ง๋ง์ผ๋ก ๋ฐ๊ธํ 7์๋ฆฌ ์ผ๋ จ๋ฒํธ | |
created_at |
DATETIME(6) | X | ์์ | ์ฑ๋ฒ ๊ท์น ์์ฑ ์ผ์ | |
updated_at |
DATETIME(6) | X | ์์ | ์ฑ๋ฒ ๊ท์น ์ต์ข ์์ ์ผ์ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ | ์ฉ๋ |
|---|---|---|---|
| PRIMARY | PRIMARY |
sequence_id |
์ฑ๋ฒ ๊ท์น ์๋ณ ๋ฐ PK ์กฐํ |
| UNIQUE | uk_account_number_sequence_prefix |
bank_code, product_prefix |
๊ฐ์ ์ํ ๋ด Prefix ์ค๋ณต ๋ฐฉ์ง |
| UNIQUE | uk_account_number_sequence_rule |
bank_code, COALESCE(product_id, 0) |
๊ฐ์ ์ ์ถ๊ธ, ์ยท์ ๊ธ ์ํ์ ์ฑ๋ฒ ๊ท์น ์ค๋ณต ๋ฐฉ์ง |
| INDEX | ix_account_number_sequence_lookup |
bank_code, account_type, product_id |
๊ณ์ข๋ฒํธ ๋ฐ๊ธ ์ ์ฑ๋ฒ ํ ์กฐํ ๋ฐ ๋น๊ด์ ๋ฝ ๋ฒ์ ์ต์ํ |
| INDEX | ix_account_number_sequence_product |
product_id |
์ํ FK ๊ฒ์ฌ ๋ฐ ์ํ ๊ธฐ์ค ์กฐํ ์ง์ |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด | ์ค๋ช |
|---|---|---|
PRIMARY |
sequence_id (PK) |
ํ๋ณ ๊ณ ์ ๊ฐ (์ฑ๋ฒ ๊ท์น ํ ์๋ณ) |
fk_account_number_sequence_product |
product_id (FK -> product.product_id) |
์กด์ฌํ๋ ์ํ๋ง ์ฑ๋ฒ ๊ท์น ์ฐ๊ฒฐ ๊ฐ๋ฅ |
ck_account_number_sequence_bank_code |
bank_code REGEXP '^[0-9]{3}$' (CHECK) |
์ํ์ฝ๋ ํ์ ๊ฒ์ฆ (์ซ์ 3์๋ฆฌ) |
ck_account_number_sequence_prefix |
product_prefix REGEXP '^[0-9]{2}$' (CHECK) |
์ํ Prefix ํ์ ๊ฒ์ฆ (์ซ์ 2์๋ฆฌ) |
ck_account_number_sequence_type |
account_type IN ('DEMAND_DEPOSIT', 'TIME_DEPOSIT', 'INSTALLMENT_SAVINGS') (CHECK) |
ํ์ฉ๋ ๊ณ์ข ์ ํ ์ค ํ๋์ธ์ง ๊ฒ์ฆ |
ck_account_number_sequence_product |
DEMAND_DEPOSIT์ด๋ฉด product_id IS NULL, ์ยท์ ๊ธ์ด๋ฉด product_id IS NOT NULL (CHECK) |
์ ์ถ๊ธ์ ์ํ ์์, ์ยท์ ๊ธ์ ์ํ ํ์ (์ ํฉ์ฑ ๋ณด์ฅ) |
ck_account_number_sequence_value |
last_sequence BETWEEN 0 AND 9999999 (CHECK) |
์ผ๋ จ๋ฒํธ๊ฐ 7์๋ฆฌ ๋ฒ์(0 ~ 9,999,999)๋ฅผ ์ด๊ณผํ์ง ์๋๋ก ์ ํ |
๊ฑฐ๋๋ฒํธ ์ผ๋ จ๋ฒํธ ์ฑ๋ฒ (๋น๊ด์ ๋ฝ ๋์ 0์์)
๊ฑฐ๋๋ฒํธ ์ผ๋ จ 10์๋ฆฌ๋ฅผ ์ฑ๋ฒํ๋ค. ์ผ์ยท์ฑ๋๋ณ๋ก ๋งค์ผ 0๋ถํฐ ๋ค์ ์์ํ๋ฏ๋ก AUTO_INCREMENT๋ก ๋ง๋ค ์ ์๋ค. ์ ๊ณ ๊ฐ์ด ๊ฐ์ ํ์ ๋๊ณ ๊ฒฝํฉํ๋ ์ ์ผํ ์ง์ ์ด๋ผ ๋ฝ ๋ณด์ ์๊ฐ์ ์ต์๋ก ์ ์งํด์ผ ํ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
seq_date |
DATE |
PK | X | ์ฑ๋ฒ ๊ธฐ์ค ์์ ์ผ. KST ๊ธฐ์ค์ด๋ฉฐ ๊ฑฐ๋๋ฒํธ ์ 8์๋ฆฌ์ ๊ฐ๋ค | |
channel |
CHAR(2) |
PK | X | ์ฑ๋ ์ฝ๋. WB(์ธํฐ๋ท๋ฑ
ํน) / BT(๋ฐฐ์นยท์์ฝ์ด์ฒด). ๊ฑฐ๋๋ฒํธ 9~10๋ฒ์งธ ์๋ฆฌ |
|
last_seq |
BIGINT |
X | 0 |
ํด๋น ์ผ์ยท์ฑ๋์์ ๋ง์ง๋ง์ผ๋ก ๋๊ฐ ์ผ๋ จ๋ฒํธ. ๋ค์ ๊ฑฐ๋๋ ์ด ๊ฐ + 1์ ๋ฐ๋๋ค | |
updated_at |
DATETIME(6) |
X | ๋ง์ง๋ง ์ฑ๋ฒ ์๊ฐ |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด |
|---|---|
ck_txseq_range |
last_seq BETWEEN 0 AND 9999999999 |
์ด์ฒด ๊ฑฐ๋ (์ฆ์ยท์์ฝยท์๋ 3์ข ์ ๋จ์ผ ์๋ ด์ )
์ฆ์ยท์์ฝยท์๋์ด์ฒด 3์ข
์ด ๋ชจ๋ ์ด ํ
์ด๋ธ 1ํ์ผ๋ก ์๋ ดํ๋ค. ์์ฝยท์๋์ source_typeยทsource_id๋ก ์๋ณธ์ ์ญ์ถ์ ํ๋ค. status = ERROR์ธ ํ์ ์์ฅ ๊ธฐํ๊ฐ 0ํ์ด๋ค. ์์ฝยท์๋์ด์ฒด๋ uk_transfer_source_execution_date(source_type, source_id, execution_date)๋ก ๊ฐ์ ํ์ฐจ์ ์ค๋ณต ์คํ์ ์ํ(SUCCESS/ERROR)์ ๋ฌด๊ดํ๊ฒ DB ๋ ๋ฒจ์์ ๋ง๋๋ค โ ์ฆ์์ด์ฒด๋ ์ธ ์ปฌ๋ผ ๋ชจ๋ NULL์ด๋ผ ์ด ์ ์ฝ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค(MySQL์ NULL์ ์๋ก ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ทจ๊ธ).
ํํ์ด์ฒด(PH-33-โก)๋ ์ด ํ
์ด๋ธ์ ๋จ๋๋ค. payee_bank_code๊ฐ ์์ผ๋ฉด ํํ, NULL์ด๋ฉด ๋นํ์ด๋ค. ํํ์ ์์ทจ ๊ณ์ข๊ฐ ๋นํ account์ ์์ด deposit_account_id๊ฐ NULL์ด๊ณ , ์๊ธ์ฃผ๋ ์๋ ์ํ ์๋ต(SUCCESS)์ผ๋ก๋ง ๋ฐ์ ERRORยทTIMEOUT ๊ฑด์ payee_name๋ NULL์ด๋ค. ๋นํ ํ์ ck_transfer_payee_accountยทck_transfer_payee_name์ด ์ง๊ธ์ฒ๋ผ ๋ ๊ฐ์ ๊ฐ์ ํ๋ค. ํํ ์์ฝยท์๋์ด์ฒด๋ ์๋ค(์ฆ์์ด์ฒด๋ง).
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
transfer_id |
BIGINT |
PK | X | ์ด์ฒด ๊ฑฐ๋ ๋ด๋ถ ์๋ณ์. ๋์ธ ์๋ณ์๋ transaction_number |
|
transaction_number |
CHAR(20) |
UK | X | ๋์ธ ๊ฑฐ๋ ์๋ณ์. YYYYMMDD(8) + ์ฑ๋(2) + ์ผ๋ จ(10) = 20์. ์ด์ฒด ์์ธ ์กฐํ์ ๊ฒฝ๋ก ๋ณ์์ด์ ์์ฅ 2ํ์ ์๋ ํค |
|
withdrawal_account_id |
BIGINT |
FK | X | ์ถ๊ธ๊ณ์ข โ account.account_id |
|
deposit_account_id |
BIGINT |
FK | O | ์
๊ธ๊ณ์ข. ์์ฅ ์
๊ธ ํ์ account_id ๊ทผ๊ฑฐ โ account.account_id. ๋นํ ๊ฑฐ๋๋ ํญ์ ๊ฐ์ด ์๊ณ , ํํ ๊ฑฐ๋๋ NULL์ด๋ค(์์ทจ ๊ณ์ข๊ฐ ๋นํ์ ์๋ค) |
|
deposit_account_number |
VARCHAR(16) |
X | ์ ๊ธ ๊ณ์ข๋ฒํธ. ์ซ์๋ง. ๋นํ 12์๋ฆฌ, ํํ 1~16์๋ฆฌ(์ ๋ฌธ ๊ณ์ข๋ฒํธ ์นธ, ์ ๋ฌธ ๊ท๊ฒฉ ยง2) | ||
payee_bank_code |
CHAR(3) |
O | ํํ ์
๊ธ ์ํ์ฝ๋(common_code BANK_CODE, ์ ๋ฌธ ๊ธฐ๊ด์ฝ๋). NULL์ด๋ฉด ๋นํ ๊ฑฐ๋๋ค |
||
payee_name |
VARCHAR(50) |
O | ์
๊ธ๊ณ์ข ์๊ธ์ฃผ๋ช
. ๊ฑฐ๋ ์์ ์ค๋
์ท์ด๋ผ ์ดํ ์๋ ์ ๋ณด๊ฐ ๋ฐ๋์ด๋ ๋จ๋๋ค. ๋นํ์ ํญ์ ์๊ณ , ํํ์ SUCCESS ์๋ต์ด ๋๋ ค์ค ์ด๋ฆ์ด๋ฉฐ ERRORยทTIMEOUT์ด๋ฉด NULL์ด๋ค |
||
amount |
BIGINT |
X | ์ด์ฒด๊ธ์ก | ||
fee |
BIGINT |
X | 0 |
์์๋ฃ. ๋นํ ์ด์ฒด๋ 0์ผ๋ก ๊ณ ์ | |
transfer_type |
VARCHAR(12) |
X | ์ด์ฒด ์ข
๋ฅ. IMMEDIATE(์ฆ์) / SCHEDULED(์์ฝ) / AUTO(์๋) |
||
channel |
CHAR(2) |
X | ๊ฑฐ๋ ์ฑ๋. WB(์ธํฐ๋ท๋ฑ
ํน) / BT(๋ฐฐ์น). ๊ฑฐ๋๋ฒํธ์ ์ฑ๋ 2์๋ฆฌ์ ๊ฐ์ ๊ฐ |
||
status |
VARCHAR(12) |
X | ์ฒ๋ฆฌ ๊ฒฐ๊ณผ. SUCCESS(์ ์) / ERROR(์ค๋ฅ) / TIMEOUT(์ฒ๋ฆฌ ๋ถ๋ช
โ ๋์ธ ์ ๋ฌธ ๋ฌด์๋ต์ผ๋ก ์๋ ์ฒ๋ฆฌ ์ฌ๋ถ๋ฅผ ๋ชจ๋ฅธ๋ค. ์คํจ๊ฐ ์๋๋ฉฐ ์กฐํ๊ฑฐ๋๋ก ํ์ ํ๋ค, PH-80). PROCESSING์ INSERT ์งํ์ ํธ๋์ญ์
๋ด๋ถ ์ํ๋ผ ์ปค๋ฐ๋ ํ์๋ ๋ํ๋์ง ์๋๋ค (#377) |
||
source_type |
VARCHAR(12) |
O | ์ด ์ด์ฒด๋ฅผ ๋ง๋ ์๋ณธ ๊ตฌ๋ถ. SCHEDULED(์์ฝ์ด์ฒด) / AUTO(์๋์ด์ฒด). ์ฆ์์ด์ฒด๋ NULL |
||
source_id |
BIGINT |
O | ์์ฝยท์๋์ด์ฒด ์๋ณธ PK. source_type๊ณผ ํจ๊ป ์ญ์ถ์ ์ ์ด๋ค |
||
execution_date |
DATE |
O | source_id์ ํจ๊ป ๋ฉฑ๋ฑํค๋ฅผ ๊ตฌ์ฑํ๋ ํ์ฐจ ์คํ์ผ์. SCHEDULED/AUTO ์ ์ฉ(์ฆ์์ด์ฒด๋ NULL). ๋ฐฐ์น๊ฐ ์ค์ ๋ก ํธ์ถ๋ ๋ ์ง๊ฐ ์๋๋ผ ๊ทธ ํ์ฐจ์ ๋
ผ๋ฆฌ์ ์คํ์ผ(scheduled_transfer.scheduled_date / auto_transfer_execution.execution_date)์ด ๋ค์ด๊ฐ์ผ ํฌ๋์ ํ ์ฌ์๋๊ฐ ๊ฐ์ ํ์ฐจ๋ก ์๋ณ๋๋ค |
||
my_passbook_memo |
VARCHAR(10) |
O | ๋ด ํต์ฅ์ ์ฐํ๋ ๋ฌธ๊ตฌ. ์ต๋ 10์ | ||
recipient_passbook_memo |
VARCHAR(10) |
O | ๋ฐ๋ ๋ถ ํต์ฅ์ ์ฐํ๋ ๋ฌธ๊ตฌ | ||
withdrawal_balance_after |
BIGINT |
O | ์ถ๊ธ ์งํ ์ถ๊ธ๊ณ์ข ์์ก. ์ฑ๊ณต ์์๋ง ๊ฐ์ด ์๋ค | ||
error_code |
VARCHAR(10) |
O | ์คํจ ์ ์ค๋ฅ์ฝ๋ | ||
error_message |
VARCHAR(200) |
O | ์คํจ ์ ์ฌ์ ๋ฌธ๊ตฌ | ||
transferred_at |
DATETIME(6) |
X | ์ด์ฒด ์ฒ๋ฆฌ ์ผ์ | ||
trade_date |
DATE |
O | ๊ฑฐ๋์ผ โ ์ด ์ด์ฒด๊ฐ ๊ท์๋๋ ์์
์ผ. ๊ฑฐ๋ ํธ๋์ญ์
์ด ์์
์ผ gate(BusinessDateGate)๋ก ์ฝ์ ๊ฐ์ด๋ค. ํด์ผ ๊ฑฐ๋๋ ๋ค์ ์์
์ผ์ด ๋๋ค(glossary 7๋ฒ). ์์
์ผ ์ ํ(COB) ์ ์ gate๋ฅผ ์ก์ ๊ฑฐ๋๋ ์ ํ ์ด์ ์์
์ผ, ์ ํ ๋ค ๊ฑฐ๋๋ ๋ค์ ์์
์ผ์ด๋ค โ ์ ํ์ ์งํ ์ค ๊ฑฐ๋๊ฐ ๋๋ ๋ค์๋ง ์ผ์ด๋๋ค(ADR-0008). ์ฑ๊ณตยท์คํจ(ERROR) ํ ๋ชจ๋ ์ฑ์ด๋ค โ ์คํจ ํ์ ์์ฅ ์์ด ์ด ํ
์ด๋ธ์๋ง ๋จ๊ณ , ๊ฑฐ๋์ผ์ ERROR ๊ธฐ๋ก ํธ๋์ญ์
์ด gate๋ก ์ฝ์ ๊ฐ์ด๋ค. ์๋ยท์์ฝ์ด์ฒด๋ ํด์ผ์๋ ์ง์ ์ผ์ ์คํ๋๋ฏ๋ก(REQ-AUTO-001), ํด์ผ์ ์คํ๋ ํ์ฐจ์ ๊ฑฐ๋์ผ๋ ๋ค์ ์์
์ผ์ด๋ค โ ์คํ์ผ(execution_date, ๋ฌ๋ ฅ ๋ ์ง)๊ณผ ๊ฑฐ๋์ผ์ด ๋ค๋ฅผ ์ ์๋ค. ์ ์ ๊ฑฐ๋(์ทจ์์ ์ ยท์ ์๊ฑฐ๋)๋ ์๊ฑฐ๋์ผ์ด ์๋๋ผ ์ ์ ํ ๋ ์ ์์
์ผ์ด๋ค. #516 ๋์
์ ํ์ NULL์ด๋ค |
||
invalidated_at |
DATETIME(6) |
O | ์ ์ ์ฒด์ธ์ผ๋ก ๋ฌดํจํ๋ ์๊ฐ. NULL์ด๋ฉด ์ ํจํ ๊ฑฐ๋๋ค. ๋ฌดํจํ๋ status๋ฅผ ๋ฐ๊พธ์ง ์๋๋ค โ status๋ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ(์ฑ๊ณตยท์คํจ)์ด๊ณ ๋ฌดํจํ๋ ๊ทธ ๋ค์ ์ผ์ด๋๋ ๋ณ๊ฐ์ ์ฌ๊ฑด์ด๋ค. SUCCESS์ธ ์๊ฑฐ๋๋ง ๋ฌดํจํ๋๋ฉฐ ํ ๋ฒ ๋ฌดํจํ๋๋ฉด ๋๋๋ฆฌ์ง ์๋๋ค(PH-80) |
||
ref_transfer_id |
BIGINT |
FK | O | ์ ์ ์ฒด์ธ์ ์๊ฑฐ๋ โ transfer.transfer_id. ์ทจ์์ ์ ยท์ ์๊ฑฐ๋ ๋ชจ๋ ์๊ฑฐ๋๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก ์๊ฑฐ๋ ํ๋๋ก ์ฒด์ธ ์ ์ฒด๋ฅผ ์ฐพ๋๋ค. ์ผ๋ฐ ๊ฑฐ๋๋ NULL |
|
correction_type |
VARCHAR(12) |
O | ์ ์ ์ฒด์ธ์์์ ์ญํ . REVERSAL(์ทจ์์ ์ โ ์๊ฑฐ๋์ ๋ฐ๋ ๋ฐฉํฅ) / REPOST(์ ์๊ฑฐ๋ โ ์๋ ์๋ํ ๊ฑฐ๋). ์ผ๋ฐ ๊ฑฐ๋๋ NULL. ref_transfer_id์ ํจ๊ป ์๊ฑฐ๋ ํจ๊ป ์๋ค |
||
created_at |
DATETIME(6) |
X | ํ ์์ฑ ์ผ์ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_transfer_txno |
transaction_number |
| INDEX | ix_transfer_wacc |
withdrawal_account_id, transferred_at DESC |
| INDEX | ix_transfer_status_created |
status, created_at โ ์กฐํ๊ฑฐ๋ ์ค์ผ์ค๋ฌ๊ฐ 1๋ถ๋ง๋ค ์ฒ๋ฆฌ ๋ถ๋ช
(TIMEOUT) ํํ ๊ฑด์ ์ฐพ๋๋ค(PH-33-โก) |
| UNIQUE | uk_transfer_source_execution_date |
source_type, source_id, execution_date โ ์์ฝยท์๋์ด์ฒด ์ฒ๋ฆฌ๊ฒฐ๊ณผ์ ๊ฑฐ๋์ผ ์กฐํ(transfer.api.TransferTradeDateQuery, #679)๋ ์ด ์ธ๋ฑ์ค๋ก ์ฝ๋๋ค |
| UNIQUE | uk_transfer_correction |
ref_transfer_id, correction_type โ ์๊ฑฐ๋ ํ๋์ ์ทจ์์ ์ ยท์ ์๊ฑฐ๋๋ ๊ฐ๊ฐ 1๊ฑด. ๋์ ์ ์ ์ DB๊ฐ ๋ง๋๋ค |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด |
|---|---|
ck_transfer_amount |
amount > 0 |
ck_transfer_fee |
fee >= 0 |
ck_transfer_selfsend |
withdrawal_account_id <> deposit_account_id โ ํํ์ deposit_account_id๊ฐ NULL์ด๋ผ ํด๋น ์์ |
ck_transfer_payee_account |
(payee_bank_code IS NULL) = (deposit_account_id IS NOT NULL) โ ๋นํ์ ์
๊ธ๊ณ์ข ID ํ์, ํํ์ ์์ |
ck_transfer_payee_name |
payee_bank_code IS NOT NULL OR payee_name IS NOT NULL โ ๋นํ์ ์๊ธ์ฃผ ํ์ |
ck_transfer_correction_type |
correction_type IN ('REVERSAL', 'REPOST') |
ck_transfer_correction_ref |
(correction_type IS NULL) = (ref_transfer_id IS NULL) โ ๋ฐ์ชฝ ์ ์ ๊ธ์ง |
์์ฅ (APPEND-ONLY. UPDATE/DELETE ๊ธ์ง)
APPEND-ONLY. UPDATEยทDELETE๋ฅผ ๊ธ์งํ๋ค. ์ทจ์๋ ๋ฐ๋ ๋ฐฉํฅ ๊ธฐํ๋ฅผ ์๋ก ์๋๋ค. ์์ธ๋ reversed ํ๋๋ค โ ๋ฐ๋๊ธฐํ๋ฅผ ์์ ๋ ์๊ฑฐ๋ ํ์ ์ด ๊ฐ๋ง FALSEโTRUE๋ก ํ ๋ฒ ์ธ์ด๋ค(์ ์ ์ฒด์ธ, PH-80). ๊ธ์กยท์์กยท์๊ฐ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ฐ๊พธ์ง ์๋๋ค. occurred_at ๊ธฐ์ค RANGE ํํฐ์
์ด๋ผ FK๋ฅผ ์ ์ธํ ์ ์๊ณ , ํํฐ์
ํค๊ฐ PK์ ํฌํจ๋ผ์ผ ํด์ PK๊ฐ ๋ณตํฉํค๋ค. ํํฐ์
๋ฒ์์ ์ ์ง๋ณด์ ์ ์ฐจ๋ flyway_guide.md ยง5๋ฅผ ๋ฐ๋ฅธ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
ledger_entry_id |
BIGINT |
PK | X | ์์ฅ ํ ์๋ณ์. ๊ฑฐ๋๋ด์ญ ์กฐํ ์๋ต์ ledgerEntryId |
|
account_id |
BIGINT |
X | ๊ธฐํ ๋์ ๊ณ์ข | ||
transfer_id |
BIGINT |
O | ์๋ณธ ์ด์ฒด ๊ฑฐ๋. ์ํ๊ฐ์ ์ด์ ๊ธยท์ด์ ์ง๊ธ์ฒ๋ผ ์ด์ฒด๊ฐ ์๋ ๊ธฐํ๋ NULL | ||
transaction_number |
CHAR(20) |
X | ์ด ๊ธฐํ๊ฐ ์ํ ๊ฑฐ๋๋ฒํธ. ์ถ๊ธ ํ๊ณผ ์
๊ธ ํ์ด ๊ฐ์ ๊ฐ์ ๊ฐ๋๋ค. ์ง ์๋ 1ํ(OPENINGยทINTEREST)์ ์ด ๋ฒํธ๋ฅผ ํผ์ ์ด๋ค |
||
direction |
VARCHAR(10) |
X | ๊ธฐํ ๋ฐฉํฅ. DEPOSIT(์
๊ธ) / WITHDRAWAL(์ถ๊ธ). ๊ธ์ก์ ๋ ์์๋ผ ๋ถํธ ์ญํ ์ ์ด ์ปฌ๋ผ์ด ํ๋ค |
||
amount |
BIGINT |
X | ๊ธฐํ ๊ธ์ก. ํญ์ ์์ | ||
balance_after |
BIGINT |
X | ์ด ๊ธฐํ ์งํ์ ๊ณ์ข ์์ก ์ค๋ ์ท. ํต์ฅ ํํ๋ก ๋ณด์ฌ์ค ๋ ์ด๋ค | ||
transaction_type |
VARCHAR(32) |
X | ๊ธฐํ๋ฅผ ์ผ์ผํจ ์
๋ฌด. OPENING(๊ฐ์ ์์ก, ์ง ์๋ 1ํ์ด๋ฉฐ ์๋ํธ์ GL ๊ฐ์ ์ ํ) / IMMEDIATE_TRANSFER / SCHEDULED_TRANSFER / AUTO_TRANSFER / PRODUCT_SUBSCRIPTION(๊ฐ์
์ด์
๊ธ) / INTEREST(์ด์, ์ง ์๋ 1ํ์ด๋ฉฐ ์๋ํธ์ GL ์ด์ ์ ํ) / MATURITY(๋ง๊ธฐํด์ง, ์ํ ๊ณ์ข โ ๊ณ ๊ฐ ๊ณ์ข 2ํ) / TERMINATION(์ค๋ํด์ง, ์ํ ๊ณ์ข โ ๊ณ ๊ฐ ๊ณ์ข 2ํ) / REVERSAL(๋ฐ๋๊ธฐํ) / INTERBANK_TRANSFER(ํํ์ด์ฒด ์ถ๊ธ, ์ง ์๋ 1ํ์ด๋ฉฐ ์๋ํธ์ GL ๋ฏธ๊ฒฐ์ ์ ํ. ์คํจ๋ก ํ์ ๋๋ฉด ๊ฐ์ ๊ฑฐ๋๋ฒํธ๋ก reversal_id๊ฐ ์ ์ถ๊ธ์ ๊ฐ๋ฆฌํค๋ ๋๋๋ฆผ ์
๊ธ 1ํ์ด ๋ถ๊ณ ์ ์ถ๊ธ์ reversed๊ฐ ์ ๋ค). INTERESTยทMATURITYยทTERMINATION์ ์
๊ธ ๊ณ์ฝ transfer.api.LedgerDepositUseCase(#595)๋ง ๋จ๊ธด๋ค |
||
transaction_content |
VARCHAR(10) |
O | ํต์ฅ์ ์ฐํ๋ ์ ์. ์ต๋ 10์ | ||
channel |
CHAR(2) |
X | ๊ฑฐ๋ ์ฑ๋. WB / BT |
||
reversed |
BOOLEAN |
X | FALSE |
๋ฐ๋๊ธฐํ๋ก ์ทจ์๋ ์๊ฑฐ๋์ธ์ง ์ฌ๋ถ. ์๋ณธ์ ์ง์ฐ์ง ์๊ณ ์ด ๊ฐ๋ง ์ธ์ด๋ค | |
reversal_id |
BIGINT |
O | ๋ฐ๋๊ธฐํ ํ์ด ๊ฐ๋ฆฌํค๋ ์๊ฑฐ๋์ ledger_entry_id |
||
occurred_at |
DATETIME(6) |
PK | X | ๊ธฐํ ๋ฐ์ ์ผ์. RANGE ํํฐ์
ํค์ด๋ฉฐ ๊ฑฐ๋๋ด์ญ ์กฐํ์ ๊ธฐ๊ฐ ์กฐ๊ฑด์ด ์ด ์ปฌ๋ผ์ ๊ฑธ๋ฆฐ๋ค. ์จ๋ผ์ธ ๊ฑฐ๋ ๊ฒฝ๋ก(์ด์ฒดยท์ํ๊ฐ์
์
๊ธ)๋ ๊ณ์ข ๋ฝ์ ์ฅ ๋ค ์ด ์๊ฐ์ ์ฐ์ผ๋ฏ๋ก, ์๊ณ๊ฐ ์ ์์ ์ผ๋ก ํ๋ฅด๋ ๋์์๋ ๊ฐ์ ๊ณ์ข์ ์์ก ๋ฐ์ ์์์ ๊ฐ๋ค. ์ ์ยท๊ฑฐ๋๋ด์ญ์ occurred_at DESC, ledger_entry_id DESC ์์ผ๋ก ๋ง์ง๋ง ์์ก์ ๊ณ ๋ฅธ๋ค. ๋ฝ์ ๊ฑฐ์น์ง ์๊ณ ์ง์ ์ ์ฌํ๋ ์๋(Phase2MinimumSeedServiceยทlocal-demo-data.sql)๋ ์ด ๊ณ์ฝ์ ๋์์ด ์๋๋ค(#545) |
|
trade_date |
DATE |
O | ๊ฑฐ๋์ผ โ ์ด ๊ธฐํ๊ฐ ๊ท์๋๋ ์์
์ผ. occurred_at(๋ฐ์ ์๊ฐ)๊ณผ ๋ค๋ฅด๋ค. ๊ฐ ๊ท์น์ transfer.trade_date์ ๊ฐ๋ค. ์์ฅ์ ์ฐ๋ ๋ชจ๋ ๊ฒฝ๋ก(์ด์ฒดยท์ ์ ยท์ํ๊ฐ์
์
๊ธยท์์ ๊ธ ์
๊ธ ๊ณ์ฝ)๊ฐ ์ฑ์ด๋ค. #516 ๋์
์ ํ์ NULL์ด๋ค. P6 ์๋(PH-60b)๋ GL๊ณผ ๊ฐ์ ๊ฑฐ๋์ผ์ ๋ฃ๋๋ค |
trade_date ๋ NULL ์ ํ์ฉํ๋ค(Expand). NOT NULL ์ ์ฝ์ ๊ฑธ์ง ์๋๋ค โ 300๋ง ํ ํํฐ์
ํ
์ด๋ธ ์ฌ๊ตฌ์ฑ์ ํผํ๋ ค๊ณ , ์ ํ์ ํ์ ์ฌ๋ถ๋ ๋๋ฉ์ธ ํฉํ ๋ฆฌ๊ฐ ๋ง๋๋ค(#515 A์). ๊ธฐ์กด ํ ์ฑ์ฐ๊ธฐ๋ #515์์ ํ๋ค. ๊ฑฐ๋์ผ๋ก ์กฐํํ๋ ๊ณณ์ด ์์ง ์์ด ์ธ๋ฑ์ค๋ ๋์ง ์๋๋ค. gl_journal_entry ๋ ์์ฐํ๊ฐ ๊ฑฐ๋์ผ๋ก ์ง๊ณํด์ GL-IDX ์์ ๊ฑฐ๋์ผ ์ธ๋ฑ์ค๋ฅผ ๋ถ์๋ค.
trade_date ๋ก ๊ฑฐ๋ฅผ ๋๋ occurred_at ๋ฒ์๋ ๋๋ํ ๊ฐ์ด ๊ฑด๋ค. ํํฐ์
ํค๊ฐ occurred_at ์ด๋ผ trade_date ์กฐ๊ฑด๋ง ๊ฑธ๋ฉด ๋ชจ๋ ํํฐ์
์ ์ฝ๋๋ค. ๊ฑฐ๋์ผ๊ณผ ๋ฐ์์ผ์ ๊ฐ๊ฒฉ์ ์ผ์ ํ์ง ์๋ค โ ์ฐํด๋ฉด ๋ฉฐ์น ๋ค์ด๊ณ , COB ๊ฐ ๋ฆ์ด์ง๋ฉด ํ๋ฃจ ์์ค ์๋ ์๋ค.
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| INDEX | ix_le_account_time |
account_id, occurred_at DESC |
| INDEX | ix_le_txno |
transaction_number |
| INDEX | ix_le_account_dir |
account_id, direction, occurred_at |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด |
|---|---|
ck_le_amount |
amount > 0 |
ck_le_direction |
direction IN ('DEPOSIT','WITHDRAWAL') |
ck_le_txno |
transaction_number REGEXP '^[0-9]{8}[A-Z]{2}[0-9]{10}$' |
ledger_entry.ledger_entry_id์ ์ฉ ์ฑ๋ฒ ์นด์ดํฐ
ledger_entry๋ ํํฐ์
ํค(occurred_at)๋ฅผ ํฌํจํ ๋ณตํฉ PK (ledger_entry_id, occurred_at)๋ฅผ ์ฐ๋๋ฐ, Hibernate๋ @IdClass ๋ณตํฉํค ๊ตฌ์ฑ ํ๋์ IDENTITY ์ฑ๋ฒ ์ ๋ต์ ์ง์ํ์ง ์๋๋ค(docs/flyway_guide.md 4-3์ ์ฐธ๊ณ ). ๊ทธ๋์ ledger_entry_id ์ปฌ๋ผ ์์ฒด์ AUTO_INCREMENT๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ง์ ํ์ฉํ ์ ์๊ณ , ์ด ์ ์ฉ ํ
์ด๋ธ์ ๋น ํ์ ์ ์ฅํด ์์ฑ๋๋ AUTO_INCREMENT ๊ฐ๋ง ์ทจํด ledger_entry_id๋ก ์ฌ์ฉํ๋ค. ๋ค๋ฅธ ์ปฌ๋ผ์ ๋์ง ์๋๋ค.
| ์ปฌ๋ผ๋ช | ๋ฐ์ดํฐ ํ์ | NULL ํ์ฉ | ๊ธฐ๋ณธ๊ฐ | ํค | ์ค๋ช |
|---|---|---|---|---|---|
sequence_id |
BIGINT |
X | AUTO_INCREMENT |
PK | ์์ฑ ์ฆ์ ledger_entry.ledger_entry_id๋ก ๊ทธ๋๋ก ์ฐ์ธ๋ค |
์์ฅ-์์ก ๋์ฌ ๋ถ์ผ์น ๋ชฉ๋ก (PH-38)
COB ๋์ฌ ์คํ
์ด ์์ฅ ๋์ ํฉ๊ณ์ account.balance๊ฐ ๋ค๋ฅธ ๊ณ์ข๋ฅผ ์์
์ผ๋ณ๋ก ๋จ๊ธด๋ค. ๊ด๋ฆฌ์ ๋ชฉ๋ก API(FE ADM-04)๊ฐ ์ฝ๋๋ค. ๊ฐ์ ์์
์ผ์ ๋ค์ ๋์ฌํ๋ฉด ๊ทธ๋ ํ์ ๋ชจ๋ ์ง์ฐ๊ณ ์ ๊ฒฐ๊ณผ๋ก ๋ฐ๊พผ๋ค โ ์ฌ์คํ ์ด๋ ฅ์ batch_execution_history๊ฐ ๋จ๊ธด๋ค. ๋์ฌ๋ ๋ณด๊ณ ๋ง ํ๊ณ ์ ์ ํ์ง ์์ผ๋ฏ๋ก ์ฒ๋ฆฌ ์ํ ์ปฌ๋ผ์ด ์๋ค. ๊ฐ์ฌ์ฉ ๊ธฐ๋ก์ด๋ผ ๊ณ์ข๊ฐ ํด์งยท์ ๋ฆฌ๋ผ๋ ๋จ๋๋ก account์ FK๋ฅผ ๊ฑธ์ง ์๋๋ค. ์ฐจ์ก(ledger_balance - account_balance)์ ์ ์ฅํ์ง ์๊ณ ์กฐํํ ๋ ๊ณ์ฐํ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
ledger_reconciliation_mismatch_id |
BIGINT |
PK | X | AUTO_INCREMENT |
๋ถ์ผ์น ํ ์๋ณ์ |
business_date |
DATE |
UK | X | ๋์ฌํ COB์ ๋ง๊ฐ ๋์ ์์
์ผ(ADR-0004 COB_DATE). batch_execution_history.business_date์ ๊ฐ์ ๊ฐ์ด๋ค |
|
account_id |
BIGINT |
UK | X | ๋ถ์ผ์น ๊ณ์ข | |
ledger_balance |
BIGINT |
X | ์์ฅ ๋์ ํฉ๊ณ SUM(DEPOSIT) - SUM(WITHDRAWAL). ์์ฅ์ด ์๋ ๊ณ์ข๋ 0 |
||
account_balance |
BIGINT |
X | ๋์ฌ ์์ ์ account.balance |
||
detected_at |
DATETIME(6) |
X | ๋์ฌ๊ฐ ๋ถ์ผ์น๋ฅผ ํ์ธํ ์๊ฐ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_ledger_reconciliation_mismatch_date_account |
business_date, account_id โ ์์
์ผ๋ณ ๋ชฉ๋ก ์กฐํ์ ์ต๊ทผ ์์
์ผ ์กฐํ๋ ์ด ์ธ๋ฑ์ค๋ฅผ ์ด๋ค |
์์ฃผ ์ฐ๋ ๊ณ์ข (์ต๋ 20๊ฑด์ ์ฑ ๊ฒ์ฆ)
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
favorite_account_id |
BIGINT |
PK | X | ๋ฑ๋ก ๊ฑด ๋ด๋ถ ์๋ณ์. ๋ณ์นญ ์์ ยท์ญ์ API์ ๊ฒฝ๋ก ๋ณ์ | |
customer_id |
BIGINT |
FK UK | X | ๋ฑ๋กํ ๊ณ ๊ฐ โ customer.customer_id |
|
deposit_account_number |
CHAR(12) |
UK | X | ๋ฑ๋กํ ์ ๊ธ ๊ณ์ข๋ฒํธ | |
payee_name |
VARCHAR(50) |
X | ๋ฑ๋ก ์์ ์๊ธ์ฃผ ์ค๋ ์ท | ||
alias |
VARCHAR(24) |
O | ๋ฏธ์ง์ ์ ์๊ธ์ฃผ๋ช (FAV0001) | ||
registered_at |
DATETIME(6) |
X | ๋ฑ๋ก ์ผ์ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_fav |
customer_id, deposit_account_number |
์ด์ฒดํ๋ (P1 ์์ ๊ฒฝ๊ณ ์ ์ง)
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
customer_id |
BIGINT |
PK FK | X | ๋์ ๊ณ ๊ฐ. ๊ณ ๊ฐ๋น 1ํ โ customer.customer_id |
|
one_time_limit |
BIGINT |
X | 1ํ ์ด์ฒดํ๋. ์ด๊ณผํ๋ฉด LMT0002 | ||
daily_limit |
BIGINT |
X | 1์ผ ์ด์ฒดํ๋. ์ด๊ณผํ๋ฉด LMT0003 | ||
created_at |
DATETIME(6) |
X | ํ๋ ์ต์ด ๋ถ์ฌ ์ผ์. REQ-TRSF-029๋ก ๊ฐ์ ์ ์์ฑ๋๋ค | ||
updated_at |
DATETIME(6) |
X | ํ ์ต์ข ์์ ์ผ์ |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด |
|---|---|
ck_tl_order |
one_time_limit <= daily_limit |
ck_tl_positive |
one_time_limit > 0 AND daily_limit > 0 |
๋๊ด์ ๋ฝ์ ์ฐ์ง ์๋๋ค
version ์ปฌ๋ผ์ V202608201115๋ก ์ ๊ฑฐํ๋ค. ํ๋ ๋ณ๊ฒฝ๊ณผ ์ด์ฒด ์คํ ๋ชจ๋ ๋น๊ด์ ๋ฝ(SELECT ... FOR UPDATE)์ผ๋ก ๊ฐ๋ค. ์ด์ฒด๋ ์ด ํ
์ด๋ธ์ ์ฝ๊ธฐ๋ง ํ๋ฏ๋ก ๋ฒ์ ๊ฒ์ฆ์ ํ๋ ค๋ฉด ์ปค๋ฐ ์ง์ ์ ์๋ฏธ ์๋ UPDATE๋ฅผ ๋ฃ์ด์ผ ํ๊ณ , ๊ทธ๋ฌ๋ฉด ๊ฐ์ ๊ณ ๊ฐ์ ๋์ ์ด์ฒด๊ฐ ์๋ก ์ถฉ๋ํด ์ฌ์๋๊ฐ ์๊ธด๋ค.
์ผ๋ณ ํ๋ ์ฌ์ฉ์ก (๋น๊ด์ ๋ฝ ๋์ 1์์)
์ด์ฒด ์คํ ์ ๊ฐ์ฅ ๋จผ์ ์ ๊ทธ๋ ์์ ์ค ํ๋๋ค. SUCCESS๋ก ํ์ ๋ ๊ฑด๋ง ํฉ์ฐํ๋ฉฐ ์ค๋ฅยท์ทจ์ยท๋ฏธ์คํ ์์ฝ์ ์ ์ธํ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
customer_id |
BIGINT |
PK FK | X | ๋์ ๊ณ ๊ฐ โ customer.customer_id |
|
usage_date |
DATE |
PK | X | ์ฌ์ฉ์ก ์ง๊ณ ๊ธฐ์ค์ผ. KST ์์ ์ผ์ด๋ฉฐ ๋งค์ผ ์ ํ์ด ์๊ธด๋ค | |
used_amount |
BIGINT |
X | 0 |
ํด๋น ์ผ์์ SUCCESS๋ก ํ์ ๋ ์ด์ฒด๊ธ์ก ๋๊ณ. ์ค๋ฅยท์ทจ์ยท๋ฏธ์คํ ์์ฝ์ ๋น ์ง๋ค |
|
created_at |
DATETIME(6) |
X | ํด๋น ์ผ์ ์ฒซ ์ด์ฒด๋ก ํ์ด ์์ฑ๋ ์๊ฐ | ||
updated_at |
DATETIME(6) |
X | ๋ง์ง๋ง ์ฌ์ฉ์ก ๊ฐฑ์ ์๊ฐ |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด |
|---|---|
ck_tldu_used |
used_amount >= 0 |
์ด์ฒดํ๋ ๋ณ๊ฒฝ ์ด๋ ฅ (P1 ์์ ๊ฒฝ๊ณ ์ ์ง)
REQ-TRSF-025์ "๋ณ๊ฒฝ ์ด๋ ฅ์ ์ ์ฅํ๋ค"๋ฅผ ๋ด๋๋ค. ํ๋ ๋ณ๊ฒฝ 1๊ฑด๋น 1ํ์ด ์์ด๋ append-only ํ
์ด๋ธ์ด๋ค. ๋ณ๊ฒฝ์ยท์์ฒญ IP ๊ฐ์ ๊ฐ์ฌ ์ ๋ณด๋ audit_log์ ์ฑ
์์ด๋ฏ๋ก ์ฌ๊ธฐ์๋ ๊ฐ์ ๋ณํ๋ง ๋จ๊ธด๋ค.
๋ณ๊ฒฝ ํ ๊ฐ์ ์ ์ฅํ์ง ์๋๋ค. ์ด๋ ฅ N์ ๋ณ๊ฒฝ ํ ๊ฐ์ ์ด๋ ฅ N+1์ before_*์ ๊ฐ๊ณ , ๋ง์ง๋ง ์ด๋ ฅ์ ๋ณ๊ฒฝ ํ ๊ฐ์ transfer_limit์ ํ์ฌ๊ฐ๊ณผ ๊ฐ๋ค. ๊ฐ์ ๊ฐ์ ๋ ๊ตฐ๋ฐ ๋๋ฉด ์ด๊ธ๋ ์ฌ์ง๋ง ์๊ธด๋ค. ์กฐํํ ๋๋ ์ํ๋ ๊ฑด์๋ณด๋ค ํ ๊ฑด ๋ ์ฝ์ด ์ธ์ ํ๋ผ๋ฆฌ ์ง์ ๋ง์ถ๊ณ , ๋ง์ง๋ง ํ๋ง transfer_limit์ ์ฝ์ด ์ฑ์ด๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
history_id |
BIGINT |
PK | X | AUTO_INCREMENT |
์ด๋ ฅ ์๋ณ์ |
customer_id |
BIGINT |
FK | X | ๋์ ๊ณ ๊ฐ โ customer.customer_id |
|
before_one_time_limit |
BIGINT |
X | ๋ณ๊ฒฝ ์ง์ 1ํ ์ด์ฒดํ๋ | ||
before_daily_limit |
BIGINT |
X | ๋ณ๊ฒฝ ์ง์ 1์ผ ์ด์ฒดํ๋ | ||
created_at |
DATETIME(6) |
X | ๋ณ๊ฒฝ์ด ์ผ์ด๋ ์๊ฐ | ||
updated_at |
DATETIME(6) |
X | ํ ์ต์ข
์์ ์ผ์. append-only๋ผ created_at๊ณผ ๊ฐ์ ๊ฐ์ด ์ ์ง๋๋ค |
์ ์ฝยท์ธ๋ฑ์ค๋ฅผ ๋์ง ์์ ์ด์
CHECK ์ ์ฝ์ ๋์ง ์๋๋ค โ ์ ์ฌ๋๋ ๊ฐ์ transfer_limit์ ck_tl_positiveยทck_tl_order๋ฅผ ์ด๋ฏธ ํต๊ณผํ ๊ฐ์ด๋ค. ๋ณ๋ ์ธ๋ฑ์ค๋ ๋์ง ์๋๋ค โ ์ด๋ ฅ ์กฐํ ์๊ตฌ์ฌํญ์ด ์์ง ์๊ณ , FK๊ฐ customer_id ์ธ๋ฑ์ค๋ฅผ ์๋ ์์ฑํ๋ค. ์กฐํ API๊ฐ ์๊ธฐ๋ฉด ๊ทธ๋ ์ถ๊ฐํ๋ค.
์ํ๊ฐ์
PRD0301(1์ธ 1๊ณ์ข ์ ํ)์ product.single_account_limit = TRUE์ธ ์ํ์๋ง ์ ์ฉ๋๋ฏ๋ก (customer_id, product_id)์ UNIQUE๋ฅผ ๊ฑธ์ง ์๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ด ์กฐํ ํ ํ์ ํ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
subscription_id |
BIGINT |
PK | X | ๊ฐ์ ๊ฑด ๋ด๋ถ ์๋ณ์. ๊ฐ์ ๊ฒฐ๊ณผ ์กฐํ์ ๊ฒฝ๋ก ๋ณ์ | |
customer_id |
BIGINT |
FK | X | ๊ฐ์
๊ณ ๊ฐ โ customer.customer_id |
|
product_id |
BIGINT |
FK | X | ๊ฐ์
์ํ โ product.product_id |
|
account_id |
BIGINT |
FK UK | O | ๊ฐ์
์ผ๋ก ์๋ก ๊ฐ์ค๋ ๊ณ์ข. ๊ฐ์
์คํจ ์ NULL โ account.account_id |
|
withdrawal_account_id |
BIGINT |
FK | X | ์ด์
๊ธ์ ๋นผ๊ฐ ์ถ๊ธ๊ณ์ข โ account.account_id |
|
subscription_amount |
BIGINT |
X | ๊ฐ์ ๊ธ์ก. ์ ๋ฆฝ์์ ์ ๋ฉ์ ์ก | ||
term_months |
SMALLINT |
X | ๊ฐ์ ๊ธฐ๊ฐ(๊ฐ์) | ||
payment_day |
TINYINT |
O | ๋งค์ ์๋ ๋ฉ์ ์ผ. 1~28 ์ฌ์ด์ด๋ฉฐ ์ ๋ฆฝ์ ์ํ๋ง ๊ฐ์ด ์๋ค | ||
base_rate |
DECIMAL(5,2) |
X | ๊ฐ์ ์์ ์ ๊ธฐ๋ณธ๊ธ๋ฆฌ ์ค๋ ์ท. ์ดํ ์ํ ๊ธ๋ฆฌ๊ฐ ๋ฐ๋์ด๋ ์ ์ง๋๋ค | ||
preferential_rate |
DECIMAL(5,2) |
X | 0.00 |
์ ์ฉ๋ ์ฐ๋๊ธ๋ฆฌ ํฉ๊ณ | |
applied_rate |
DECIMAL(5,2) |
X | ์ต์ข
์ ์ฉ๊ธ๋ฆฌ = base_rate + preferential_rate |
||
maturity_handling |
VARCHAR(12) |
X | ๋ง๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์. TRANSFER(์ถ๊ธ๊ณ์ข๋ก ์
๊ธ) / RENEW(์ฌ์์น) |
||
expected_maturity_amount |
BIGINT |
O | ์์ ๋ง๊ธฐ ์๋ น์ก(์ธ์ ) | ||
status |
VARCHAR(12) |
X | ๊ฐ์
์ฒ๋ฆฌ ๊ฒฐ๊ณผ. SUCCESS(์ ์) / ERROR(์ค๋ฅ) / PROCESSING(์ฒ๋ฆฌ์ค) |
||
transaction_number |
CHAR(20) |
O | ์ด์ ๊ธ ๊ธฐํ์ ๊ฑฐ๋๋ฒํธ. ์คํจ ์ NULL | ||
opened_date |
DATE |
O | ๊ฐ์ค์ผ | ||
maturity_date |
DATE |
O | ๋ง๊ธฐ์ผ | ||
subscribed_at |
DATETIME(6) |
X | ๊ฐ์ ์คํ ์ผ์ | ||
subscription_trade_date |
DATE |
O | ๊ฐ์
๋
ผ๋ฆฌ ์์
์ผ. ๊ฐ์
ํธ๋์ญ์
์ด ์์
์ผ gate(BusinessDateGate)๋ก ์ฝ์ ๊ฐ์ด๋ค. ์ ๋ณด๊ณ SUBSCRIBE ์ด๋ฒคํธ ๊ธฐ์ค์ผ. ๊ธฐ์กด ํ์ ๊ฐ์
์๊ฐ์ ์์
์ผ๋ก ์ฌ๋ ค ์ฑ์ ๋ค |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_sub_account |
account_id |
| INDEX | ix_sub_customer_product |
customer_id, product_id, status |
์ํ ์ฝ๊ด ๋์ (๋ฒ์ ยท์ด๋ ์ด๋ ฅ)
terms_version๊ณผ read_at์ด PRD0005(์ ๋ฌธ ์ด๋)ยทPRD0006(๋ฒ์ ๋ถ์ผ์น) ํ์ ์ ๋ฌผ๋ฆฌ์ ๊ทผ๊ฑฐ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
subscription_id |
BIGINT |
PK FK | X | ๋์ ๊ฐ์
๊ฑด โ product_subscription.subscription_id |
|
terms_id |
BIGINT |
PK FK | X | ๋์ํ ์ฝ๊ด โ terms.terms_id |
|
terms_version |
VARCHAR(10) |
X | ๋์ ์์ ์ ์ฝ๊ด ๋ฒ์ . ํ์ฌ ๋ฒ์ ๊ณผ ๋ค๋ฅด๋ฉด PRD0006 | ||
read_at |
DATETIME(6) |
O | ์ฝ๊ด ์ ๋ฌธ์ ์ฐ ์๊ฐ. view_required = TRUE ์ฝ๊ด์ธ๋ฐ NULL์ด๋ฉด PRD0005 |
||
agreed_at |
DATETIME(6) |
X | ๋์ ์๊ฐ |
์์ฝ์ด์ฒด
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
scheduled_transfer_id |
BIGINT |
PK | X | ์์ฝ ๊ฑด ๋ด๋ถ ์๋ณ์. ์์ธ ์กฐํยท์ทจ์ API์ ๊ฒฝ๋ก ๋ณ์ | |
customer_id |
BIGINT |
FK | X | ์์ฝํ ๊ณ ๊ฐ โ customer.customer_id |
|
withdrawal_account_id |
BIGINT |
FK | X | ์ถ๊ธ๊ณ์ข โ account.account_id |
|
payee_bank_code |
CHAR(3) |
X | ์ ๊ธ ์ํ ์ฝ๋. 1์ฐจ๋ ๋นํ ์ ์ฉ์ด๋ผ ์์์ด๋ฉฐ ๋ณ๋ ์ํ ํ ์ด๋ธ์ ๋์ง ์๋๋ค | ||
payee_account_number |
CHAR(12) |
X | ์ ๊ธ ๊ณ์ข๋ฒํธ | ||
payee_name |
VARCHAR(50) |
X | ์๊ธ์ฃผ๋ช . ๋ฑ๋ก ์์ ์ค๋ ์ท์ด๋ผ ์ดํ ์๋ ๊ณ์ข๊ฐ ๋ฐ๋์ด๋ ์ ์ง๋๋ค | ||
amount |
BIGINT |
X | ์ด์ฒด๊ธ์ก | ||
scheduled_date |
DATE |
X | ์์ฝ ์คํ์ผ. ๋ฑ๋ก์ผ ์ต์ผ๋ถํฐ 1๋ ์ด๋ด์ฌ์ผ ํ๋ค (SCD0001) | ||
my_passbook_memo |
VARCHAR(10) |
O | ๋ด ํต์ฅ์ ์ฐํ๋ ๋ฌธ๊ตฌ | ||
recipient_passbook_memo |
VARCHAR(10) |
O | ๋ฐ๋ ๋ถ ํต์ฅ์ ์ฐํ๋ ๋ฌธ๊ตฌ | ||
status |
VARCHAR(12) |
X | ์์ฝ ๊ฑด ์๋ช
์ฃผ๊ธฐ ์ํ. WAITING(๋๊ธฐ) / PROCESSING(์ฒ๋ฆฌ์ค) / SUCCESS(์ ์) / FAILED(์ค๋ฅ) / CANCELED(์ทจ์) |
||
transaction_number |
CHAR(20) |
O | ์คํ ์ฑ๊ณต ์ ์์ฑ๋ ๊ฑฐ๋๋ฒํธ. ๋๊ธฐยท์คํจ ๊ฑด์ NULL | ||
registered_at |
DATETIME(6) |
X | ์์ฝ ๋ฑ๋ก ์ผ์ | ||
executed_at |
DATETIME(6) |
O | ๋ฐฐ์น ์คํ ์ผ์. ๋ฏธ์คํ์ด๋ฉด NULL | ||
canceled_at |
DATETIME(6) |
O | ์ทจ์ ์ผ์. ๋ฏธ์ทจ์๋ฉด NULL | ||
failure_reason |
VARCHAR(200) |
O | ์คํ ์คํจ ์ฌ์ | ||
version |
BIGINT |
X | 0 |
๋๊ด์ ๋ฝ ๋ฒ์ . ๋ค๊ฑด ์ทจ์๊ฐ ์ฝ์ด๋ ๊ฑด์ ๋ฐฐ์น๊ฐ PROCESSING์ผ๋ก ์ ์ ํ๋ฉด ์ทจ์ ์ ์ฅ์ด CMN0303์ผ๋ก ๊ฑธ๋ฆฐ๋ค |
|
active_dup_key |
VARCHAR(80) GEN |
UK | O | ์์ฑ ์ปฌ๋ผ. WAITING์ผ ๋๋ง ๊ฐ์ด ์๊ฒจ ์ค๋ณต ์์ฝ์ ๋ง๋๋ค (SCD0301) |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_sched_active_dup |
active_dup_key |
| INDEX | ix_sched_batch |
status, scheduled_date |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด |
|---|---|
ck_sched_amount |
amount > 0 |
์๋์ด์ฒด ๋ฑ๋ก
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
auto_transfer_id |
BIGINT |
PK | X | ์๋์ด์ฒด ๋ฑ๋ก ๊ฑด ๋ด๋ถ ์๋ณ์. ๋ณ๊ฒฝยทํด์ง API์ ๊ฒฝ๋ก ๋ณ์ | |
customer_id |
BIGINT |
FK | X | ๋ฑ๋กํ ๊ณ ๊ฐ โ customer.customer_id |
|
withdrawal_account_id |
BIGINT |
FK | X | ์ถ๊ธ๊ณ์ข โ account.account_id |
|
deposit_account_number |
CHAR(12) |
X | ์ ๊ธ ๊ณ์ข๋ฒํธ. ์๋ ๊ณ์ข๋ผ ๋ด๋ถ PK๊ฐ ์๋ ๋ฒํธ๋ก ์ง์นญํ๋ค | ||
payee_name |
VARCHAR(50) |
X | ์๊ธ์ฃผ๋ช . ๋ฑ๋ก ์์ ์ค๋ ์ท | ||
amount |
BIGINT |
X | ํ์ฐจ๋ง๋ค ์ด์ฒดํ ๊ธ์ก | ||
cycle_months |
TINYINT |
X | ์ด์ฒด ์ฃผ๊ธฐ(๊ฐ์). 1 / 3 / 6 ์ค ํ๋ |
||
transfer_day |
TINYINT |
X | ๋งค์ ์ด์ฒด ์ง์ ์ผ. 1~31 (AUT0001) | ||
start_date |
DATE |
X | ์ด์ฒด ์์์ผ | ||
end_date |
DATE |
X | ์ด์ฒด ์ข ๋ฃ์ผ. ์์์ผ ์ดํ 60๊ฐ์ ์ด๋ด (AUT0002) | ||
next_execution_date |
DATE |
X | ๋ค์ ์คํ ์์ ์ผ. ๋ฐฐ์น๊ฐ ์ด ๊ฐ์ผ๋ก ๋์์ ๊ณ ๋ฅธ๋ค | ||
my_passbook_memo |
VARCHAR(10) |
O | ๋ด ํต์ฅ์ ์ฐํ๋ ๋ฌธ๊ตฌ | ||
recipient_passbook_memo |
VARCHAR(10) |
O | ๋ฐ๋ ๋ถ ํต์ฅ์ ์ฐํ๋ ๋ฌธ๊ตฌ | ||
status |
VARCHAR(12) |
X | ๋ฑ๋ก ๊ฑด ์๋ช
์ฃผ๊ธฐ ์ํ. NORMAL(์ด์ฉ ์ค) / EXPIRED(๊ธฐ๊ฐ ๋ง๋ฃ๋ก ์์คํ
์๋ ์ข
๋ฃ) / TERMINATED(๊ณ ๊ฐ ์ง์ ํด์ง). ํ์ฐจ ์คํ๊ฒฐ๊ณผ์๋ ์ ํ ๋ค๋ฅธ ๊ฐ๋
์ด๋ค |
||
registered_at |
DATETIME(6) |
X | ๋ฑ๋ก ์ผ์ | ||
terminated_at |
DATETIME(6) |
O | ํด์งยท๋ง๋ฃ ์ ํ ์๊ฐ | ||
updated_at |
DATETIME(6) |
X | ํ ์ต์ข ์์ ์ผ์ | ||
active_dup_key |
VARCHAR(64) GEN |
UK | O | ์์ฑ ์ปฌ๋ผ. NORMAL์ผ ๋๋ง ๊ฐ์ด ์๊ฒจ ์ค๋ณต ๋ฑ๋ก์ ๋ง๋๋ค (AUT0301) |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_auto_active_dup |
active_dup_key |
| INDEX | ix_auto_batch |
status, next_execution_date |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด |
|---|---|
ck_auto_cycle |
cycle_months IN (1, 3, 6) |
ck_auto_day |
transfer_day BETWEEN 1 AND 31 |
ck_auto_period |
end_date >= start_date |
ck_auto_amount |
amount > 0 |
์๋์ด์ฒด ํ์ฐจ ์คํ๊ฒฐ๊ณผ
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
execution_id |
BIGINT |
PK | X | ํ์ฐจ ๋ด๋ถ ์๋ณ์ | |
auto_transfer_id |
BIGINT |
FK UK | X | ์์ ์๋์ด์ฒด ๋ฑ๋ก ๊ฑด โ auto_transfer.auto_transfer_id |
|
execution_date |
DATE |
UK | X | ํ์ฐจ ์คํ ์์ ์ผ. ๋ฑ๋ก ๊ฑด์ transfer_day๋ก ๊ณ์ฐ๋๋ค |
|
amount |
BIGINT |
X | ํ์ฐจ ์ด์ฒด๊ธ์ก. ๋ฑ๋ก ๊ฑด ๊ธ์ก์ด ๋์ค์ ๋ฐ๋์ด๋ ์คํ ์์ ๊ฐ์ ๋จ๊ธด๋ค | ||
status |
VARCHAR(12) |
X | ํ์ฐจ ์คํ๊ฒฐ๊ณผ. SUCCESS(์ ์) / ERROR(์ค๋ฅ) / PROCESSING(์ฒ๋ฆฌ์ค). ๋ฑ๋ก ๊ฑด ์ํ์ ๋ณ๊ฐ Enum์ด๋ค |
||
transaction_number |
CHAR(20) |
O | ์ฑ๊ณต ์ ์์ฑ๋ ๊ฑฐ๋๋ฒํธ. ์คํจ ๊ฑด์ NULL | ||
failure_reason |
VARCHAR(200) |
O | ์คํจ ์ฌ์ | ||
executed_at |
DATETIME(6) |
X | ์ค์ ์คํ ์ผ์ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_ate_dup |
auto_transfer_id, execution_date |
๋ฉฑ๋ฑํค (common_rev 7-2)
request_hash ๊ณ์ฐ ์ *AuthToken์ผ๋ก ๋๋๋ ํ๋๋ ์ ์ธํ๋ค. ๋คํธ์ํฌ ์ง์ฐ ์ฌ์์ฒญ์์ ํ ํฐ๋ง ๊ฐฑ์ ๋ผ ๋ค๋ฅธ ์์ฒญ์ผ๋ก ์คํ์ง๋๋ ๊ฒ์ ๋ง๋๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
idempotency_key |
CHAR(36) |
PK | X | ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ Idempotency-Key ํค๋๊ฐ(UUID v4). ๊ฐ์ ์์ฒญ์ ์ค๋ณต ์คํ์ ๋ง๋ ๊ธฐ์ค |
|
customer_id |
BIGINT |
FK | O | ์์ฒญ ๊ณ ๊ฐ โ customer.customer_id. ๊ณ ๊ฐ ์์ฑ ์ ํ์๊ฐ์
์๋ฃ ๋ฉฑ๋ฑํค ์์ฝ์ NULL |
|
endpoint |
VARCHAR(120) |
X | ์์ฒญ ๋์ ์๋ํฌ์ธํธ. ๊ฐ์ ํค๊ฐ ๋ค๋ฅธ API์ ์ฌ์ฌ์ฉ๋๋ ๊ฒ์ ๊ฑธ๋ฌ๋ธ๋ค | ||
request_hash |
CHAR(64) |
X | ์์ฒญ ๋ณธ๋ฌธ์ SHA-256 ํด์. ๊ฐ์ ํค์ธ๋ฐ ๊ฐ์ด ๋ค๋ฅด๋ฉด CMN0302 | ||
state |
VARCHAR(12) |
X | ์ฒ๋ฆฌ ์ํ. PROCESSING(์ฒ๋ฆฌ ์ค) / COMPLETED(์๋ฃ). ์ฌ์์ฒญ ์ CMN0301๊ณผ 200 ๋ฐํ์ ๊ฐ๋ฅด๋ ๊ธฐ์ค |
||
http_status |
SMALLINT |
O | ์ ์ฅ๋ ์๋ต์ HTTP ์ํ์ฝ๋ | ||
response_snapshot |
JSON |
O | ์ ์ฅ๋ ์๋ต ๋ณธ๋ฌธ. ์ฌ์์ฒญ ์ ๊ทธ๋๋ก ๋๋๋ ค์ค๋ค | ||
created_at |
DATETIME(6) |
X | ์ต์ด ์์ฒญ ์์ ์๊ฐ | ||
expires_at |
DATETIME(6) |
X | ๋ง๋ฃ ์๊ฐ. 24์๊ฐ ๊ฒฝ๊ณผ ๊ฑด์ ๋ฐฐ์น๊ฐ ์ง์ด๋ค |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| INDEX | ix_idem_expires |
expires_at |
๊ฐ์ฌ ๋ก๊ทธ (REQ-NFR-010). ์กฐํ API ์์ผ๋ ๊ท์ ๊ทผ๊ฑฐ๋ก ์ ์ง
์กฐํ API๋ ์์ง๋ง REQ-NFR-010์ด ๊ธฐ๋ก ํญ๋ชฉ์ ํน์ ํ๊ณ ์์ด ์ ํ ํ ์ด๋ธ๋ก ์ ์งํ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
audit_log_id |
BIGINT |
PK | X | ๊ฐ์ฌ ๋ก๊ทธ ๋ด๋ถ ์๋ณ์ | |
customer_id |
BIGINT |
O | ํ์ ๊ณ ๊ฐ. ๋น๋ก๊ทธ์ธ ์๋๋ NULL | ||
transaction_number |
CHAR(20) |
O | ์์ฅ ๋ณ๊ฒฝ ๊ฑฐ๋์ ๊ฑฐ๋๋ฒํธ. ๊ฑฐ๋์ ๋ก๊ทธ๋ฅผ ์๋ ํค | ||
event_type |
VARCHAR(40) |
X | ๊ฐ์ฌ ์ด๋ฒคํธ ์ข ๋ฅ. ์ด์ฒด ์คํยทํ๋ ๋ณ๊ฒฝ ๋ฑ ์์ฅ์ ์ํฅ์ ์ค ํ์๋ฅผ ๊ตฌ๋ถํ๋ค | ||
request_ip |
VARCHAR(45) |
X | ์์ฒญ ํด๋ผ์ด์ธํธ IP. IPv6๊น์ง ๋ด๊ธฐ๋๋ก 45์ | ||
result |
VARCHAR(12) |
X | ์ฒ๋ฆฌ ๊ฒฐ๊ณผ. SUCCESS / FAILURE |
||
detail |
JSON |
O | ๋ถ๊ฐ ์ ๋ณด. ๋น๋ฐ๋ฒํธยท์ ์ฒด ๊ณ์ข๋ฒํธ ๋ฑ์ ๋ง์คํน ํ ์ ์ฅํ๋ค | ||
requested_at |
DATETIME(6) |
X | ์์ฒญ ์ผ์ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| INDEX | ix_audit_customer |
customer_id, requested_at DESC |
| INDEX | ix_audit_txno |
transaction_number |
๊ณตํต์ฝ๋ (REQ-CMN-023). ์ฝ๋๊ฐ โ ํ๋ฉด ํ์๋ช ๋งคํ
code ๊ฐ์ ์๋ฒ Enum ๊ฐ๊ณผ ๋ฌธ์์ด์ด ์ ํํ ์ผ์นํด์ผ ํ๋ค. Enum์๋ ์๋๋ฐ ์ด ํ
์ด๋ธ์ ํ์ด ์์ผ๋ฉด ํ๋ก ํธ๊ฐ ํ์๋ช
๋งคํ์ ์คํจํ๋ค. P5 ํ
์ด๋ธ ์ค ์ ์ผํ๊ฒ created_at/updated_at์ ๋ชจ๋ ๊ฐ์ ธ BaseEntity๋ฅผ ์์ํ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
code_group |
VARCHAR(50) |
PK | X | ์ฝ๋ ๊ทธ๋ฃน๋ช
. ์: ACCOUNT_STATUS |
|
code |
VARCHAR(50) |
PK | X | ์ฝ๋๊ฐ. ์๋ฒ Enum ๊ฐ๊ณผ ์ผ์น. ์: ACTIVE |
|
code_name |
VARCHAR(100) |
X | ํ๋ฉด ํ์ ํ๊ธ๋ช
. ์: ์ ์ |
||
sort_order |
INT |
X | ๋๋กญ๋ค์ด ํ์ ์์ | ||
use_yn |
CHAR(1) |
X | Y |
์ฌ์ฉ ์ฌ๋ถ. Y/N. ๋ฌผ๋ฆฌ ์ญ์ ๋์ ์ฌ์ฉ |
|
description |
VARCHAR(200) |
O | ๊ด๋ฆฌ์์ฉ ์ค๋ช | ||
created_at |
DATETIME(6) |
X | JPA Auditing | ||
updated_at |
DATETIME(6) |
X | JPA Auditing |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| INDEX | ix_common_code_group |
code_group, use_yn, sort_order |
๋ฐฐ์น ์ค๋ณต ํธ๋ฆฌ๊ฑฐ ๋ฐฉ์ง ๋ฝ (#189). Apache Fineract
SchedulerTriggerListener.vetoJobExecution()ํจํด ์ฐธ๊ณ
๋ค์ค ์ธ์คํด์ค ๋ฐฐํฌ ์ ๊ฐ์ ๋ฐฐ์น(์: DailyTransferBatchScheduler.runDailyBatch())๊ฐ ๋์์ ๋ ๋ฒ ํธ๋ฆฌ๊ฑฐ๋๋ ๊ฑธ ๋ง๋๋ค. SELECT ... FOR UPDATE๋ก ํ์ ์ ๊ทธ๊ณ ํ๋๊ทธ๋ง ํ์ธยท๊ฐฑ์ ํ ๋ค ์ฆ์ ์ปค๋ฐํ๋ ์งง์ ํธ๋์ญ์
์ด๋ผ, ๋ฐฐ์น ์คํ ์ ์ฒด ๋์ ์ด ํ
์ด๋ธ์ ์ ๊ทธ์ง ์๋๋ค. currently_running=TRUE์ธ ์ฑ๋ก updated_at์ด stale ์๊ณ๊ฐ(6์๊ฐ)๋ณด๋ค ์ค๋๋๋ฉด ์๋ฒ ํฌ๋์๋ก ๋ฝ ํด์ ๊ฐ ๋ชป ๋ถ๋ฆฐ ๊ฒ์ผ๋ก ๋ณด๊ณ ๊ฐ์ ๋ก ์ฌํ๋ํ๋ค. ๋ฐฐ์น ์ข
๋ฅ๋ง๋ค job_name์ ํ๋์ฉ ๋ฑ๋กํด ์ฌ์ฌ์ฉํ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
job_name |
VARCHAR(50) |
PK | X | ๋ฐฐ์น ์ก ์๋ณ์. DAILY_TRANSFER_BATCH, IDEMPOTENCY_KEY_CLEANUP, LEDGER_RECONCILIATION_BATCH, AUTH_TOKEN_CLEANUP, TERMS_VIEW_HISTORY_CLEANUP, AUTO_TRANSFER_RECONCILE, SCHEDULED_TRANSFER_RECONCILE, COB 8ํ |
|
currently_running |
BOOLEAN |
X | FALSE |
์ด ๋ฐฐ์น๊ฐ ์ง๊ธ ์คํ ์ค์ธ์ง. ํธ๋ฆฌ๊ฑฐ ์์ ์ TRUE, ์ข
๋ฃ ์(์ฑ๊ณต/์คํจ ๋ฌด๊ด) FALSE๋ก ๋๋๋ฆผ |
|
updated_at |
DATETIME(6) |
X | ๋ง์ง๋ง ์ํ ๋ณ๊ฒฝ ์๊ฐ. stale(ํฌ๋์๋ก ๋ฐฉ์น๋จ) ํ๋จ ๊ธฐ์ค |
COB ๋ฑ ๋ฐฐ์น๊ฐ ์คํ ์ ์คํํ ๊ธฐ๋ก (#603)
CobRunnerService๊ฐ ์คํ
(CobStep)์ ํ๋ ์คํํ ๋๋ง๋ค ๊ฒฐ๊ณผ๋ฅผ 1ํ ์ถ๊ฐํ๋ค(append-only, UPDATEยทDELETE ์์). ์คํ
์ด ์์ํ๊ธฐ ์ ์๋ ํ์ด ์๊ณ , ๋๋ ๋ค(์ฑ๊ณตยท์คํจยท์ค๋จ ์ค ํ๋๋ก ํ์ ๋ ๋ค) ํ ๋ฒ๋ง INSERTํ๋ค. ๊ด๋ฆฌ์ ์กฐํ API๋ ์์ง ์๋ค(#603 ๋ฒ์ ๋ฐ).
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
batch_execution_history_id |
BIGINT |
PK | X | ๋ด๋ถ ์๋ณ์ (AUTO_INCREMENT) | |
job_name |
VARCHAR(50) |
X | ๋ฐฐ์น ์๋ณ์. ์: COB |
||
step_name |
VARCHAR(100) |
X | CobStep.name() |
||
business_date |
DATE |
X | ์คํ
์ด ์ฒ๋ฆฌํ ์์
์ผ(COB_DATE) |
||
started_at |
DATETIME(6) |
X | ์คํ ์์ ์๊ฐ | ||
ended_at |
DATETIME(6) |
X | ์คํ ์ข ๋ฃ(์ฑ๊ณต/์คํจ/์ค๋จ ํ์ ) ์๊ฐ | ||
status |
VARCHAR(10) |
X | SUCCESS / FAILURE / HALTED(CobStepHaltException, #600) |
||
failure_reason |
TEXT |
O | ์คํจยท์ค๋จ ์ ์์ธ ๋ฉ์์ง. SUCCESS๋ฉด NULL |
์ผํ์ฑ ์ธ์ฆ ํ ํฐ (#580). Redis์ ์๋ ํ ํฐ 7์ข ์ ์ฎ๊ฒผ๋ค
์ฝ๊ด ๋์ ยท ์์ด๋ ํ์ธ ยท ์ด๋ฉ์ผ ์ธ์ฆ ยท ๊ณ์ข ์ธ์ฆ ยท ์์๊ฐ์
(ํ์๊ฐ์
5์ข
)๊ณผ OTP ์ธ์ฆ ยท ๊ณ์ข๋น๋ฐ๋ฒํธ ์ธ์ฆ ํ ํฐ์ ํ ํ
์ด๋ธ์ ๋๋ค. ํ ํฐ ์๋ฌธ์ ์ ์ฅํ์ง ์๊ณ SHA-256 ํด์๋ก ์ฐพ๋๋ค. ์๋น๋ consumed_at IS NULL AND claim_id IS NULL AND expires_at > now ์กฐ๊ฑด๋ถ UPDATE ํ ๋ฒ์ด๊ณ , ์ํฅ๋ฐ์ ํ์ด 1์ผ ๋๋ง ์ฑ๊ณต์ด๋ค. ์์๊ฐ์
ํ ํฐ๋ง ์์ธ๋ก, ์ ์ ํ ๊ฐ์
์๋ฃ ์์ฒญ์ด claim_id = ์๊ธฐ ์์ฒญ ID ์กฐ๊ฑด์ผ๋ก ์๋นํ๋ค. ์ ์ฅยท์๋น ๋ชจ๋ ํธ์ถ์ ํธ๋์ญ์
์ ์ฐธ์ฌํ๋ฏ๋ก ์
๋ฌด๊ฐ ๋กค๋ฐฑ๋๋ฉด ์๋น๋ ๋กค๋ฐฑ๋๋ค(#498).
์ ํจ์ฑ์ ํญ์ expires_at์ผ๋ก ํ์ ํ๋ค. AUTH_TOKEN_CLEANUP ๋ฐฐ์น๋ ๋ง๋ฃ ํ์ ์ง์ ๊ณต๊ฐ์ ํ์ํ ๋ฟ์ด๋ค. ๊ธธ์ด์ผ 30๋ถ ์ฌ๋ ๋ฐ์ดํฐ๋ผ customer์ FK๋ฅผ ๊ฑธ์ง ์๋๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
auth_token_id |
BIGINT |
PK | X | ๋ด๋ถ ์๋ณ์ (AUTO_INCREMENT) | |
purpose |
VARCHAR(30) |
UK | X | ํ ํฐ ์ข
๋ฅ. TERMS_AUTH / USER_ID_CHECK / EMAIL_VERIFICATION / ACCOUNT_AUTH / TEMP_SIGNUP / OTP_AUTH / ACCOUNT_PASSWORD_AUTH |
|
token_hash |
CHAR(64) |
UK | X | ํ ํฐ ์๋ฌธ์ SHA-256 16์ง์ | |
customer_id |
BIGINT |
O | ๋ก๊ทธ์ธ ๊ณ ๊ฐ ํ ํฐ์ ๊ณ ๊ฐ. ํ์๊ฐ์
ํ ํฐ์ NULL |
||
payload |
TEXT |
X | ํ ํฐ์ ๋ฌถ์ธ ๊ฐ(JSON ๋ฌธ์์ด). utf8mb4_bin์ด๋ผ ๊ฐ ์ผ์น ์๋น๊ฐ ๋ฐ์ดํธ ๋จ์๋ก ๋น๊ต๋๋ค |
||
claim_id |
CHAR(36) |
O | ์์๊ฐ์
ํ ํฐ์ ์ ์ ํ ๊ฐ์
์๋ฃ ์์ฒญ ID. ์ ์ ์ ยท๋ณต๊ตฌ ํ๋ NULL |
||
created_at |
DATETIME(6) |
X | ๋ฐ๊ธ ์๊ฐ | ||
expires_at |
DATETIME(6) |
X | ๋ง๋ฃ ์๊ฐ. ์ด ์๊ฐ์ด ์ง๋๋ฉด ์กฐํยท์๋น๋์ง ์๋๋ค | ||
consumed_at |
DATETIME(6) |
O | ์๋น ์๊ฐ. NULL์ด๋ฉด ์์ง ์ฐ์ง ์์ ํ ํฐ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_auth_token_hash_purpose |
token_hash, purpose |
| INDEX | ix_auth_token_expires |
expires_at |
๊ณ ๊ฐ๋ณ OTP ๋ฐ๊ธ ์ ๊ธ (#580). Redis
SET NX์ ๊ธ์ ์ฎ๊ฒผ๋ค
๊ฐ์ ๊ณ ๊ฐ์ OTP ๋ฐ๊ธ ์์ฒญ์ ์ฌ๋ฌ ์ธ์คํด์ค์์ ํ ๋ฒ์ ํ๋๋ง ํต๊ณผ์ํจ๋ค. ์ ๊ธ์ ๋ฐ๊ธ ํธ๋์ญ์
์ ์ฐธ์ฌํ์ง ์๊ณ (NOT_SUPPORTED) ๋ฌธ์ฅ๋ง๋ค ๋ฐ๋ก ์ปค๋ฐํด ๋ค๋ฅธ ์ธ์คํด์ค์ ์ฆ์ ๋ณด์ด๊ฒ ํ๋ค. ํ๋(INSERT IGNORE โ ๋ง๋ฃ ์ ๊ธ UPDATE)์ ํ ํธ๋์ญ์
์ ๋ฌถ์ผ๋ฉด ๊ต์ฐฉ์ด ๋ ์ ์์ด์๋ค. ๋ง๋ฃ๋ ์ ๊ธ์ ๋ค๋ฅธ ์์ฒญ์ด ๋ค์ ์ก์ ์ ์๊ณ , ํด์ ๋ owner_id๊ฐ ๊ฐ์ ๋๋ง ๋๋ค. ๊ณ ๊ฐ๋น 1ํ์ด๋ผ ์ ๋ฆฌ ๋ฐฐ์น๊ฐ ์๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
customer_id |
BIGINT |
PK | X | ์ ๊ธ ๋์ ๊ณ ๊ฐ | |
owner_id |
CHAR(36) |
X | ์ ๊ธ์ ์ก์ ๋ฐ๊ธ ์์ฒญ ID(UUID) | ||
expires_at |
DATETIME(6) |
X | ์ ๊ธ ๋ง๋ฃ ์๊ฐ |
์ํ ์ฝ๊ด ์ด๋ ์ด๋ ฅ (#580). Redis TTL 30๋ถ ํค๋ฅผ ์ฎ๊ฒผ๋ค
์ํ๊ฐ์
์ ์ฝ๊ด์ ์ด๋ํ๋์ง 30๋ถ ๋์ ์ธ์ ํ๋ค. ๋ค์ ์ด๋ํ๋ฉด ๊ฐ์ ํ์ viewed_atยทexpires_at์ ๋ฎ์ด์ด๋ค. ์ ํจ์ฑ์ expires_at์ผ๋ก ํ์ ํ๋ฏ๋ก ๋ง๋ฃ ์ฆ์ ์ด๋์ผ๋ก ์ธ์ ๋์ง ์๋๋ค. ํ ์ญ์ ๋ ๋งค์ 45๋ถ์ ๋๋ TERMS_VIEW_HISTORY_CLEANUP ๋ฐฐ์น๊ฐ ๋งก์์, ๋ง๋ฃ๋ ํ์ด ์ต๋ ์ฝ 1์๊ฐ(์ด๋ ์์ ๋ถํฐ ์ฝ 90๋ถ) DB์ ๋จ์ ์ ์๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
customer_id |
BIGINT |
PK | X | ์ด๋ ๊ณ ๊ฐ | |
terms_id |
BIGINT |
PK | X | ์ด๋ํ ์ฝ๊ด | |
viewed_at |
DATETIME(6) |
X | ๋ง์ง๋ง ์ด๋ ์๊ฐ | ||
expires_at |
DATETIME(6) |
X | ์ด๋ ์ธ์ ๋ง๋ฃ ์๊ฐ (์ด๋ ํ 30๋ถ) |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| INDEX | ix_terms_view_history_expires |
expires_at |
์ด๋ฒคํธ ๋ฐํ ๊ธฐ๋ก โ ์์๋ฐ์ค (PH-96, #437). Spring Modulith Event Publication Registry๊ฐ ์์ ํ๋ค
์
๋ฌด ํธ๋์ญ์
์์์ ๋ฐํ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ AFTER_COMMIT ๋ฆฌ์ค๋๋ง๋ค 1ํ์ ๊ฐ์ ์ปค๋ฐ์ผ๋ก ๋จ๊ธด๋ค. ๋ฆฌ์ค๋๊ฐ ์ฑ๊ณตํ๋ฉด ํ์ ์ง์ด๋ค(spring.modulith.events.completion-mode=delete). ๊ทธ๋์ ๋จ์ ์๋ ํ์ด ๊ณง ์์ง ์ ๋ฌ๋์ง ์์ ์ด๋ฒคํธ๋ค. ์ปค๋ฐ ์งํ ๋ฆฌ์ค๋๊ฐ ์คํจํ๊ฑฐ๋ ํ๋ก์ธ์ค๊ฐ ์ฃฝ์ด๋ ํ์ด ๋จ์ ๋ค์ ์ ๋ฌํ ์ ์๋ค.
DDL์ spring-modulith-events-jdbc 2.0.8์ schemas/v2/schema-mysql.sql์ ๊ทธ๋๋ก ์ฎ๊ฒผ๋ค. ํ
์ด๋ธยท์ปฌ๋ผ๋ช
์ด ๋๋ฌธ์์ธ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด ์ด๋ฆ์ผ๋ก ์กฐํํ๊ธฐ ๋๋ฌธ์ด๊ณ , ์๊ฐ์ด TIMESTAMP(6)(2038-01-19๊น์ง)์ธ ๊ฒ์ ์๋ณธ DDL์ ๋ฐ๊พธ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค(ADR-0010). ํ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ง์ ์ฐ์ง ์๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ด๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
ID |
VARCHAR(36) |
PK | X | ๋ฐํ ๊ธฐ๋ก ์๋ณ์ (UUID) | |
LISTENER_ID |
VARCHAR(512) |
X | ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ๋ฆฌ์ค๋ ๋ฉ์๋ ์๋ณ์ | ||
EVENT_TYPE |
VARCHAR(512) |
X | ์ด๋ฒคํธ ํด๋์ค ์ ์ฒด ์ด๋ฆ | ||
SERIALIZED_EVENT |
VARCHAR(4000) |
X | Jackson์ผ๋ก ์ง๋ ฌํํ ์ด๋ฒคํธ JSON | ||
PUBLICATION_DATE |
TIMESTAMP(6) |
X | ๋ฐํ ์๊ฐ | ||
COMPLETION_DATE |
TIMESTAMP(6) |
O | NULL |
์๋ฃ ์๊ฐ. delete ๋ชจ๋์์๋ ์๋ฃ ์ ํ์ด ์ง์์ ธ ์ฐ์ด์ง ์๋๋ค |
|
STATUS |
VARCHAR(20) |
O | PUBLISHED / PROCESSING / COMPLETED / FAILED / RESUBMITTED |
||
COMPLETION_ATTEMPTS |
INT |
O | ์ ๋ฌ ์๋ ํ์ | ||
LAST_RESUBMISSION_DATE |
TIMESTAMP(6) |
O | NULL |
๋ง์ง๋ง ์ฌ์ ์ถ ์๊ฐ |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| INDEX | EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX |
COMPLETION_DATE |
2์ฐจ์ ์ ์ค(PH-20, #451). ์ด์ ์ง๊ธ(P2)๊ณผ ํํ ์ด์ฒด(P4)๊ฐ ๋ค์ด์ค๋ฉด์ ์์๊ธ ์์ ์ด๋๋ง ์๋ ์ ์ ๊ฐ ๊นจ์ ธ ํ๊ณ ์์ฅ์ด ํ์ํด์ก๋ค.
Apache Fineract ์ acc_gl_accountยทacc_gl_journal_entry ๋ฅผ ๋์กฐ ๊ธฐ์ค์ผ๋ก ์ผ๋ ๋ ๊ฐ์ง๋ ๋ค๋ฅด๋ค. ๊ธ์ก์ BIGINT ์ ๋จ์ ์ ์๋ก ๋๋ค(Fineract ๋ DECIMAL(19,6), ์ ๋๊ท์น 5). ์ ํ๋ฅผ ๋ณ๋ ํ
์ด๋ธ๋ก ๋บ๋ค(Fineract ๋ transaction_id ๋ฅผ ๊ณต์ ํ๋ ๋ถ๊ฐ ๋ฌถ์์ด ์ ํ ์ญํ ) โ ์ ํ ๋จ์๋ก ์ฐจ๋๋ณ์ ๊ฒ์ฆํ๊ณ ์ฑ๋ฒ ๊ท์น์ ๋ ์๋ฆฌ๊ฐ ํ์ํ๋ค. ์ฐจ๋๋ณ ๊ฒ์ฆ ์์ฒด๋ Fineract ์ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์
์์๋ง ํ๋ค(gl_journal_patterns.md ยง2).
๊ณ์ ๊ณผ๋ชฉ
์ฝ๋ ์ฒด๊ณ๋ ๋๋ถ๋ฅ1 + ์ค๋ถ๋ฅ2 + ์ธ๋ถ๋ฅ2 = 5์๋ฆฌ์ด๊ณ ์ฒซ ์๋ฆฌ๊ฐ ๋ถ๋ฅ์ 1:1 ๋ก ๋์ํ๋ค(1 ์์ฐ / 2 ๋ถ์ฑ / 3 ์๋ณธ / 4 ์์ต / 5 ๋น์ฉ). ์๋ 15๊ฐ๋ R__seed_gl_account.sql ์ด ๋ฃ๋๋ค โ ๋ง์คํฐ์ฑ ๋ฐ์ดํฐ๋ผ V__ ๊ฐ ์๋๋ผ R__ ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
account_code |
CHAR(5) |
PK | X | ๊ณ์ ๊ณผ๋ชฉ ์ฝ๋. ๋1+์ค2+์ธ2. ์ฒซ ์๋ฆฌ๊ฐ ๋ถ๋ฅ | |
account_name |
VARCHAR(50) |
X | ๊ณ์ ๊ณผ๋ชฉ๋ช . ์์ฐํ ํ๋ฉด์ ๊ทธ๋๋ก ํ์๋๋ค | ||
account_class |
VARCHAR(12) |
X | ASSET / LIABILITY / EQUITY / REVENUE / EXPENSE |
||
normal_balance |
VARCHAR(6) |
X | ์ ์์์ก ๋ฐฉํฅ. DEBIT / CREDIT. ์์ฐยท๋น์ฉ์ ์ฐจ๋ณ, ๋ถ์ฑยท์๋ณธยท์์ต์ ๋๋ณ |
||
created_at |
DATETIME(6) |
X | CURRENT_TIMESTAMP(6) |
||
updated_at |
DATETIME(6) |
X | CURRENT_TIMESTAMP(6) |
์ ์ฝ
| ์ด๋ฆ | ๋ด์ฉ | ์ด์ |
|---|---|---|
ck_gl_account_code |
account_code REGEXP '^[1-5][0-9]{4}$' |
์ฝ๋ ์ฒด๊ณ๊ฐ ๋ฌธ์์๋ง ์์ผ๋ฉด ๊นจ์ง๋ค. ck_account_number ์ ๊ฐ์ ๋ฐฉ์ |
ck_gl_account_class_code |
์ฝ๋ ์ฒซ ์๋ฆฌ ยท account_class ยท normal_balance ๋ค์ฏ ์กฐํฉ ์ค ํ๋ |
์ด๋ง๋ค ๋ฐ๋ก ์ ํํ๋ฉด 10100+LIABILITY ๋ ASSET+CREDIT ์ด ํต๊ณผํ๋ค. ์ด CHECK ๊ฐ ๋ ์ด์ ํ์ฉ๊ฐ ๊ฒ์ฌ๊น์ง ํฌํจํ๋ค. contra ๊ณ์ (์์ฐ์ธ๋ฐ ์ ์์์ก ๋๋ณ)์ 2์ฐจ์ ์๊ณ , ํ์ํด์ง๋ฉด ์ V ํ์ผ์์ ๋ํ๋ค |
์ ํ โ ๋ถ๊ฐ๋ฅผ ๋ด๋ ๋จ์
๊ฑฐ๋ 1๊ฑด์ด ์ฅ๋ถ์ ๋จ๊ธด ๊ธฐํ ๋จ์๋ค. ๋ถ๊ฐ ์ฌ๋ฌ ์ค์ ๋ด๊ณ ์ ํ ํ๋ ์์์ ์ฐจ๋ณ ํฉ๊ณ์ ๋๋ณ ํฉ๊ณ๊ฐ ๊ฐ์์ผ ํ๋ค. ์ด ๊ฒ์ฆ์ ๋๋ฉ์ธ(gl.domain.Voucher)์์๋ง ํ๊ณ DB ์ ์ฝ์ ๊ฑธ์ง ์๋๋ค โ ๊ทผ๊ฑฐ๋ gl_journal_patterns.md ยง2. ์ ํ๋ฒํธ yyyyMMdd-TTT-NNNNNN ์ gl_voucher_sequence ๊ฐ ์ฑ๋ฒํ๋ค.
updated_at ์ด ์๋ค. ์ ํ๋ ์์ ํ์ง ์๋๋ค โ ํ๋ฆฌ๋ฉด ์ง์ฐ๊ฑฐ๋ ๊ณ ์น์ง ์๊ณ ์ ์ ์ ํ๋ฅผ ์๋ก ์ธ์ด๋ค(์ฉ์ดํ "์ ์ ์ฒด์ธ"). ์์ ์๊ฐ ์นธ์ด ์์ผ๋ฉด ๊ณ ์ณ๋ ๋๋ ๊ฒ์ฒ๋ผ ์ฝํ๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
voucher_no |
VARCHAR(20) |
PK | X | ์ ํ๋ฒํธ. ์์ ์ผ + ์ ํ + ์ผ๋ จ | |
trade_date |
DATE |
X | ์ด ์ ํ๊ฐ ๊ท์๋๋ ์์ ์ผ | ||
tx_type |
VARCHAR(24) |
X | OPENING / TRANSFER / PRODUCT_SUBSCRIPTION / INTEREST / REVERSAL / INTERBANK_TRANSFER(ํํ ์ก์ ์์ฒญ) / INTERBANK_SETTLEMENT(ํํ ํ์ ํด์) / MATURITY(๋ง๊ธฐํด์ง ์๋ฆฌ๊ธ ์ด์ฒด) / TERMINATION(์ค๋ํด์ง ์๋ฆฌ๊ธ ์ด์ฒด) |
||
reference_key |
VARCHAR(40) |
X | ์ ๊ฑฐ๋๋ฒํธ. ์์ฅ transaction_number ์ ๊ฐ์ ๊ฐ์ด๊ณ ๊ฐ์ ์ ํ๋ OPENING-{yyyyMMdd}. ์์ฅ๊ณผ ์ ํ๋ฅผ 1:1 ๋ก ์๋๋ค(PH-24). ํํ์ด์ฒด๋ง ํ ๊ฑฐ๋๋ฒํธ์ INTERBANK_TRANSFERยทINTERBANK_SETTLEMENT ๋ ์ ํ๊ฐ ๋ถ๋๋ค(gl_journal_patterns.md ยง3-5) |
||
description |
VARCHAR(200) |
O | ์ ์ | ||
created_at |
DATETIME(6) |
X | CURRENT_TIMESTAMP(6) |
์ ์ฝ
| ์ด๋ฆ | ๋ด์ฉ | ์ด์ |
|---|---|---|
ck_gl_voucher_tx_type |
9๊ฐ ์ ํ ์ค ํ๋ | REVERSAL ์ ์ ์ ์ฒด์ธ ์ทจ์์ ์ (PH-24). INTERBANK_TRANSFERยทINTERBANK_SETTLEMENT ๋ ํํ ๋ฏธ๊ฒฐ์ 2ํจํด(๋ถ๊ฐ ํจํดํ ยง3-5, PH-33-โก). ๋ ์ ํ๋ ๊ฐ์ ์ ๊ฑฐ๋๋ฒํธ๋ฅผ ์ฐธ์กฐ ํค๋ก ์ด๋ค. MATURITYยทTERMINATION ์ ์์ ๊ธ ์๋ฆฌ๊ธ ์ด์ฒด(๋ถ๊ฐ ํจํดํ ยง3-7, #713) |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_gl_voucher_no_trade_date |
voucher_no, trade_date |
| UNIQUE | uk_gl_voucher_tx_type_reference_key |
tx_type, reference_key |
voucher_no ๊ฐ ์ด๋ฏธ PK ๋ผ uk_gl_voucher_no_trade_date ๋ ํ์ ๋ ์ ํํ์ง ์๋๋ค. ๋ถ๊ฐ๊ฐ ๋ณต์ ํด ๊ฐ๋ trade_date ๋ฅผ ๋ณตํฉ FK ๋ก ๋ฌถ๊ธฐ ์ํ ์ฐธ์กฐ ๋์์ด๋ค.
uk_gl_voucher_tx_type_reference_key ๋ ๊ฐ์ ๊ฑฐ๋๋ฅผ ๋ ๋ฒ ๊ธฐํํ๋ ๊ฒ์ ๋ง๋๋ค. ๋ ๋ฒ์งธ ๊ธฐํ๋ ์์ธ๊ฐ ๋์ด ์์ฅ๊น์ง ๋กค๋ฐฑ๋๋ค โ ์กฐ์ฉํ ๋๊ธฐ๋ฉด ์์ฅ๋ง ๋ ๋ฒ ๊ธฐํ๋ ์ํ๊ฐ ๊ฐ๋ ค์ง๋ค.
๋ถ๊ฐ โ ์ ํ ์์ ํ ์ค
๊ณ์ ๊ณผ๋ชฉ ํ๋์ ์ฐจ๋ณ ๋๋ ๋๋ณ ํ์ชฝ์ ๊ธ์ก์ ๊ฐ์ง๋ค. Fineract acc_gl_journal_entry.type_enum + amount ์ ๊ฐ์ ํํ๋ค.
trade_date ๋ฅผ ์ ํ์์ ํ ๋ฒ ๋ ๋ค๊ณ ๊ฐ๋ค. 600๋ง ์ค์ ๊ธฐ๊ฐ์ผ๋ก ๊ฑฐ๋ฅผ ๋ ์ ํ ์กฐ์ธ์ ์์ ๊ธฐ ์ํด์๋ค โ Fineract ๋ entry_date ๋ฅผ ๊ฐ์ ์๋ฆฌ์ ๋๋ค. ๋ถ๊ฐ๋ ์ ํ์ ํจ๊ป ํ ๋ฒ๋ง ์ฐ์ด๊ณ ์์ ๋์ง ์์ผ๋ฏ๋ก ๋ ๊ฐ์ด ์ด๊ธ๋ ๊ฒฝ๋ก๊ฐ ์๋ค.
์์ฐํ ์ง๊ณ์ฉ ์ธ๋ฑ์ค๋ ๊ฑฐ๋์ผ์ด ๋จผ์ ๋ค(GL-IDX). ix_gl_journal_entry_trade_date (trade_date, account_code, dr_cr, amount) ๋ ์กฐํ ๊ธฐ๊ฐ๋ง ๋ฒ์๋ก ์ฝ๊ณ , ์ง๊ณ SQL ์ด ์ฐ๋ ์ปฌ๋ผ์ ๋ชจ๋ ๋ด์ ๋ณธ ํ
์ด๋ธ์ ์ฝ์ง ์๋๋ค. ์ธ๋ฑ์ค๊ฐ ์์ ๋๋ ๊ธฐ๊ฐ๊ณผ ๋ฌด๊ดํ๊ฒ ๋ถ๊ฐ ์ ์ฒด๋ฅผ fk_gl_journal_entry_account ์์๋ก ์ฝ์๋ค(์ด์ 647๋ง ํ ์ ๊ตฌ๊ฐ ํ๊ท 26.8์ด, ph28_baseline_results.md). account_code ๋ก ์์ํ๋ ์ธ๋ฑ์ค๋ ๋ฃ์ง ์๋๋ค. (account_code, trade_date) ๋ ๊ธฐ๊ฐ์ผ๋ก ์ขํ์ง ๋ชปํด ์คํ๋ ค ๋๋ ธ๊ณ , fk_gl_journal_entry_account ๋ FK ๊ฐ ์๋์ผ๋ก ๋ง๋ ์ธ๋ฑ์ค๋ผ ๊ฐ์ FK ๋ฅผ ๋ฐ์น ์ ์๋ ์ธ๋ฑ์ค๊ฐ ์๊ธฐ๋ฉด MySQL ์ด ์กฐ์ฉํ ์ง์ด๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
journal_entry_id |
BIGINT |
PK | X | AUTO_INCREMENT | |
voucher_no |
VARCHAR(20) |
FK โ gl_voucher |
X | ์ด ์ค์ด ์ํ ์ ํ | |
line_no |
SMALLINT |
X | ์ ํ ์์ ์ค ๋ฒํธ. 1๋ถํฐ | ||
account_code |
CHAR(5) |
FK โ gl_account |
X | ๊ณ์ ๊ณผ๋ชฉ | |
dr_cr |
VARCHAR(6) |
X | DEBIT / CREDIT. ๊ธ์ก์ ๋ฐฉํฅ์ ์ด ์นธ์ด ๋งํ๋ค |
||
amount |
BIGINT |
X | ์ ๋จ์ ์ ์. ํ ์ค์ ํ์ชฝ ๊ธ์ก๋ง ๊ฐ์ง๋ฏ๋ก ํญ์ ์์ | ||
trade_date |
DATE |
X | ์ ํ trade_date ๋ณต์ ๋ณธ. ์์ฐํ ์ง๊ณ ๊ธฐ์ค์ผ |
||
created_at |
DATETIME(6) |
X | CURRENT_TIMESTAMP(6) |
์ธ๋ฑ์ค
| ์ข ๋ฅ | ์ด๋ฆ | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_gl_journal_entry_line |
voucher_no, line_no |
| FK | fk_gl_journal_entry_voucher |
voucher_no, trade_date โ gl_voucher |
| FK | fk_gl_journal_entry_account |
account_code โ gl_account |
| INDEX | ix_gl_journal_entry_trade_date |
trade_date, account_code, dr_cr, amount |
์ ์ฝ
| ์ด๋ฆ | ๋ด์ฉ | ์ด์ |
|---|---|---|
ck_gl_journal_entry_dr_cr |
DEBIT ๋๋ CREDIT |
|
ck_gl_journal_entry_amount |
amount > 0 |
0์ ๋ถ๊ฐ์ ์์ ๊ธ์ก์ ๋ง๋๋ค. ๋ฐฉํฅ์ dr_cr ์ด ๋งํ๋ค |
ck_gl_journal_entry_line_no |
line_no > 0 |
์ค ๋ฒํธ๋ 1๋ถํฐ๋ค. NOT NULLยทUNIQUE ๋ง์ผ๋ก๋ 0 ๊ณผ ์์๊ฐ ํต๊ณผํ๋ค |
์ ํ FK ๊ฐ ๋ณตํฉ์ธ ์ด์ . voucher_no ๋ง ์ฐธ์กฐํ๋ฉด ์ ํ์ ๋ค๋ฅธ trade_date ๋ฅผ ๊ฐ์ง ๋ถ๊ฐ๊ฐ ์ ์ฅ๋๊ณ , ๊ทธ๋๋ก ๋ ์ง๋ณ ์์ฐํ ์ง๊ณ๊ฐ ํ์ด์ง๋ค. ๋ณต์ ๋ณธ์ด ์๋ณธ๊ณผ ๊ฐ๋๋ก DB ๊ฐ ๊ฐ์ ํ๋ค โ ํนํ P6 ์๋ ์์ฑ๊ธฐ(PH-60b)๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฑฐ์น์ง ์๊ณ 600๋ง ๊ฑด์ ์ง์ INSERT ํ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
๊ท์ฝ์ผ๋ก๋ ๋ง์ ์ ์๋ค.
์ ํ๋ฒํธ ์ผ๋ จ๋ฒํธ ์ฑ๋ฒ (PH-21)
์ ํ๋ฒํธ ๋ 6์๋ฆฌ๋ฅผ (๊ฑฐ๋์ผ, ์ ํ)๋ง๋ค 1๋ถํฐ ์ฑ๋ฒํ๋ค. ๊ตฌ์กฐ๋ transaction_sequence ์ ๊ฐ๋ค. ์นด์ดํฐ๋ ๊ธฐํ ํธ๋์ญ์
๊ณผ ๋ณ๋๋ก ์ปค๋ฐํ๋ค โ ๊ฐ์ ํธ๋์ญ์
์ด๋ฉด ์ด์ฒด๊ฐ ์ปค๋ฐ๋ ๋๊น์ง ํ ๋ฝ์ ์ก์ ๊ฐ์ ๋ ๊ฐ์ ์ ํ์ ๊ธฐํ๊ฐ ์ง๋ ฌํ๋๋ค. ๋๊ฐ๋ก ๊ธฐํ๊ฐ ๋กค๋ฐฑ๋๋ฉด ๊ฒฐ๋ฒ์ด ์๊ธด๋ค.
๊ทธ๋ ํ์ด ์์ผ๋ฉด gl_voucher ์ ์ด๋ฏธ ์๋ ๊ฐ์ฅ ํฐ ๋ฒํธ ๋ค์๋ถํฐ ์์ํ๋ค. ์๋(PH-60b)๋ ์ด ์นด์ดํฐ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์ ํ๋ฅผ ์ง์ ๋ฃ๊ธฐ ๋๋ฌธ์ด๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
trade_date |
DATE |
PK | X | ์ ํ์ ๊ฑฐ๋์ผ. ์ ํ๋ฒํธ ์ 8์๋ฆฌ์ ๊ฐ๋ค | |
tx_type |
VARCHAR(24) |
PK | X | gl_voucher.tx_type ๊ณผ ๊ฐ์ ๊ฐ |
|
last_seq |
INT |
X | ํด๋น ๊ฑฐ๋์ผยท์ ํ์์ ๋ง์ง๋ง์ผ๋ก ๋๊ฐ ์ผ๋ จ๋ฒํธ | ||
updated_at |
DATETIME(6) |
X | ๋ง์ง๋ง ์ฑ๋ฒ ์๊ฐ |
CHECK ์ ์ฝ
| ์ด๋ฆ | ์กฐ๊ฑด |
|---|---|
ck_gl_voucher_sequence_range |
last_seq BETWEEN 1 AND 999999 |
2์ฐจ์ ์ ์ค(PH-40, #471). ์์
์ผ์ ์์คํ
์๊ฐ๊ณผ ๋ถ๋ฆฌ๋ ๋
ผ๋ฆฌ ์
๋ฌด์ผ์์ด๊ณ business.api.BusinessDateProvider ๊ฐ ์ ์ผํ ์ถ์ฒ๋ค(glossary 6๋ฒ).
Apache Fineract ์ m_business_date ์ฒ๋ผ ์๊ณ๊ฐ ์๋๋ผ DB ์ ์ ์ฅ๋ ๊ฐ์ ์์
์ผ๋ก ์ด๋ค. ํ
์ด๋ธ์ ๋๋ก ๋๋๋ค โ ๋งค์ผ ๋ฐ๋๋ ๊ฐ 1๊ฐ(business_date)์ ํ ๋ฒ ๋ฃ๊ณ ๊ฑฐ์ ์ ๋ฐ๋๋ ๋ชฉ๋ก(holiday)์ ์ฑ๊ฒฉ์ด ๋ค๋ฅด๋ค. Fineract ์ ๋ฌ๋ฆฌ ์์
์ผ์ ๋๊ธธ ๋ ํด์ผ์ ๊ฑด๋๋ด๋ค(Fineract ๋ plusDays(1) ์ด๊ณ ํด์ผ์ ๋ณ๋ ๊ฐ๋
).
ํ์ฌ ์์ ์ผ
date_type ๋ณ๋ก ํ ํ์ด๋ค. 2์ฐจ์๋ BUSINESS_DATE ํ ํ๋ฟ์ด๊ณ , ๋ง๊ฐ ๋์์ผ(COB_DATE) ๊ฐ์ ์ข
๋ฅ๊ฐ ํ์ํด์ง๋ฉด ํ
์ด๋ธ์ ๋ฐ๊พธ์ง ์๊ณ ํ์ ๋ํ๋ค(Fineract BusinessDateType ๊ณผ ๊ฐ์ ๊ตฌ์กฐ).
์ด๊ธฐ๊ฐ 2026-01-01 ์ ์๋ฏธ ์๋ ๊ณผ๊ฑฐ ๋ ์ง๋ค โ ์๋ฒ๊ฐ ๋ฐ ๋ ์ค๋ ๋ฌ๋ ฅ์ ๋ง์ถ๋ค(์ค๋์ด ์์
์ผ์ด๋ฉด ์ค๋, ์๋๋ฉด ๋ค์ ์์
์ผ. ์ ์ฅ๊ฐ์ด ๊ทธ๋ณด๋ค ์ด์ ์ผ ๋๋ง ๋ฐ๊พผ๋ค). V ํ์ผ์ด ์คํ๋๋ ๋ ์ ํ๊ฒฝ๋ง๋ค(ํ์ ๋ก์ปฌยทCIยท๋ฐฐํฌ) ๋ฌ๋ผ์ ํน์ ๋ ์ง๋ฅผ ๋ฐ์ผ๋ฉด ๋ฏธ๋๋ ๊ณผ๊ฑฐ๋ก ์ด๊ธ๋๋ค. NOW()ยทCURRENT_DATE ๋ RDS ๊ฐ UTC ๋ผ ์ฐ์ง ์๋๋ค. ์ดํ ์์
์ผ์ ๋งค์ผ ์์ (KST) ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ง์ถ๊ณ , PH-43 ์ดํ์๋ COB ๋ง์ง๋ง ์คํ
์ด ๋ค์ ์์
์ผ๋ก ๋๊ธด๋ค. ๊ธฐ๋ ์ ๋ง์ถ๊ธฐ๋ PH-43 ์ดํ์๋ ๋จ๋๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
date_type |
VARCHAR(20) |
PK | X | ์์
์ผ ์ข
๋ฅ. 2์ฐจ๋ BUSINESS_DATE 1ํ |
|
business_date |
DATE |
X | ํ์ฌ ์์ ์ผ | ||
created_at |
DATETIME(6) |
X | CURRENT_TIMESTAMP(6) |
||
updated_at |
DATETIME(6) |
X | CURRENT_TIMESTAMP(6) |
๋ง์ง๋ง ์์ ์ผ ์ ํ ์๊ฐ |
์์ ์ผ ๋ง๊ฐ cutoff (#556)
COB์ ์์
์ผ ์ ํ(advanceFrom)๊ณผ ๋ฌ๋ ฅ ๋ฐ๋ผ์ก๊ธฐ(catchUpTo)๊ฐ BUSINESS_DATE๋ฅผ ๋ค์ ์์
์ผ๋ก ๋๊ธธ ๋ ๋ ๋๋ ์์
์ผ D์ ํ์ ๊ฐ์ ํธ๋์ญ์
์ผ๋ก ๋จ๊ธด๋ค. ์ ํ UPDATE๊ฐ BUSINESS_DATE ํ์ ๋ฐฐํ ๋ฝ์ ์ก์ผ๋ฏ๋ก, D๋ฅผ ์ฝ์ ๊ฑฐ๋๊ฐ ๋ชจ๋ commit/rollback๋ ๋ค์๋ง ์ด ํ์ด ์ปค๋ฐ๋๋ค. ๋ ํ๋ฆฌ์นด์์ status = 'CLOSED'์ธ D๊ฐ ๋ณด์ด๋ฉด D ๊ฑฐ๋์ผ ์์ฅ์ด ๋๋ ์ถ๊ฐ๋์ง ์๋๋ค(info_mart.md ยง3-0). batch_execution_history๋ ์ด ์ ํธ๋ก ์ฐ์ง ์๋๋ค. ๊ธฐ์ค์ผ๋ง๋ค CLOSED ํ์ ํ๋์ด๊ณ , ์ฌ์คํ์ ๋ฉฑ๋ฑ INSERT๋ก ์ฒ๋ฆฌํ๋ค. ๋ค๋ฅธ ํ
์ด๋ธ๊ณผ FK๋ ์๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
business_date_cutoff_id |
BIGINT |
PK | X | ๋ด๋ถ ์๋ณ์ (AUTO_INCREMENT) | |
base_date |
DATE |
UK | X | ๋ง๊ฐ๋ ์์ ์ผ | |
status |
VARCHAR(10) |
UK | X | CLOSED |
|
closed_at |
DATETIME(6) |
X | ๋ง๊ฐ ์๊ฐ(KST, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ์) |
| ๊ตฌ๋ถ | ์ธ๋ฑ์ค | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_business_date_cutoff_date_status |
base_date, status |
COB ์ฌ์์ ์ฒดํฌํฌ์ธํธ (#663)
CobRunnerService๊ฐ ์ COB๋ฅผ ์์ํ ๋, ์์
์ผ์ ๋๊ธฐ๊ธฐ ์ ์ ๋ง๊ฐ ๋์ ์์
์ผ(COB_DATE)์ ์์
์ผ ์ ํ ํ๊ณผ ๋ฑ๋ก๋ ์คํ
ํ์ ๋ชจ๋ PENDING์ผ๋ก ๋จ๊ธฐ๊ณ , ์ ํ๊ณผ ์คํ
์ด ๋๋ ๋๋ง๋ค SUCCESS๋ก ๋ฐ๊พผ๋ค. PENDING์ด ๋จ์ cob_date๊ฐ ์์ผ๋ฉด ๋ค์ run()์ด ์ค๋๋ ๋ ์ง๋ถํฐ ๊ทธ ๋ ์ง์ PENDING ์คํ
๋ง ์ด์ด์ ์คํํ๋ค. ํ์ด ์๋ ์คํ
(์ด๊ธฐํ ์คํจ ๋ฑ)์ ์ฌ๊ฐ ๋์์ด ์๋๋ค. batch_execution_history๋ ๊ด์ธก์ฉ์ด๋ผ ์ฌ์์ ๊ทผ๊ฑฐ๋ก ์ฐ์ง ์๊ณ , business_date_cutoff๋ ๋ฌ๋ ฅ ๋ฐ๋ผ์ก๊ธฐ๋ ๊ธฐ๋กํ๋ฏ๋ก COB_DATE์ ๊ทผ๊ฑฐ๊ฐ ์๋๋ค. ๋ค๋ฅธ ํ
์ด๋ธ๊ณผ FK๋ ์๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
cob_checkpoint_id |
BIGINT |
PK | X | ๋ด๋ถ ์๋ณ์ (AUTO_INCREMENT) | |
cob_date |
DATE |
UK | X | ๋ง๊ฐ ๋์ ์์
์ผ(ADR-0004 COB_DATE) |
|
step_name |
VARCHAR(100) |
UK | X | CobStep.name(). ์์
์ผ ์ ํ์ business-date-advance |
|
status |
VARCHAR(10) |
X | PENDING / SUCCESS |
||
updated_at |
DATETIME(6) |
X | ๋ง์ง๋ง ์ํ ๋ณ๊ฒฝ ์๊ฐ(KST, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ์) |
| ๊ตฌ๋ถ | ์ธ๋ฑ์ค | ์ปฌ๋ผ |
|---|---|---|
| UNIQUE | uk_cob_checkpoint_date_step |
cob_date, step_name |
ํด์ผ ๋ฌ๋ ฅ โ ์ฃผ๋ง์ ์ ์ธํ ๊ณตํด์ผ
์ฃผ๋ง์ ๋ฃ์ง ์๋๋ค โ ํ ยท์ผ์ ์์ผ๋ก ํ์ ํ๋ค. ์์
์ผ = ์ฃผ๋ง๋ ์๋๊ณ ์ด ํ
์ด๋ธ์๋ ์๋ ๋ . ์๋๋ R__seed_holiday.sql ์ด ๋ฃ๋๋ค โ ์ด์์๋ ์์ด์ผ ํ๊ณ ๋์ฒด๊ณตํด์ผยท์์๊ณตํด์ผ์ด ์ถ๊ฐ๋ ์ ์๋ ๋ง์คํฐ์ฑ ๋ฐ์ดํฐ๋ผ V__ ๊ฐ ์๋๋ผ R__ ๋ค. ๋ฑ๋ก API ๋ 2์ฐจ ๋ฒ์ ๋ฐ์ด๋ค.
| ์ปฌ๋ผ | ํ์ | ํค | Null | ๊ธฐ๋ณธ๊ฐ | ๋ด๊ธฐ๋ ์ ๋ณด |
|---|---|---|---|---|---|
holiday_date |
DATE |
PK | X | ํด์ผ ๋ ์ง | |
holiday_name |
VARCHAR(50) |
X | ์: ๊ฐ์ฒ์ , ๋์ฒด๊ณตํด์ผ(์ถ์) |
||
created_at |
DATETIME(6) |
X | CURRENT_TIMESTAMP(6) |
||
updated_at |
DATETIME(6) |
X | CURRENT_TIMESTAMP(6) |