2차 프로젝트 테이블 설계 -페이먼트 테이블과 페이먼트 트랜젝션 페이먼트 프로바이터 테이블명중 어느게 적합
재미나이
적절한 테이블 이름은 데이터베이스 설계의 명명 규칙, 프로젝트 표준 및 테이블이 저장할 특정 데이터 유형에 따라 달라집니다. 각 이름의 적합성은 아래와 같이 다릅니다.
적합성 분석
테이블명 적합성 이유
페이먼트 테이블 (Payment Table) 높음 가장 일반적이고 직관적인 이름입니다. 대부분의 시스템에서 지불 관련 데이터를 저장하는 메인 테이블로 사용됩니다.
페이먼트 트랜젝션 (Payment Transaction) 높음 지불 내역이 일회성 거래(Transaction)의 기록이라는 점을 명확히 강조합니다. 특히 거래 기록 관리가 핵심인 금융 시스템에 적합합니다.
페이먼트 프로바이터 (Payment Provider) 보통/낮음 이 이름은 결제 대행사(예: PayPal, Stripe, 카카오페이) 자체에 대한 정보(이름, API 키 등)를 저장하는 데 적합합니다. 실제 개별 결제 내역을 저장하는 테이블 이름으로는 적절하지 않습니다.
권장사항
"페이먼트 테이블" 또는 **"페이먼트 트랜젝션"**이 개별 결제 내역을 저장하는 테이블 이름으로 가장 적합합니다.
"Payment" 또는 "Payments": 대부분의 범용적인 상황에서 사용하기 좋습니다.
"PaymentTransaction" 또는 "PaymentTransactions": 거래의 성격을 더 명확하게 나타내고자 할 때 사용됩니다.
결론적으로, **"페이먼트 테이블"**이 가장 광범위하게 사용되고 이해하기 쉬운 이름입니다.
payments 테이블 스키마 (MySQl)
CREATE TABLE `payments` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '결제 고유 ID',
`order_id` VARCHAR(64) NOT NULL COMMENT '상점 주문 ID',
`provider` ENUM('kakao', 'toss') NOT NULL COMMENT '결제 제공자',
`provider_transaction_id` VARCHAR(255) NOT NULL COMMENT '결제 제공자 거래 ID',
`method` VARCHAR(50) NULL COMMENT '결제 수단 (예: 카드, 간편결제)',
`amount` DECIMAL(10, 2) NOT NULL COMMENT '결제 금액',
`currency` VARCHAR(10) NOT NULL DEFAULT 'KRW' COMMENT '통화',
`status` ENUM('PENDING', 'SUCCESS', 'CANCELED', 'FAILED') NOT NULL DEFAULT 'PENDING' COMMENT '결제 상태',
`payload` JSON NULL COMMENT '결제 제공자별 추가 정보 (JSON)',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`id`),
UNIQUE KEY `ux_provider_transaction_id` (`provider`, `provider_transaction_id`),
INDEX `idx_order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='통합 결제 테이블';
payments 테이블 설명
적절한 테이블 이름은 데이터베이스 설계의 명명 규칙, 프로젝트 표준 및 테이블이 저장할 특정 데이터 유형에 따라 달라집니다. 각 이름의 적합성은 아래와 같이 다릅니다.
적합성 분석
테이블명 적합성 이유
페이먼트 테이블 (Payment Table) 높음 가장 일반적이고 직관적인 이름입니다. 대부분의 시스템에서 지불 관련 데이터를 저장하는 메인 테이블로 사용됩니다.
페이먼트 트랜젝션 (Payment Transaction) 높음 지불 내역이 일회성 거래(Transaction)의 기록이라는 점을 명확히 강조합니다. 특히 거래 기록 관리가 핵심인 금융 시스템에 적합합니다.
페이먼트 프로바이터 (Payment Provider) 보통/낮음 이 이름은 결제 대행사(예: PayPal, Stripe, 카카오페이) 자체에 대한 정보(이름, API 키 등)를 저장하는 데 적합합니다. 실제 개별 결제 내역을 저장하는 테이블 이름으로는 적절하지 않습니다.
권장사항
"페이먼트 테이블" 또는 **"페이먼트 트랜젝션"**이 개별 결제 내역을 저장하는 테이블 이름으로 가장 적합합니다.
"Payment" 또는 "Payments": 대부분의 범용적인 상황에서 사용하기 좋습니다.
"PaymentTransaction" 또는 "PaymentTransactions": 거래의 성격을 더 명확하게 나타내고자 할 때 사용됩니다.
결론적으로, **"페이먼트 테이블"**이 가장 광범위하게 사용되고 이해하기 쉬운 이름입니다.
AI 대답에는 오류가 있을 수 있습니다. 자세히 알아보기
사이트 3개
카카오페이와 토스페이를 통합 관리하는 단일 payments 테이블 설계안입니다. 여러 결제 제공자를 지원하기 위해 공통 필드를 정의하고, 제공자별로 다른 추가 정보는 JSON 형식의 필드에 저장하여 유연성을 확보했습니다.
payments 테이블 스키마 (MySQL 기준)
sql
CREATE TABLE `payments` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '결제 고유 ID',
`order_id` VARCHAR(64) NOT NULL COMMENT '상점 주문 ID',
`provider` ENUM('kakao', 'toss') NOT NULL COMMENT '결제 제공자',
`provider_transaction_id` VARCHAR(255) NOT NULL COMMENT '결제 제공자 거래 ID',
`method` VARCHAR(50) NULL COMMENT '결제 수단 (예: 카드, 간편결제)',
`amount` DECIMAL(10, 2) NOT NULL COMMENT '결제 금액',
`currency` VARCHAR(10) NOT NULL DEFAULT 'KRW' COMMENT '통화',
`status` ENUM('PENDING', 'SUCCESS', 'CANCELED', 'FAILED') NOT NULL DEFAULT 'PENDING' COMMENT '결제 상태',
`payload` JSON NULL COMMENT '결제 제공자별 추가 정보 (JSON)',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시',
PRIMARY KEY (`id`),
UNIQUE KEY `ux_provider_transaction_id` (`provider`, `provider_transaction_id`),
INDEX `idx_order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='통합 결제 테이블';
코드를 사용할 때는 주의가 필요합니다.
주요 필드 설명
id: 테이블의 고유 식별자로, 자동 증가하는 기본 키입니다.
order_id: 상점에서 생성하는 주문 번호입니다. 토스와 카카오페이 모두 orderId 또는 partner_order_id 필드를 통해 이 값을 사용합니다.
provider: 결제 제공자('kakao' 또는 'toss')를 구분합니다.
provider_transaction_id: 각 결제 제공자가 발급하는 고유 거래 ID입니다. 토스의 paymentKey 또는 카카오페이의 tid가 이 필드에 저장됩니다. 결제 제공자별로 고유해야 하므로 (provider, provider_transaction_id) 조합에 유니크 인덱스를 추가했습니다.
method: 결제 수단입니다. 토스페이먼츠에서는 CARD, VIRTUAL_ACCOUNT 등을 지원하며, 카카오페이에서도 유사한 정보를 제공합니다.
amount: 결제 금액입니다.
status: 결제 상태(대기, 성공, 취소, 실패 등)를 나타냅니다.
payload: 제공자별로 다른 데이터(예: 카드사, 할부 정보, 결제 상세 응답 등)를 JSON 형태로 저장하는 필드입니다. 이 필드를 통해 테이블의 스키마를 고정된 상태로 유지하면서 유연하게 다양한 정보를 저장할 수 있습니다.
created_at, updated_at: 생성 및 수정 시간을 기록합니다.
JSON 필드 사용 예시 (payload 컬럼)
카카오페이 결제 시 payload
json
{
"cid": "TC0ONETIME",
"approved_at": "2025-12-01T10:00:00",
"item_name": "예시상품",
"card_info": {
"kakaopay_card_info": "..."
},
"amount_info": {
"total": 10000,
"tax_free": 0,
"vat": 1000
},
"extra_data": "..."
}
코드를 사용할 때는 주의가 필요합니다.
토스페이 결제 시 payload
json
{
"paymentKey": "toss_payment_key",
"approvedAt": "2025-12-01T10:00:00",
"card": {
"company": "현대",
"number": "xxxx-xxxx-xxxx-1234"
},
"cashReceipt": {
"issueStatus": "ISSUED"
},
"extra_data": "..."
}
코드를 사용할 때는 주의가 필요합니다.
AI 대답에는 오류가 있을 수 있습니다. 자세히 알아보기
Payment APIs - 토스페이먼츠 개발자센터
토스페이먼츠 개발자센터
참고사이트
https://www.google.com/url?sa=i&source=web&rct=j&url=https://dba.stackexchange.com/questions/55843/tables-for-different-sources-of-payments&ved=2ahUKEwj1_7zApZqRAxWbqVYBHb6GLAwQmL8OegYIAQgIEAo&opi=89978449&cd&psig=AOvVaw1r7D6fSqfhC7ZN9htzZcH3&ust=1764606471513000
https://www.google.com/url?sa=i&source=web&rct=j&url=https://docs.tosspayments.com/en/api-guide&ved=2ahUKEwj1_7zApZqRAxWbqVYBHb6GLAwQmL8OegYIAQgIEAI&opi=89978449&cd&psig=AOvVaw1r7D6fSqfhC7ZN9htzZcH3&ust=1764606471513000
https://www.google.com/url?sa=i&source=web&rct=j&url=https://stackoverflow.com/questions/35129979/generic-database-design-for-multiple-gateways&ved=2ahUKEwj1_7zApZqRAxWbqVYBHb6GLAwQmL8OegYIAQgIEAY&opi=89978449&cd&psig=AOvVaw1r7D6fSqfhC7ZN9htzZcH3&ust=1764606471513000

댓글
댓글 쓰기