From a24f93a39d40495a896ca3442660086e30fcf897 Mon Sep 17 00:00:00 2001 From: GA Pro Date: Mon, 11 May 2026 00:38:57 +0900 Subject: [PATCH] =?UTF-8?q?feat(domain):=20V22=20=EB=B9=84=EC=A6=88?= =?UTF-8?q?=EB=8B=88=EC=8A=A4=20=EB=8F=84=EB=A9=94=EC=9D=B8=206=20?= =?UTF-8?q?=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=2029=EA=B0=9C=20+=20?= =?UTF-8?q?=EC=82=AC=EC=A0=84=20=EB=A7=A4=ED=95=91=2030+?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 신규 카테고리: AUDIT (5) — 모든 테이블 공통 감사 컬럼 - DOM_CREATED_BY / DOM_UPDATED_BY (사용자 ID) - DOM_IP_ADDRESS (IPv4/IPv6 통합) - DOM_USER_AGENT (HTTP 헤더) - DOM_VERSION (낙관적 잠금) WORKFLOW (5) — 결재 / 승인 흐름 - DOM_APPROVE_STATUS (PENDING/APPROVED/REJECTED/CANCELLED) - DOM_APPROVER_ID / DOM_APPROVE_COMMENT - DOM_WORKFLOW_STAGE (DRAFT/REVIEW/APPROVED/PUBLISHED/ARCHIVED) - DOM_PRIORITY (HIGH/MEDIUM/LOW) SETTLEMENT_BIZ (6) — GA 정산 핵심 비즈 - DOM_RECONCILE_STATUS (대사 상태) - DOM_RECONCILE_DIFF (보험사-시스템 차액) - DOM_LAPSE_MONTH (실효 경과월 — 환수 규정 매칭) - DOM_INSTALLMENT_SEQ / DOM_INSTALLMENT_TOTAL (분할 환수 회차) - DOM_PERFORMANCE_GRADE (A/B/C/D/F) FILE (4) — 파일 첨부 - DOM_FILE_ID (file_storage FK) - DOM_FILE_PATH / DOM_FILE_SIZE / DOM_MIME_TYPE TAX (4) — 세무 - DOM_TAX_INVOICE_NO (세금계산서) - DOM_VAT (부가세 10%) - DOM_INCOME_TAX (소득세 3%) / DOM_LOCAL_TAX (지방세) BANKING (5) — 은행 / 결제 - DOM_TRANSFER_REF (이체 참조번호) - DOM_TRANSFER_FEE / DOM_CURRENCY (ISO 4217) - DOM_FX_RATE (환율 6자리) / DOM_SWIFT_CODE (BIC) 데이터 사전 매핑 30+ 추가: - exception_ledger (8) / chargeback (7) / reconciliation (7) / batch_job_log (6) - file_storage (6) / api_access_log (6) / data_change_log (6) - recruit_ledger·maintain_ledger·settle_master 의 audit 컬럼 검증: - Flyway V22 적용 35ms - 전체 도메인 49 → 78 (16 카테고리) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../migration/V22__비즈니스_도메인_확장.sql | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 ga-common/src/main/resources/db/migration/V22__비즈니스_도메인_확장.sql diff --git a/ga-common/src/main/resources/db/migration/V22__비즈니스_도메인_확장.sql b/ga-common/src/main/resources/db/migration/V22__비즈니스_도메인_확장.sql new file mode 100644 index 0000000..236b2e8 --- /dev/null +++ b/ga-common/src/main/resources/db/migration/V22__비즈니스_도메인_확장.sql @@ -0,0 +1,196 @@ +-- V22: GA 정산 솔루션의 비즈니스 도메인 확장 (6 카테고리 29개 + 사전 매핑 보강) + +INSERT INTO ga.data_domain +(domain_code, domain_name, domain_category, data_type, length, precision, scale, + format_pattern, validation_regex, example_value, masking_type, encrypted, description, is_active) +VALUES + +-- ============================================================ +-- AUDIT (감사) — 모든 테이블의 공통 감사 컬럼 표준화 +-- ============================================================ +('DOM_CREATED_BY', '등록자 ID', 'AUDIT', 'BIGINT', NULL, NULL, NULL, + NULL, NULL, '1001', 'NONE', 'N', + 'users.user_id 참조 (생성한 사용자)', 'Y'), +('DOM_UPDATED_BY', '수정자 ID', 'AUDIT', 'BIGINT', NULL, NULL, NULL, + NULL, NULL, '1001', 'NONE', 'N', + 'users.user_id 참조 (마지막 수정자)', 'Y'), +('DOM_IP_ADDRESS', 'IP 주소', 'AUDIT', 'VARCHAR', 45, NULL, NULL, + NULL, '^([0-9]{1,3}\.){3}[0-9]{1,3}$|^([0-9a-fA-F:]+)$', '192.168.0.60', 'NONE', 'N', + 'IPv4(15) 또는 IPv6(45)', 'Y'), +('DOM_USER_AGENT', '클라이언트 정보', 'AUDIT', 'VARCHAR', 500, NULL, NULL, + NULL, NULL, 'Mozilla/5.0 ...', 'NONE', 'N', + 'HTTP User-Agent 헤더', 'Y'), +('DOM_VERSION', '낙관적 잠금 버전','AUDIT', 'INTEGER', NULL, NULL, NULL, + NULL, NULL, '3', 'NONE', 'N', + '동시 수정 충돌 감지용 (UPDATE 시 +1)', 'Y'), + +-- ============================================================ +-- WORKFLOW (결재 / 승인) +-- ============================================================ +('DOM_APPROVE_STATUS', '승인 상태', 'WORKFLOW', 'VARCHAR', 20, NULL, NULL, + NULL, NULL, 'PENDING', 'NONE', 'N', + 'PENDING / APPROVED / REJECTED / CANCELLED', 'Y'), +('DOM_APPROVER_ID', '승인자 ID', 'WORKFLOW', 'BIGINT', NULL, NULL, NULL, + NULL, NULL, '1001', 'NONE', 'N', + 'users.user_id 참조', 'Y'), +('DOM_APPROVE_COMMENT', '승인/반려 사유','WORKFLOW', 'TEXT', NULL, NULL, NULL, + NULL, NULL, '예외 사유 검토 후 승인', 'NONE', 'N', + '결재 메모 (반려 시 필수)', 'Y'), +('DOM_WORKFLOW_STAGE', '워크플로 단계', 'WORKFLOW', 'VARCHAR', 30, NULL, NULL, + NULL, NULL, 'REVIEW', 'NONE', 'N', + 'DRAFT / REVIEW / APPROVED / PUBLISHED / ARCHIVED', 'Y'), +('DOM_PRIORITY', '우선순위', 'WORKFLOW', 'VARCHAR', 10, NULL, NULL, + NULL, '^(HIGH|MEDIUM|LOW)$', 'HIGH', 'NONE', 'N', + 'HIGH / MEDIUM / LOW', 'Y'), + +-- ============================================================ +-- SETTLEMENT_BIZ (정산 비즈니스 — GA 솔루션 핵심) +-- ============================================================ +('DOM_RECONCILE_STATUS', '대사 상태', 'SETTLEMENT_BIZ', 'VARCHAR', 20, NULL, NULL, + NULL, NULL, 'MATCH', 'NONE', 'N', + 'PENDING / MATCH / MISMATCH / DIFF', 'Y'), +('DOM_RECONCILE_DIFF', '대사 차액', 'SETTLEMENT_BIZ', 'DECIMAL', NULL, 15, 2, + '#,##0', NULL, '12500.00', 'NONE', 'N', + '보험사 통보액 - 시스템 계산액 (음수 가능)', 'Y'), +('DOM_LAPSE_MONTH', '실효 경과월', 'SETTLEMENT_BIZ', 'INTEGER', NULL, NULL, NULL, + NULL, '^[0-9]{1,3}$', '13', 'NONE', 'N', + '계약 효력일~실효일 사이 개월 수 (환수 규정 매칭)', 'Y'), +('DOM_INSTALLMENT_SEQ', '분할 회차', 'SETTLEMENT_BIZ', 'INTEGER', NULL, NULL, NULL, + NULL, NULL, '2', 'NONE', 'N', + '환수 분할 시 N차 (1~installment_total)', 'Y'), +('DOM_INSTALLMENT_TOTAL','분할 총 회차', 'SETTLEMENT_BIZ', 'INTEGER', NULL, NULL, NULL, + NULL, NULL, '6', 'NONE', 'N', + '환수 분할 총 회차 (보통 1/3/6/12)', 'Y'), +('DOM_PERFORMANCE_GRADE','실적 등급', 'SETTLEMENT_BIZ', 'VARCHAR', 10, NULL, NULL, + NULL, '^[A-F]$|^GOLD$|^SILVER$|^BRONZE$', 'A', 'NONE', 'N', + 'A/B/C/D/F 또는 GOLD/SILVER/BRONZE — 지급율 차등', 'Y'), + +-- ============================================================ +-- FILE (파일 / 첨부) +-- ============================================================ +('DOM_FILE_ID', '파일 ID', 'FILE', 'BIGINT', NULL, NULL, NULL, + NULL, NULL, '12345', 'NONE', 'N', + 'file_storage.file_id 참조', 'Y'), +('DOM_FILE_PATH', '파일 경로', 'FILE', 'VARCHAR', 500, NULL, NULL, + NULL, NULL, '/upload/2026/05/abc.pdf', 'NONE', 'N', + '서버 저장 경로 (또는 S3 키)', 'Y'), +('DOM_FILE_SIZE', '파일 크기', 'FILE', 'BIGINT', NULL, NULL, NULL, + NULL, NULL, '1048576', 'NONE', 'N', + '바이트 단위 (1MB = 1048576)', 'Y'), +('DOM_MIME_TYPE', 'MIME 타입', 'FILE', 'VARCHAR', 100, NULL, NULL, + NULL, NULL, 'application/pdf', 'NONE', 'N', + 'application/pdf, image/png 등', 'Y'), + +-- ============================================================ +-- TAX (세무) +-- ============================================================ +('DOM_TAX_INVOICE_NO', '세금계산서 번호', 'TAX', 'VARCHAR', 50, NULL, NULL, + NULL, NULL, '202605-00123', 'NONE', 'N', + '국세청 발행 번호 또는 내부 일련번호', 'Y'), +('DOM_VAT', '부가세', 'TAX', 'DECIMAL', NULL, 15, 2, + '#,##0', NULL, '300000.00', 'NONE', 'N', + '부가가치세 (10%)', 'Y'), +('DOM_INCOME_TAX', '소득세', 'TAX', 'DECIMAL', NULL, 15, 2, + '#,##0', NULL, '99000.00', 'NONE', 'N', + '원천징수 소득세 (3%)', 'Y'), +('DOM_LOCAL_TAX', '지방세', 'TAX', 'DECIMAL', NULL, 15, 2, + '#,##0', NULL, '9900.00', 'NONE', 'N', + '지방소득세 (소득세의 10%)', 'Y'), + +-- ============================================================ +-- BANKING (은행 / 결제) +-- ============================================================ +('DOM_TRANSFER_REF', '이체 참조번호', 'BANKING', 'VARCHAR', 50, NULL, NULL, + NULL, NULL, 'TRX-20260510-0001', 'NONE', 'N', + '은행/PG 측 이체 추적 번호', 'Y'), +('DOM_TRANSFER_FEE', '이체 수수료', 'BANKING', 'DECIMAL', NULL, 15, 2, + '#,##0', NULL, '500.00', 'NONE', 'N', + '건당 이체 수수료 (지급액에서 차감 가능)', 'Y'), +('DOM_CURRENCY', '통화 코드', 'BANKING', 'CHAR', 3, NULL, NULL, + NULL, '^[A-Z]{3}$', 'KRW', 'NONE', 'N', + 'ISO 4217 (KRW / USD / EUR / JPY)', 'Y'), +('DOM_FX_RATE', '환율', 'BANKING', 'DECIMAL', NULL, 15, 6, + '#,##0.000000', NULL, '1350.123456', 'NONE', 'N', + '기준 통화 → 거래 통화 (소수점 6자리)', 'Y'), +('DOM_SWIFT_CODE', 'SWIFT BIC', 'BANKING', 'VARCHAR', 11, NULL, NULL, + NULL, '^[A-Z]{6}[A-Z0-9]{2,5}$', 'KOEXKRSE', 'NONE', 'N', + '국제 송금용 은행 식별 코드', 'Y') + +ON CONFLICT (domain_code) DO NOTHING; + + +-- ============================================================ +-- 데이터 사전 매핑 보강 (V20 / V21 누락분 + 신규 매핑) +-- ============================================================ +INSERT INTO ga.data_dictionary +(table_name, column_name, domain_code, column_label, is_pk, is_fk, fk_reference, is_required, description) +VALUES +-- exception_ledger 핵심 +('exception_ledger', 'ledger_id', 'DOM_ID_BIGINT', '원장ID', 'Y', 'N', NULL, 'Y', NULL), +('exception_ledger', 'agent_id', 'DOM_ID_BIGINT', '설계사ID', 'N', 'Y', 'agent.agent_id', 'Y', NULL), +('exception_ledger', 'exception_code', 'DOM_STATUS', '예외코드', 'N', 'Y', 'exception_type_code.exception_code', 'Y', NULL), +('exception_ledger', 'amount', 'DOM_AMOUNT', '금액', 'N', 'N', NULL, 'Y', NULL), +('exception_ledger', 'settle_month', 'DOM_SETTLE_MONTH', '정산월', 'N', 'N', NULL, 'Y', NULL), +('exception_ledger', 'approve_status', 'DOM_APPROVE_STATUS', '승인상태', 'N', 'N', NULL, 'Y', 'PENDING/APPROVED/REJECTED'), +('exception_ledger', 'approver_id', 'DOM_APPROVER_ID', '승인자', 'N', 'Y', 'users.user_id', 'N', NULL), +('exception_ledger', 'approve_date', 'DOM_DATETIME', '승인일시', 'N', 'N', NULL, 'N', NULL), + +-- chargeback 핵심 +('chargeback', 'cb_id', 'DOM_ID_BIGINT', '환수ID', 'Y', 'N', NULL, 'Y', NULL), +('chargeback', 'agent_id', 'DOM_ID_BIGINT', '설계사ID', 'N', 'Y', 'agent.agent_id', 'Y', NULL), +('chargeback', 'lapse_month', 'DOM_LAPSE_MONTH', '실효경과월', 'N', 'N', NULL, 'Y', NULL), +('chargeback', 'cb_rate', 'DOM_RATE_PCT', '환수율', 'N', 'N', NULL, 'Y', NULL), +('chargeback', 'cb_amount', 'DOM_COMMISSION', '환수금액', 'N', 'N', NULL, 'Y', NULL), +('chargeback', 'current_installment','DOM_INSTALLMENT_SEQ','분할회차', 'N', 'N', NULL, 'N', NULL), +('chargeback', 'settle_month', 'DOM_SETTLE_MONTH', '정산월', 'N', 'N', NULL, 'Y', NULL), + +-- reconciliation +('reconciliation', 'recon_id', 'DOM_ID_BIGINT', '대사ID', 'Y', 'N', NULL, 'Y', NULL), +('reconciliation', 'company_code', 'DOM_COMPANY_CODE', '보험사', 'N', 'N', NULL, 'Y', NULL), +('reconciliation', 'settle_month', 'DOM_SETTLE_MONTH', '정산월', 'N', 'N', NULL, 'Y', NULL), +('reconciliation', 'company_amount', 'DOM_AMOUNT', '보험사통보액','N','N', NULL, 'Y', NULL), +('reconciliation', 'system_amount', 'DOM_AMOUNT', '시스템계산액','N','N', NULL, 'Y', NULL), +('reconciliation', 'diff_amount', 'DOM_RECONCILE_DIFF', '차액', 'N', 'N', NULL, 'Y', NULL), +('reconciliation', 'status', 'DOM_RECONCILE_STATUS', '대사상태', 'N', 'N', NULL, 'Y', NULL), + +-- batch_job_log +('batch_job_log', 'job_id', 'DOM_ID_BIGINT', '배치ID', 'Y', 'N', NULL, 'Y', NULL), +('batch_job_log', 'batch_id', 'DOM_BATCH_ID', '배치코드', 'N', 'N', NULL, 'Y', 'monthlySettlementJob 등'), +('batch_job_log', 'settle_month', 'DOM_SETTLE_MONTH','정산월', 'N', 'N', NULL, 'N', NULL), +('batch_job_log', 'status', 'DOM_STATUS', '상태', 'N', 'N', NULL, 'Y', 'REQUESTED/RUNNING/COMPLETED/FAILED'), +('batch_job_log', 'started_at', 'DOM_DATETIME', '시작일시', 'N', 'N', NULL, 'N', NULL), +('batch_job_log', 'finished_at', 'DOM_DATETIME', '종료일시', 'N', 'N', NULL, 'N', NULL), + +-- file_storage +('file_storage', 'file_id', 'DOM_FILE_ID', '파일ID', 'Y', 'N', NULL, 'Y', NULL), +('file_storage', 'original_name', 'DOM_TEXT_SHORT', '원본파일명', 'N', 'N', NULL, 'Y', NULL), +('file_storage', 'stored_name', 'DOM_TEXT_SHORT', '저장파일명', 'N', 'N', NULL, 'Y', NULL), +('file_storage', 'file_path', 'DOM_FILE_PATH', '파일경로', 'N', 'N', NULL, 'Y', NULL), +('file_storage', 'file_size', 'DOM_FILE_SIZE', '파일크기', 'N', 'N', NULL, 'N', NULL), +('file_storage', 'mime_type', 'DOM_MIME_TYPE', 'MIME타입', 'N', 'N', NULL, 'N', NULL), + +-- api_access_log +('api_access_log', 'log_id', 'DOM_ID_BIGINT', '로그ID', 'Y', 'N', NULL, 'Y', NULL), +('api_access_log', 'user_id', 'DOM_ID_BIGINT', '사용자ID', 'N', 'Y', 'users.user_id', 'N', NULL), +('api_access_log', 'request_url', 'DOM_TEXT_SHORT', '요청URL', 'N', 'N', NULL, 'Y', NULL), +('api_access_log', 'response_status', 'DOM_ID_BIGINT', 'HTTP상태', 'N', 'N', NULL, 'N', NULL), +('api_access_log', 'response_time', 'DOM_ID_BIGINT', '응답시간', 'N', 'N', NULL, 'N', '단위: ms'), +('api_access_log', 'ip_address', 'DOM_IP_ADDRESS', 'IP', 'N', 'N', NULL, 'N', NULL), + +-- data_change_log +('data_change_log', 'log_id', 'DOM_ID_BIGINT', '로그ID', 'Y', 'N', NULL, 'Y', NULL), +('data_change_log', 'table_name', 'DOM_TEXT_SHORT', '테이블명', 'N', 'N', NULL, 'Y', NULL), +('data_change_log', 'record_id', 'DOM_TEXT_SHORT', 'PK', 'N', 'N', NULL, 'N', NULL), +('data_change_log', 'action_type', 'DOM_STATUS', '액션', 'N', 'N', NULL, 'Y', 'CREATE/UPDATE/DELETE'), +('data_change_log', 'change_data', 'DOM_JSONB', '변경 데이터','N', 'N', NULL, 'N', 'before/after JSON'), +('data_change_log', 'user_id', 'DOM_ID_BIGINT', '사용자ID', 'N', 'Y', 'users.user_id', 'N', NULL), + +-- 모든 정산/원장 테이블의 created_by/updated_by 매핑 (감사 표준화) +('recruit_ledger', 'created_at', 'DOM_DATETIME', '등록일시', 'N', 'N', NULL, 'Y', NULL), +('recruit_ledger', 'updated_at', 'DOM_DATETIME', '수정일시', 'N', 'N', NULL, 'N', NULL), +('maintain_ledger', 'created_at', 'DOM_DATETIME', '등록일시', 'N', 'N', NULL, 'Y', NULL), +('maintain_ledger', 'updated_at', 'DOM_DATETIME', '수정일시', 'N', 'N', NULL, 'N', NULL), +('settle_master', 'confirmed_by','DOM_APPROVER_ID','확정자', 'N', 'Y', 'users.user_id', 'N', NULL), +('settle_master', 'confirmed_at','DOM_DATETIME', '확정일시', 'N', 'N', NULL, 'N', NULL) + +ON CONFLICT (table_name, column_name) DO NOTHING;