Appearance
NextMarket 데이터베이스 스키마 설계서
Database: MySQL 8.x Character Set: utf8mb4 Collation: utf8mb4_unicode_ci 설계 원칙: StepPay API 응답 구조 기반, 자체 IDX 키 체계 사용 관련 문서: Stored Procedures 가이드 소스 위치:
nextmarket-db/(domain.json 템플릿 변수 방식)
1. ERD 개요
┌─────────────────┐ ┌─────────────────┐
│ NMT_USERS │────<│ NMT_SHIPPING │
└─────────────────┘ └─────────────────┘
│
│
▼
┌─────────────────┐ ┌─────────────────────┐ ┌─────────────────┐
│ NMT_ORDERS │────<│ NMT_ORDER_ITEMS │────>│ NMT_PRODUCTS │
└─────────────────┘ └─────────────────────┘ └─────────────────┘
│ │
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────┐
│ NMT_SUBSCRIPTIONS │ │ NMT_PRICES │
└─────────────────────┘ └─────────────────┘
# StepPay 매핑 (07.steppay)
STP_USERS, STP_PRODUCTS, STP_PRICES, STP_ORDERS, STP_SUBSCRIPTIONS, STP_PAYMENTS
→ 로컬 NMT_* 테이블의 IDX ↔ StepPay ID/코드 매핑2. 공통 데이터 타입 (domain.json)
소스 SQL 파일(.raw.sql)에서 ${TYPE_NAME} 형식으로 참조되는 공통 타입:
| 변수 | SQL 타입 | 용도 |
|---|---|---|
| IDX | int | 일반 정수 ID (AUTO_INCREMENT PK) |
| BIGIDX | bigint | StepPay API ID (대용량) |
| NAME | varchar(50) | 이름/상호 |
| CODE | varchar(20) | 코드 |
| LCODE | varchar(100) | 긴 코드 (StepPay 코드) |
| TYPE | varchar(30) | 타입/상태 |
| STR | varchar(200) | 일반 문자열 |
| DESC | text | 긴 텍스트 (설명) |
| AMT | numeric(12,3) | 금액 |
| varchar(200) | 이메일 | |
| MOBILE | varchar(20) | 휴대폰 |
| PASSWD | varchar(200) | 비밀번호 |
| TS | timestamp | 타임스탬프 |
| DT | varchar(10) | 날짜 (%Y%m%d) |
| TM | varchar(10) | 시간 (%H%i%S) |
| BOOL | tinyint | 불린 (0/1) |
| CNT | int | 카운트/수량 |
| SEQ | smallint | 정렬 순서 |
| KEY | varchar(50) | 키 필드 |
| URL | varchar(200) | URL |
| ADDR | varchar(100) | 주소 |
| ZIP | varchar(10) | 우편번호 |
| IP | varchar(20) | IP 주소 |
| YN | char(1) | Y/N 여부 |
3. 설계 규칙
- 테이블 접두사: 모든 테이블은
NMT_접두사 사용, StepPay 매핑은STP_접두사 - PK 명명:
{약칭}_IDX(int AUTO_INCREMENT) - StepPay ID를 PK로 사용하지 않음 - StepPay ID/코드 분리:
STP_*매핑 테이블에서 별도 관리 (NMT_* 테이블에 STP 컬럼 없음) - 소프트 삭제:
DEL_YNchar(1) DEFAULT 'N' 컬럼으로 삭제 여부 관리 - 상태/타입 기본값:
'그룹키:값'형식 (예:'USR_STAT:NORMAL','ORD_TYPE:ONETIME') - FK 미사용: 파티션 테이블 호환 및 성능을 위해 FOREIGN KEY 제약 없이 INDEX만 사용
- 인덱스 명명:
IDX_{테이블명}_{순번}형식 - 복합 인덱스 우선: 자주 함께 조회되는 컬럼은 복합 인덱스로 구성
4. 테이블 정의
4.1 NMT_USERS (고객)
로컬 사용자 정보 (StepPay 매핑은 STP_USERS 참조)
sql
CREATE TABLE NMT_USERS (
`USR_IDX` int AUTO_INCREMENT NOT NULL COMMENT '회원 IDX',
`USR_ID` varchar(200) NOT NULL COMMENT '고객 아이디 (보통 이메일) StepPay:username',
`USR_NM` varchar(50) NULL COMMENT '고객명',
`USR_EMAIL` varchar(200) NULL COMMENT '이메일',
`USR_PHONE` varchar(20) NULL COMMENT '전화번호',
`USR_STATUS` varchar(30) NOT NULL DEFAULT 'USR_STAT:NORMAL' COMMENT '회원상태',
`ROLE` varchar(30) NOT NULL DEFAULT 'USR_ROLE:USER' COMMENT '사용자 권한',
`MARKETING_SMS` tinyint DEFAULT FALSE COMMENT 'SMS 마케팅 수신 동의',
`MARKETING_EMAIL` tinyint DEFAULT FALSE COMMENT '이메일 마케팅 수신 동의',
`MARKETING_KAKAO` tinyint DEFAULT FALSE COMMENT '카카오 마케팅 수신 동의',
`ATTRIBUTES` JSON NULL COMMENT '고객 추가 정보 (커스텀 필드)',
`COUNTRY_CODE` varchar(20) DEFAULT 'KR' COMMENT '국가코드',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
`DORMANT_TS` timestamp NULL COMMENT '휴면 전환일시',
`PASSWORD_HASH` varchar(200) NULL COMMENT '로컬 인증용',
`LAST_LOGIN_TS` timestamp NULL COMMENT '최종 로그인일시',
`DEL_YN` char(1) DEFAULT 'N' COMMENT '삭제여부',
PRIMARY KEY (`USR_IDX`),
UNIQUE INDEX `IDX_NMT_USERS_01` (`USR_ID`),
INDEX `IDX_NMT_USERS_02` (`USR_EMAIL`),
INDEX `IDX_NMT_USERS_03` (`USR_STATUS`),
INDEX `IDX_NMT_USERS_04` (`CREATE_TS`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='고객';컬럼 정의:
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| USR_IDX | int | NO | AUTO | 회원 IDX (PK) |
| USR_ID | varchar(200) | NO | - | 고객 아이디 (이메일) |
| USR_NM | varchar(50) | YES | NULL | 고객명 |
| USR_EMAIL | varchar(200) | YES | NULL | 이메일 |
| USR_PHONE | varchar(20) | YES | NULL | 전화번호 |
| USR_STATUS | varchar(30) | NO | 'USR_STAT:NORMAL' | 회원상태 |
| ROLE | varchar(30) | NO | 'USR_ROLE:USER' | 사용자 권한 |
| MARKETING_SMS | tinyint | NO | FALSE | SMS 마케팅 동의 |
| MARKETING_EMAIL | tinyint | NO | FALSE | 이메일 마케팅 동의 |
| MARKETING_KAKAO | tinyint | NO | FALSE | 카카오 마케팅 동의 |
| ATTRIBUTES | JSON | YES | NULL | 커스텀 필드 |
| COUNTRY_CODE | varchar(20) | NO | 'KR' | 국가 코드 |
| CREATE_TS | timestamp | NO | CURRENT_TIMESTAMP | 등록일시 |
| MODIFY_TS | timestamp | NO | CURRENT_TIMESTAMP | 수정일시 |
| DORMANT_TS | timestamp | YES | NULL | 휴면 전환일시 |
| PASSWORD_HASH | varchar(200) | YES | NULL | 로컬 인증용 비밀번호 |
| LAST_LOGIN_TS | timestamp | YES | NULL | 최종 로그인일시 |
| DEL_YN | char(1) | NO | 'N' | 삭제여부 |
4.2 NMT_SHIPPING (배송지)
StepPay Customer.shipping 구조와 동일
sql
CREATE TABLE NMT_SHIPPING (
`SHP_IDX` int NOT NULL AUTO_INCREMENT COMMENT '배송지 IDX',
`USR_IDX` bigint NOT NULL COMMENT '회원 IDX',
`SHP_NM` varchar(50) NULL COMMENT '수령인',
`SHP_PHONE` varchar(20) NULL COMMENT '연락처',
`POSTCODE` varchar(10) NULL COMMENT '우편번호',
`ADDR1` varchar(200) NULL COMMENT '기본 주소',
`ADDR2` varchar(200) NULL COMMENT '상세 주소',
`CITY` varchar(100) NULL COMMENT '도시',
`STATE` varchar(100) NULL COMMENT '시/도',
`COUNTRY_CODE` varchar(20) DEFAULT 'KR' COMMENT '국가코드',
`IS_DEFAULT` tinyint DEFAULT FALSE COMMENT '기본 배송지 여부',
`DEL_YN` char(1) DEFAULT 'N' COMMENT '삭제여부',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`SHP_IDX`),
INDEX `IDX_NMT_SHIPPING_01` (`USR_IDX`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='배송지';컬럼 정의:
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| SHP_IDX | int | NO | AUTO | 배송지 IDX (PK) |
| USR_IDX | bigint | NO | - | 회원 IDX |
| SHP_NM | varchar(50) | YES | NULL | 수령인 |
| SHP_PHONE | varchar(20) | YES | NULL | 연락처 |
| POSTCODE | varchar(10) | YES | NULL | 우편번호 |
| ADDR1 | varchar(200) | YES | NULL | 기본 주소 |
| ADDR2 | varchar(200) | YES | NULL | 상세 주소 |
| CITY | varchar(100) | YES | NULL | 도시 |
| STATE | varchar(100) | YES | NULL | 시/도 |
| COUNTRY_CODE | varchar(20) | NO | 'KR' | 국가 코드 |
| IS_DEFAULT | tinyint | NO | FALSE | 기본 배송지 여부 |
| DEL_YN | char(1) | NO | 'N' | 삭제여부 |
| CREATE_TS | timestamp | NO | CURRENT_TIMESTAMP | 등록일시 |
| MODIFY_TS | timestamp | NO | CURRENT_TIMESTAMP | 수정일시 |
4.3 NMT_PRODUCTS (상품)
로컬 상품 정보 (StepPay 매핑은 STP_PRODUCTS 참조) TYPE: BOX, SOFTWARE, BUNDLE, INVOICE, DRAFT STATUS: SALE, OUT_OF_STOCK, UNSOLD, WAITING_APPROVAL, REJECTED
sql
CREATE TABLE NMT_PRODUCTS (
`PRD_IDX` int AUTO_INCREMENT NOT NULL COMMENT '상품 IDX',
`TYPE` varchar(30) NOT NULL DEFAULT 'PRD_TYPE:SOFTWARE' COMMENT '상품유형',
`STATUS` varchar(30) NOT NULL DEFAULT 'PRD_STATUS:SALE' COMMENT '상품상태',
`PRD_NM` varchar(200) NOT NULL COMMENT '상품명',
`SUB_TITLE` varchar(200) NULL COMMENT '부제목',
`PRD_DESCRIPTION` text NULL COMMENT '상품 설명',
`SUMMARY` text NULL COMMENT '상품 요약',
`SKU` varchar(50) NULL COMMENT 'SKU 코드',
`NOTICE` text NULL COMMENT '유의사항',
`FEATURED_IMAGE_URL` varchar(200) NULL COMMENT '대표 이미지',
`IMAGE_URLS` JSON NULL COMMENT '이미지 URL 배열',
`QUANTITY` int NULL COMMENT '재고 : null이면 무제한',
`ENABLED_DEMO` tinyint DEFAULT FALSE COMMENT '체험판 활성화 여부',
`DEMO_PERIOD` int NULL COMMENT '체험 기간',
`DEMO_PERIOD_UNIT` varchar(30) NULL COMMENT '체험 기간 단위',
`USE_COMBINATION` tinyint DEFAULT FALSE COMMENT '조합형 옵션 사용',
`OPTION_GROUPS` JSON NULL COMMENT '옵션 그룹 배열',
`OPTION_COMBINATIONS` JSON NULL COMMENT '옵션 조합 배열',
`COMBINED_PRODUCTS` JSON NULL COMMENT '번들 구성 상품',
`CATEGORIES` JSON NULL COMMENT '카테고리 배열',
`IS_ONETIME_PURCHASABLE` tinyint NULL COMMENT '활성 구독 제한',
`PRODUCT_ORDER` smallint DEFAULT 0 COMMENT '정렬 순서',
`EVENT_BADGE` JSON NULL COMMENT '이벤트 뱃지',
`USE_WIDGET` JSON NULL COMMENT '위젯 사용 설정',
`COUNTRY_SETTING` JSON NULL COMMENT '국가 설정',
`AVAILABLE_REGIONS` JSON NULL COMMENT '판매 가능 지역',
`VENDOR_UUID` varchar(50) NULL COMMENT '가맹점 UUID',
`GROUP_ID` bigint NULL COMMENT '그룹 ID',
`REASON_OF_REJECT` text NULL COMMENT '승인 거절 사유',
`DEL_YN` char(1) DEFAULT 'N' COMMENT '삭제여부',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`PRD_IDX`),
INDEX `IDX_NMT_PRODUCTS_01` (`STATUS` ASC, `TYPE` ASC, `PRODUCT_ORDER` ASC, `CREATE_TS` DESC),
INDEX `IDX_NMT_PRODUCTS_02` (`CREATE_TS` DESC),
FULLTEXT INDEX `IDX_NMT_PRODUCTS_FT` (`PRD_NM`, `PRD_DESCRIPTION`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='상품';컬럼 정의:
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| PRD_IDX | int | NO | AUTO | 상품 IDX (PK) |
| TYPE | varchar(30) | NO | 'PRD_TYPE:SOFTWARE' | 상품 유형 |
| STATUS | varchar(30) | NO | 'PRD_STATUS:SALE' | 판매 상태 |
| PRD_NM | varchar(200) | NO | - | 상품명 |
| SUB_TITLE | varchar(200) | YES | NULL | 부제목 |
| PRD_DESCRIPTION | text | YES | NULL | 상품 설명 |
| SUMMARY | text | YES | NULL | 요약 |
| SKU | varchar(50) | YES | NULL | SKU 코드 |
| NOTICE | text | YES | NULL | 유의사항 |
| FEATURED_IMAGE_URL | varchar(200) | YES | NULL | 대표 이미지 |
| IMAGE_URLS | JSON | YES | NULL | 이미지 URL 배열 |
| QUANTITY | int | YES | NULL | 재고 (null=무제한) |
| ENABLED_DEMO | tinyint | NO | FALSE | 체험판 활성화 |
| DEMO_PERIOD | int | YES | NULL | 체험 기간 |
| DEMO_PERIOD_UNIT | varchar(30) | YES | NULL | 체험 기간 단위 |
| USE_COMBINATION | tinyint | NO | FALSE | 조합형 옵션 사용 |
| OPTION_GROUPS | JSON | YES | NULL | 옵션 그룹 |
| OPTION_COMBINATIONS | JSON | YES | NULL | 옵션 조합 |
| COMBINED_PRODUCTS | JSON | YES | NULL | 번들 구성 상품 |
| CATEGORIES | JSON | YES | NULL | 카테고리 |
| IS_ONETIME_PURCHASABLE | tinyint | YES | NULL | 활성 구독 제한 |
| PRODUCT_ORDER | smallint | NO | 0 | 정렬 순서 |
| EVENT_BADGE | JSON | YES | NULL | 이벤트 뱃지 |
| USE_WIDGET | JSON | YES | NULL | 위젯 설정 |
| COUNTRY_SETTING | JSON | YES | NULL | 국가 설정 |
| AVAILABLE_REGIONS | JSON | YES | NULL | 가용 지역 |
| VENDOR_UUID | varchar(50) | YES | NULL | 가맹점 UUID |
| GROUP_ID | bigint | YES | NULL | 그룹 ID |
| REASON_OF_REJECT | text | YES | NULL | 승인 거절 사유 |
| DEL_YN | char(1) | NO | 'N' | 삭제여부 |
| CREATE_TS | timestamp | NO | CURRENT_TIMESTAMP | 등록일시 |
| MODIFY_TS | timestamp | NO | CURRENT_TIMESTAMP | 수정일시 |
4.4 NMT_PRICES (가격 플랜)
로컬 가격플랜 정보 (StepPay 매핑은 STP_PRICES 참조) TYPE: ONE_TIME, FLAT, RECURRING
sql
CREATE TABLE NMT_PRICES (
`PRC_IDX` int AUTO_INCREMENT NOT NULL COMMENT '가격플랜 IDX',
`PRD_IDX` int NOT NULL COMMENT '상품 IDX (FK)',
`TYPE` varchar(30) NOT NULL DEFAULT 'PRC_TYPE:FLAT' COMMENT '가격유형',
`PRICE` numeric(12,3) NOT NULL COMMENT '가격',
`CURRENCY_PRICE` JSON NULL COMMENT '통화별 가격 {"KRW": 30000}',
`UNIT` varchar(30) NULL COMMENT '단위 (건, 개 등)',
`PRC_NM` varchar(200) NULL COMMENT '플랜명',
`PRC_DESCRIPTION` text NULL COMMENT '플랜 설명',
`IS_HIDDEN_FROM_SHOP` tinyint DEFAULT FALSE COMMENT '상점 비공개 여부',
`FIRST_SALE` JSON NULL COMMENT '첫 구매 할인 정보 {enabled, price, currencyPrice}',
`CLAIM` JSON NULL COMMENT '청구방식 {methodType, whenToClaimType, billingDate}',
`RECURRING` JSON NULL COMMENT '{id, intervalCount, interval}',
`SETUP_OPTION` JSON NULL COMMENT '기본료 설정',
`MAXIMUM_PURCHASE_QUANTITY` int DEFAULT 0 COMMENT '최대 구매 수량',
`EXPIRY_RECURRING_COUNT` int NULL COMMENT '구독 만료 결제 횟수',
`SORT_ORDER` smallint DEFAULT 0 COMMENT '정렬 순서',
`DEL_YN` char(1) DEFAULT 'N' COMMENT '삭제여부',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`PRC_IDX`),
INDEX `IDX_NMT_PRICES_01` (`PRD_IDX` ASC, `SORT_ORDER` ASC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='가격 플랜';컬럼 정의:
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| PRC_IDX | int | NO | AUTO | 가격플랜 IDX (PK) |
| PRD_IDX | int | NO | - | 상품 IDX (FK) |
| TYPE | varchar(30) | NO | 'PRC_TYPE:FLAT' | 가격 유형 |
| PRICE | numeric(12,3) | NO | - | 가격 |
| CURRENCY_PRICE | JSON | YES | NULL | 통화별 가격 |
| UNIT | varchar(30) | YES | NULL | 단위 |
| PRC_NM | varchar(200) | YES | NULL | 플랜명 |
| PRC_DESCRIPTION | text | YES | NULL | 플랜 설명 |
| IS_HIDDEN_FROM_SHOP | tinyint | NO | FALSE | 상점 비공개 |
| FIRST_SALE | JSON | YES | NULL | 첫 구매 할인 |
| CLAIM | JSON | YES | NULL | 청구 설정 |
| RECURRING | JSON | YES | NULL | 구독 주기 |
| SETUP_OPTION | JSON | YES | NULL | 기본료 |
| MAXIMUM_PURCHASE_QUANTITY | int | NO | 0 | 최대 구매 수량 |
| EXPIRY_RECURRING_COUNT | int | YES | NULL | 구독 만료 횟수 |
| SORT_ORDER | smallint | NO | 0 | 정렬 순서 |
| DEL_YN | char(1) | NO | 'N' | 삭제여부 |
| CREATE_TS | timestamp | NO | CURRENT_TIMESTAMP | 등록일시 |
| MODIFY_TS | timestamp | NO | CURRENT_TIMESTAMP | 수정일시 |
4.5 NMT_ORDERS (주문)
로컬 주문 정보 (StepPay 매핑은 STP_ORDERS 참조) TYPE: ONETIME, RECURRING_INITIAL, RECURRING 등 UNIX 타임스탬프 기반 연도별 RANGE 파티션 적용
sql
CREATE TABLE IF NOT EXISTS `NMT_ORDERS` (
`ORD_IDX` int NOT NULL AUTO_INCREMENT COMMENT '주문 일련번호',
`UNIX_ORD_DT` int NOT NULL DEFAULT 0 COMMENT '주문일자(UNIX TIME)',
`ORD_DT` varchar(10) NOT NULL COMMENT '주문(영업)일자[%Y%m%d]',
`ORD_TM` varchar(10) NOT NULL COMMENT '주문(영업)시간[%H%i%S]',
`USR_IDX` int NULL COMMENT '회원 IDX (FK)',
`USR_NM` varchar(50) NULL COMMENT '고객명',
`ORD_TYPE` varchar(30) NOT NULL DEFAULT 'ORD_TYPE:ONETIME' COMMENT '주문유형',
`PRODUCT_NAME` varchar(200) NULL COMMENT '대표 상품명',
`PRICE` numeric(12,3) NULL COMMENT '주문 금액',
`PAID_AMOUNT` numeric(12,3) NULL COMMENT '실제 결제 금액',
`CURRENCY` varchar(20) DEFAULT 'CURRENCY:KRW' COMMENT '통화 코드',
`PAYMENT_METHOD` varchar(50) NULL COMMENT '결제 수단',
`PAYMENT_DATE` timestamp NULL COMMENT '결제일시',
`SHIPPING` JSON NULL COMMENT '배송지 정보',
`DEL_YN` char(1) DEFAULT 'N' COMMENT '삭제여부',
`CREATE_TS` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp COMMENT '최근 수정일시',
PRIMARY KEY (`ORD_IDX` ASC, `UNIX_ORD_DT` ASC) USING BTREE,
INDEX `IDX_NMT_ORDERS_01` (`USR_IDX` ASC, `ORD_TYPE` ASC, `CREATE_TS` DESC) USING BTREE,
INDEX `IDX_NMT_ORDERS_02` (`PAYMENT_DATE` DESC) USING BTREE,
INDEX `IDX_NMT_ORDERS_03` (`ORD_TYPE` ASC) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 COMMENT='주문'
PARTITION BY RANGE (`UNIX_ORD_DT`) (
PARTITION `P_NMT_ORDERS_001` VALUES LESS THAN (1798729200) ENGINE = InnoDB,
PARTITION `P_NMT_ORDERS_002` VALUES LESS THAN (1830265200) ENGINE = InnoDB,
PARTITION `P_NMT_ORDERS_003` VALUES LESS THAN (1861887600) ENGINE = InnoDB,
PARTITION `P_NMT_ORDERS_004` VALUES LESS THAN (1893423600) ENGINE = InnoDB,
PARTITION `P_NMT_ORDERS_005` VALUES LESS THAN (1924959600) ENGINE = InnoDB,
PARTITION `P_NMT_ORDERS_006` VALUES LESS THAN (1956495600) ENGINE = InnoDB,
PARTITION `P_NMT_ORDERS_007` VALUES LESS THAN (1988118000) ENGINE = InnoDB,
PARTITION `P_NMT_ORDERS_008` VALUES LESS THAN (2019654000) ENGINE = InnoDB,
PARTITION `P_NMT_ORDERS_009` VALUES LESS THAN (2051190000) ENGINE = InnoDB,
PARTITION `P_NMT_ORDERS_010` VALUES LESS THAN (2082726000) ENGINE = InnoDB,
PARTITION `P_NMT_ORDERS_MAX` VALUES LESS THAN MAXVALUE ENGINE = InnoDB
);컬럼 정의:
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| ORD_IDX | int | NO | AUTO | 주문 일련번호 (PK) |
| UNIX_ORD_DT | int | NO | 0 | 주문일자 UNIX TIME (파티션키, 복합PK) |
| ORD_DT | varchar(10) | NO | - | 주문 영업일자 (%Y%m%d) |
| ORD_TM | varchar(10) | NO | - | 주문 영업시간 (%H%i%S) |
| USR_IDX | int | YES | NULL | 회원 IDX (FK) |
| USR_NM | varchar(50) | YES | NULL | 고객명 |
| ORD_TYPE | varchar(30) | NO | 'ORD_TYPE:ONETIME' | 주문 유형 |
| PRODUCT_NAME | varchar(200) | YES | NULL | 대표 상품명 |
| PRICE | numeric(12,3) | YES | NULL | 주문 금액 |
| PAID_AMOUNT | numeric(12,3) | YES | NULL | 실제 결제 금액 |
| CURRENCY | varchar(20) | NO | 'CURRENCY:KRW' | 통화 코드 |
| PAYMENT_METHOD | varchar(50) | YES | NULL | 결제 수단 |
| PAYMENT_DATE | timestamp | YES | NULL | 결제일시 |
| SHIPPING | JSON | YES | NULL | 배송지 정보 |
| DEL_YN | char(1) | NO | 'N' | 삭제여부 |
| CREATE_TS | timestamp | NO | CURRENT_TIMESTAMP | 등록일시 |
| MODIFY_TS | timestamp | YES | NULL | 최근 수정일시 |
파티션 전략:
UNIX_ORD_DT기반 RANGE 파티션 (연도별)- 복합 PK: (
ORD_IDX,UNIX_ORD_DT) - 파티션 테이블 제약 - 파티션 테이블이므로 FOREIGN KEY 미사용
- 주문 항목은 별도
NMT_ORDER_ITEMS테이블에서 관리
4.6 NMT_ORDER_ITEMS (주문 항목)
주문 항목 정규화 저장용 (StepPay 매핑은 STP_ORDERS 참조) UNIX 타임스탬프 기반 연도별 RANGE 파티션 적용
sql
CREATE TABLE IF NOT EXISTS NMT_ORDER_ITEMS (
`ORI_IDX` int NOT NULL AUTO_INCREMENT COMMENT '주문항목 IDX',
`UNIX_CREATE_DT` int NOT NULL DEFAULT 0 COMMENT '등록일자(UNIX TIME)',
`ORD_IDX` int NOT NULL COMMENT '주문 IDX (FK)',
`PRD_IDX` int NULL COMMENT '상품 IDX (FK)',
`PRC_IDX` int NULL COMMENT '가격플랜 IDX (FK)',
`PRD_NM` varchar(200) NULL COMMENT '상품명',
`PRC_NM` varchar(200) NULL COMMENT '가격플랜명',
`QUANTITY` int DEFAULT 1 COMMENT '수량',
`UNIT_PRICE` numeric(12,3) NULL COMMENT '단가',
`TOTAL_PRICE` numeric(12,3) NULL COMMENT '합계',
`SELECTED_OPTIONS` JSON NULL COMMENT '선택 옵션',
`DEL_YN` char(1) DEFAULT 'N' COMMENT '삭제여부',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`ORI_IDX` ASC, `UNIX_CREATE_DT` ASC) USING BTREE,
INDEX `IDX_NMT_ORDER_ITEMS_01` (`ORD_IDX` ASC) USING BTREE,
INDEX `IDX_NMT_ORDER_ITEMS_02` (`PRD_IDX` ASC) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 COMMENT='주문 항목'
PARTITION BY RANGE (`UNIX_CREATE_DT`) (
PARTITION `P_NMT_ORDER_ITEMS_001` VALUES LESS THAN (1798729200) ENGINE = InnoDB,
PARTITION `P_NMT_ORDER_ITEMS_002` VALUES LESS THAN (1830265200) ENGINE = InnoDB,
PARTITION `P_NMT_ORDER_ITEMS_003` VALUES LESS THAN (1861887600) ENGINE = InnoDB,
PARTITION `P_NMT_ORDER_ITEMS_004` VALUES LESS THAN (1893423600) ENGINE = InnoDB,
PARTITION `P_NMT_ORDER_ITEMS_005` VALUES LESS THAN (1924959600) ENGINE = InnoDB,
PARTITION `P_NMT_ORDER_ITEMS_006` VALUES LESS THAN (1956495600) ENGINE = InnoDB,
PARTITION `P_NMT_ORDER_ITEMS_007` VALUES LESS THAN (1988118000) ENGINE = InnoDB,
PARTITION `P_NMT_ORDER_ITEMS_008` VALUES LESS THAN (2019654000) ENGINE = InnoDB,
PARTITION `P_NMT_ORDER_ITEMS_009` VALUES LESS THAN (2051190000) ENGINE = InnoDB,
PARTITION `P_NMT_ORDER_ITEMS_010` VALUES LESS THAN (2082726000) ENGINE = InnoDB,
PARTITION `P_NMT_ORDER_ITEMS_MAX` VALUES LESS THAN MAXVALUE ENGINE = InnoDB
);컬럼 정의:
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| ORI_IDX | int | NO | AUTO | 주문항목 IDX (PK) |
| UNIX_CREATE_DT | int | NO | 0 | 등록일자 UNIX TIME (파티션키, 복합PK) |
| ORD_IDX | int | NO | - | 주문 IDX (FK) |
| PRD_IDX | int | YES | NULL | 상품 IDX (FK) |
| PRC_IDX | int | YES | NULL | 가격플랜 IDX (FK) |
| PRD_NM | varchar(200) | YES | NULL | 상품명 |
| PRC_NM | varchar(200) | YES | NULL | 가격플랜명 |
| QUANTITY | int | NO | 1 | 수량 |
| UNIT_PRICE | numeric(12,3) | YES | NULL | 단가 |
| TOTAL_PRICE | numeric(12,3) | YES | NULL | 합계 |
| SELECTED_OPTIONS | JSON | YES | NULL | 선택 옵션 |
| DEL_YN | char(1) | NO | 'N' | 삭제여부 |
| CREATE_TS | timestamp | NO | CURRENT_TIMESTAMP | 등록일시 |
| MODIFY_TS | timestamp | NO | CURRENT_TIMESTAMP | 수정일시 |
파티션 전략:
UNIX_CREATE_DT기반 RANGE 파티션 (연도별)- 복합 PK: (
ORI_IDX,UNIX_CREATE_DT) - 파티션 테이블 제약 - 로컬 IDX(int)로 주문/상품/가격플랜 참조 (StepPay ID 미사용)
4.7 NMT_SUBSCRIPTIONS (구독)
로컬 구독 정보 (StepPay 매핑은 STP_SUBSCRIPTIONS 참조) STATUS: ACTIVE, PAUSED, CANCELLED 등 UNIX 타임스탬프 기반 연도별 RANGE 파티션 적용
sql
CREATE TABLE IF NOT EXISTS NMT_SUBSCRIPTIONS (
`SUB_IDX` int AUTO_INCREMENT NOT NULL COMMENT '구독 IDX',
`UNIX_CREATE_DT` int NOT NULL DEFAULT 0 COMMENT '등록일자(UNIX TIME)',
`USR_IDX` int NULL COMMENT '회원 IDX (FK)',
`USR_NM` varchar(50) NULL COMMENT '회원명',
`PRD_NM` varchar(200) NULL COMMENT '상품명',
`SUB_STATUS` varchar(30) NOT NULL DEFAULT 'SUB_STAT:ACTIVE' COMMENT '구독상태',
`ITEMS` JSON NULL COMMENT '구독 항목 배열',
`RECURRING` JSON NULL COMMENT '{intervalCount, interval}',
`CURRENCY` varchar(20) DEFAULT 'CURRENCY:KRW' COMMENT '통화코드',
`NEXT_PAYMENT_DATE_TIME` timestamp NULL COMMENT '다음 결제일시',
`PAYMENT_METHOD` JSON NULL COMMENT '결제 수단 정보',
`START_DATE_TIME` timestamp NULL COMMENT '구독 시작일시',
`END_DATE_TIME` timestamp NULL COMMENT '구독 종료일시',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`SUB_IDX` ASC, `UNIX_CREATE_DT` ASC) USING BTREE,
INDEX `IDX_NMT_SUBSCRIPTIONS_01` (`USR_IDX` ASC, `SUB_STATUS` ASC, `CREATE_TS` DESC) USING BTREE,
INDEX `IDX_NMT_SUBSCRIPTIONS_02` (`NEXT_PAYMENT_DATE_TIME` ASC) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 COMMENT='구독'
PARTITION BY RANGE (`UNIX_CREATE_DT`) (
PARTITION `P_NMT_SUBSCRIPTIONS_001` VALUES LESS THAN (1798729200) ENGINE = InnoDB,
PARTITION `P_NMT_SUBSCRIPTIONS_002` VALUES LESS THAN (1830265200) ENGINE = InnoDB,
PARTITION `P_NMT_SUBSCRIPTIONS_003` VALUES LESS THAN (1861887600) ENGINE = InnoDB,
PARTITION `P_NMT_SUBSCRIPTIONS_004` VALUES LESS THAN (1893423600) ENGINE = InnoDB,
PARTITION `P_NMT_SUBSCRIPTIONS_005` VALUES LESS THAN (1924959600) ENGINE = InnoDB,
PARTITION `P_NMT_SUBSCRIPTIONS_006` VALUES LESS THAN (1956495600) ENGINE = InnoDB,
PARTITION `P_NMT_SUBSCRIPTIONS_007` VALUES LESS THAN (1988118000) ENGINE = InnoDB,
PARTITION `P_NMT_SUBSCRIPTIONS_008` VALUES LESS THAN (2019654000) ENGINE = InnoDB,
PARTITION `P_NMT_SUBSCRIPTIONS_009` VALUES LESS THAN (2051190000) ENGINE = InnoDB,
PARTITION `P_NMT_SUBSCRIPTIONS_010` VALUES LESS THAN (2082726000) ENGINE = InnoDB,
PARTITION `P_NMT_SUBSCRIPTIONS_MAX` VALUES LESS THAN MAXVALUE ENGINE = InnoDB
);컬럼 정의:
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| SUB_IDX | int | NO | AUTO | 구독 IDX (PK) |
| UNIX_CREATE_DT | int | NO | 0 | 등록일자 UNIX TIME (파티션키, 복합PK) |
| USR_IDX | int | YES | NULL | 회원 IDX (FK) |
| USR_NM | varchar(50) | YES | NULL | 회원명 |
| PRD_NM | varchar(200) | YES | NULL | 상품명 |
| SUB_STATUS | varchar(30) | NO | 'SUB_STAT:ACTIVE' | 구독 상태 |
| ITEMS | JSON | YES | NULL | 구독 항목 |
| RECURRING | JSON | YES | NULL | 구독 주기 |
| CURRENCY | varchar(20) | NO | 'CURRENCY:KRW' | 통화 |
| NEXT_PAYMENT_DATE_TIME | timestamp | YES | NULL | 다음 결제일 |
| PAYMENT_METHOD | JSON | YES | NULL | 결제 수단 |
| START_DATE_TIME | timestamp | YES | NULL | 구독 시작일 |
| END_DATE_TIME | timestamp | YES | NULL | 구독 종료일 |
| CREATE_TS | timestamp | NO | CURRENT_TIMESTAMP | 등록일시 |
| MODIFY_TS | timestamp | NO | CURRENT_TIMESTAMP | 수정일시 |
파티션 전략:
UNIX_CREATE_DT기반 RANGE 파티션 (연도별)- 복합 PK: (
SUB_IDX,UNIX_CREATE_DT) - 파티션 테이블 제약 - 복합 인덱스: USR_IDX + SUB_STATUS + CREATE_TS (사용자별 구독 조회 최적화)
4.8 NMT_PAYMENT_METHODS (결제 수단)
로컬 결제수단 정보 (StepPay 매핑은 STP_PAYMENTS 참조)
sql
CREATE TABLE NMT_PAYMENT_METHODS (
`PMT_IDX` int AUTO_INCREMENT NOT NULL COMMENT '결제수단 IDX',
`USR_IDX` int NOT NULL COMMENT '회원 IDX (FK)',
`PAYMENT_INFO` JSON NULL COMMENT '카드/계좌 정보',
`IS_DEFAULT` tinyint DEFAULT FALSE COMMENT '기본 결제수단 여부',
`DEL_YN` char(1) DEFAULT 'N' COMMENT '삭제여부',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
PRIMARY KEY (`PMT_IDX`),
INDEX `IDX_NMT_PAYMENT_METHODS_01` (`USR_IDX`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='결제 수단';컬럼 정의:
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| PMT_IDX | int | NO | AUTO | 결제수단 IDX (PK) |
| USR_IDX | int | NO | - | 회원 IDX (FK) |
| PAYMENT_INFO | JSON | YES | NULL | 카드/계좌 정보 |
| IS_DEFAULT | tinyint | NO | FALSE | 기본 결제수단 여부 |
| DEL_YN | char(1) | NO | 'N' | 삭제여부 |
| CREATE_TS | timestamp | NO | CURRENT_TIMESTAMP | 등록일시 |
4.9 NMT_WEBHOOK_LOGS (웹훅 로그)
StepPay 웹훅 수신 로그 (로컬 전용)
sql
CREATE TABLE NMT_WEBHOOK_LOGS (
`WHL_IDX` int NOT NULL AUTO_INCREMENT COMMENT '웹훅 로그 IDX',
`EVENT_TYPE` varchar(200) NOT NULL COMMENT '이벤트 유형',
`PAYLOAD` JSON NOT NULL COMMENT '웹훅 페이로드',
`SIGNATURE` varchar(200) NULL COMMENT '서명값',
`WHL_STATUS` varchar(30) NOT NULL DEFAULT 'WHL_STAT:RECEIVED' COMMENT '처리상태',
`ERROR_MESSAGE` text NULL COMMENT '오류 메시지',
`PROCESSED_TS` timestamp NULL COMMENT '처리일시',
`IP_ADDRESS` varchar(20) NULL COMMENT '요청 IP',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
PRIMARY KEY (`WHL_IDX`),
INDEX `IDX_NMT_WEBHOOK_LOGS_01` (`EVENT_TYPE`),
INDEX `IDX_NMT_WEBHOOK_LOGS_02` (`WHL_STATUS`),
INDEX `IDX_NMT_WEBHOOK_LOGS_03` (`CREATE_TS`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='웹훅 로그';컬럼 정의:
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| WHL_IDX | int | NO | AUTO | 웹훅 로그 IDX (PK) |
| EVENT_TYPE | varchar(200) | NO | - | 이벤트 유형 |
| PAYLOAD | JSON | NO | - | 웹훅 페이로드 |
| SIGNATURE | varchar(200) | YES | NULL | 서명값 |
| WHL_STATUS | varchar(30) | NO | 'WHL_STAT:RECEIVED' | 처리 상태 |
| ERROR_MESSAGE | text | YES | NULL | 오류 메시지 |
| PROCESSED_TS | timestamp | YES | NULL | 처리 완료 일시 |
| IP_ADDRESS | varchar(20) | YES | NULL | 요청 IP |
| CREATE_TS | timestamp | NO | CURRENT_TIMESTAMP | 등록일시 |
4.10 NMT_REFRESH_TOKENS (리프레시 토큰)
로컬 JWT 인증용 (로컬 전용)
sql
CREATE TABLE NMT_REFRESH_TOKENS (
`RTK_IDX` int NOT NULL AUTO_INCREMENT COMMENT '리프레시 토큰 IDX',
`USR_IDX` int NOT NULL COMMENT '회원 IDX',
`TOKEN_HASH` varchar(200) NOT NULL COMMENT '토큰 해시값',
`EXPIRES_TS` timestamp NOT NULL COMMENT '만료일시',
`REVOKED_TS` timestamp NULL COMMENT '폐기일시',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
PRIMARY KEY (`RTK_IDX`),
INDEX `IDX_NMT_REFRESH_TOKENS_01` (`USR_IDX`),
INDEX `IDX_NMT_REFRESH_TOKENS_02` (`TOKEN_HASH`),
INDEX `IDX_NMT_REFRESH_TOKENS_03` (`EXPIRES_TS`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='리프레시 토큰';컬럼 정의:
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| RTK_IDX | int | NO | AUTO | 리프레시 토큰 IDX (PK) |
| USR_IDX | int | NO | - | 회원 IDX |
| TOKEN_HASH | varchar(200) | NO | - | 토큰 해시 |
| EXPIRES_TS | timestamp | NO | - | 만료일시 |
| REVOKED_TS | timestamp | YES | NULL | 폐기일시 |
| CREATE_TS | timestamp | NO | CURRENT_TIMESTAMP | 등록일시 |
5. StepPay 매핑 테이블 (07.steppay)
로컬 엔티티와 StepPay ID를 연결하는 매핑 테이블. 로컬 PK를 기준으로 StepPay ID/코드를 저장합니다. NMT_* 테이블에서 STP 컬럼이 분리되어 독립적인 매핑 테이블로 관리됩니다.
5.1 STP_USERS (사용자 매핑)
sql
CREATE TABLE STP_USERS (
`USR_IDX` int NOT NULL COMMENT '로컬 회원 IDX (FK)',
`STP_USR_IDX` bigint NOT NULL COMMENT 'StepPay 고객 ID',
`STP_USR_CODE` varchar(100) NOT NULL COMMENT 'StepPay 고객 코드 (USER_xxx)',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`USR_IDX`),
UNIQUE INDEX `IDX_STP_USERS_01` (`STP_USR_IDX`),
UNIQUE INDEX `IDX_STP_USERS_02` (`STP_USR_CODE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='StepPay 사용자 매핑';5.2 STP_PRODUCTS (상품 매핑)
sql
CREATE TABLE STP_PRODUCTS (
`PRD_IDX` int NOT NULL COMMENT '로컬 상품 IDX (FK)',
`STP_PRD_IDX` bigint NOT NULL COMMENT 'StepPay 상품 ID',
`STP_PRD_CODE` varchar(100) NOT NULL COMMENT 'StepPay 상품 코드 (product_xxx)',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`PRD_IDX`),
UNIQUE INDEX `IDX_STP_PRODUCTS_01` (`STP_PRD_IDX`),
UNIQUE INDEX `IDX_STP_PRODUCTS_02` (`STP_PRD_CODE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='StepPay 상품 매핑';5.3 STP_PRICES (가격플랜 매핑)
sql
CREATE TABLE STP_PRICES (
`PRC_IDX` int NOT NULL COMMENT '로컬 가격플랜 IDX (FK)',
`STP_PRC_IDX` bigint NOT NULL COMMENT 'StepPay 가격플랜 ID',
`STP_PRC_CODE` varchar(100) NOT NULL COMMENT 'StepPay 가격 코드 (price_xxx)',
`STP_PRD_IDX` bigint NOT NULL COMMENT 'StepPay 상품 ID (참조용)',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`PRC_IDX`),
UNIQUE INDEX `IDX_STP_PRICES_01` (`STP_PRC_IDX`),
UNIQUE INDEX `IDX_STP_PRICES_02` (`STP_PRC_CODE`),
INDEX `IDX_STP_PRICES_03` (`STP_PRD_IDX`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='StepPay 가격플랜 매핑';5.4 STP_ORDERS (주문 매핑)
sql
CREATE TABLE STP_ORDERS (
`ORD_IDX` int NOT NULL COMMENT '로컬 주문 IDX (FK)',
`STP_ORD_IDX` bigint NOT NULL COMMENT 'StepPay 주문 ID',
`STP_ORD_CODE` varchar(100) NOT NULL COMMENT 'StepPay 주문 코드 (order_xxx)',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`ORD_IDX`),
UNIQUE INDEX `IDX_STP_ORDERS_01` (`STP_ORD_IDX`),
UNIQUE INDEX `IDX_STP_ORDERS_02` (`STP_ORD_CODE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='StepPay 주문 매핑';5.5 STP_SUBSCRIPTIONS (구독 매핑)
sql
CREATE TABLE STP_SUBSCRIPTIONS (
`SUB_IDX` int NOT NULL COMMENT '로컬 구독 IDX (FK)',
`STP_SUB_IDX` bigint NOT NULL COMMENT 'StepPay 구독 ID',
`STP_SUB_CODE` varchar(100) NOT NULL COMMENT 'StepPay 구독 코드 (subscription_xxx)',
`STP_USR_IDX` bigint NULL COMMENT 'StepPay 고객 ID (참조용)',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`SUB_IDX`),
UNIQUE INDEX `IDX_STP_SUBSCRIPTIONS_01` (`STP_SUB_IDX`),
UNIQUE INDEX `IDX_STP_SUBSCRIPTIONS_02` (`STP_SUB_CODE`),
INDEX `IDX_STP_SUBSCRIPTIONS_03` (`STP_USR_IDX`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='StepPay 구독 매핑';5.6 STP_PAYMENTS (결제수단 매핑)
sql
CREATE TABLE STP_PAYMENTS (
`PMT_IDX` int NOT NULL COMMENT '로컬 결제수단 IDX (FK)',
`STP_PMT_IDX` bigint NOT NULL COMMENT 'StepPay 결제수단 ID',
`CREATE_TS` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시',
`MODIFY_TS` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`PMT_IDX`),
UNIQUE INDEX `IDX_STP_PAYMENTS_01` (`STP_PMT_IDX`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='StepPay 결제수단 매핑';6. 인덱스 전략
6.1 복합 인덱스 설계
주요 조회 패턴에 맞춰 복합 인덱스를 구성하여 쿼리 성능을 최적화:
| 테이블 | 인덱스 | 컬럼 구성 | 조회 패턴 |
|---|---|---|---|
| NMT_USERS | IDX_01 (UNIQUE) | USR_ID | 로그인 시 아이디 조회 |
| NMT_USERS | IDX_02 | USR_EMAIL | 이메일로 조회 |
| NMT_USERS | IDX_03 | USR_STATUS | 상태별 조회 |
| NMT_USERS | IDX_04 | CREATE_TS | 가입일 기준 정렬 |
| NMT_PRODUCTS | IDX_01 | STATUS, TYPE, PRODUCT_ORDER, CREATE_TS | 상품 목록 (상태+타입 필터 + 정렬) |
| NMT_PRODUCTS | IDX_02 | CREATE_TS | 등록일 기준 정렬 |
| NMT_PRODUCTS | IDX_FT (FULLTEXT) | PRD_NM, PRD_DESCRIPTION | 상품명/설명 검색 |
| NMT_PRICES | IDX_01 | PRD_IDX, SORT_ORDER | 상품별 가격플랜 조회 + 정렬 |
| NMT_ORDERS | PK | ORD_IDX, UNIX_ORD_DT | 파티션 프루닝 |
| NMT_ORDERS | IDX_01 | USR_IDX, ORD_TYPE, CREATE_TS | 사용자별 주문 목록 (유형 필터 + 최신순) |
| NMT_ORDERS | IDX_02 | PAYMENT_DATE | 결제일 기준 조회 |
| NMT_ORDERS | IDX_03 | ORD_TYPE | 주문 유형별 조회 |
| NMT_ORDER_ITEMS | PK | ORI_IDX, UNIX_CREATE_DT | 파티션 프루닝 |
| NMT_ORDER_ITEMS | IDX_01 | ORD_IDX | 주문별 항목 조회 |
| NMT_ORDER_ITEMS | IDX_02 | PRD_IDX | 상품별 주문 조회 |
| NMT_SUBSCRIPTIONS | PK | SUB_IDX, UNIX_CREATE_DT | 파티션 프루닝 |
| NMT_SUBSCRIPTIONS | IDX_01 | USR_IDX, SUB_STATUS, CREATE_TS | 사용자별 구독 목록 (상태 필터 + 최신순) |
| NMT_SUBSCRIPTIONS | IDX_02 | NEXT_PAYMENT_DATE_TIME | 다음 결제일 조회 |
6.2 StepPay 매핑 인덱스
STP_* 테이블은 로컬 IDX ↔ StepPay ID/코드 양방향 조회를 위해 UNIQUE 인덱스 사용:
| 테이블 | 인덱스 | 용도 |
|---|---|---|
| STP_USERS | PK (USR_IDX), UNIQUE (STP_USR_IDX, STP_USR_CODE) | 양방향 조회 |
| STP_PRODUCTS | PK (PRD_IDX), UNIQUE (STP_PRD_IDX, STP_PRD_CODE) | 양방향 조회 |
| STP_PRICES | PK (PRC_IDX), UNIQUE (STP_PRC_IDX, STP_PRC_CODE) | 양방향 조회 |
| STP_ORDERS | PK (ORD_IDX), UNIQUE (STP_ORD_IDX, STP_ORD_CODE) | 양방향 조회 |
| STP_SUBSCRIPTIONS | PK (SUB_IDX), UNIQUE (STP_SUB_IDX, STP_SUB_CODE) | 양방향 조회 |
| STP_PAYMENTS | PK (PMT_IDX), UNIQUE (STP_PMT_IDX) | 양방향 조회 |
6.3 동기화 전략
StepPay를 마스터 데이터로 사용하고, 로컬 DB는 캐시/미러 역할:
- 실시간 동기화: 웹훅 수신 시
NMP_SYNC_*프로시저로 즉시 반영 - STP 코드→로컬 IDX 변환:
NMP_ORDER_GET_BY_STP_CODE등으로 StepPay 코드에서 로컬 IDX를 조회 - 배치 동기화: 주기적으로 StepPay API 호출하여 전체 동기화
- 조회 우선순위: 로컬 DB 먼저 조회 → 없으면 StepPay API 호출 → 로컬 저장
최종 업데이트: 2026년 2월 6일 - STP 컬럼 분리 (STP_ 매핑 테이블), DEL_YN 소프트 삭제, 복합 인덱스 최적화, NMT_ORDER_ITEMS/NMT_SUBSCRIPTIONS 파티션 추가*