DynamoDB에서 반복 결제 스키마 설계 - Amazon DynamoDB

DynamoDB에서 반복 결제 스키마 설계

반복 결제 비즈니스 사용 사례

이 사용 사례에서는 DynamoDB를 사용하여 반복 결제 시스템을 구현하는 방법을 설명합니다. 데이터 모델에는 계정구독영수증과 같은 엔터티가 있습니다. 사용 사례의 구체적인 내용은 다음과 같습니다.

  • 각 계정에는 여러 구독이 있을 수 있습니다.

  • 구독에는 다음 결제를 처리해야 하는 NextPaymentDate가 있고 고객에게 이메일 미리 알림이 전송되는 NextReminderDate가 있습니다

  • 결제가 처리될 때 저장되고 업데이트되는 구독 항목이 있습니다(평균 항목 크기는 약 1KB이며 처리량은 계정 및 구독 수에 따라 다름).

  • 또한 결제 처리자는 테이블에 저장되고 TTL 속성을 사용하여 일정 기간 후에 만료되도록 설정된 프로세스의 일부로 영수증을 생성합니다

반복 결제 엔터티 관계 다이어그램

다음은 반복 결제 시스템 스키마 설계에 사용할 엔터티 관계 다이어그램(ERD)입니다.

반복 결제 시스템 액세스 패턴

다음은 반복 결제 시스템 스키마를 설계할 때 고려할 액세스 패턴입니다.

  1. createSubscription

  2. createReceipt

  3. updateSubscription

  4. getDueRemindersByDate

  5. getDuePaymentsByDate

  6. getSubscriptionsByAccount

  7. getReceiptsByAccount

반복 결제 스키마 설계

일반 이름 PK 및 SK는 계정, 구독 및 영수증 엔터티와 같은 다양한 유형의 엔터티를 동일한 테이블에 저장할 수 있도록 키 속성에 사용됩니다. 사용자는 먼저 구독을 생성하여 제품에 대한 대금을 매달 같은 날에 지불하는 데 동의합니다. 매월 어느 날에 결제를 처리할지 사용자가 선택할 수 있습니다. 결제가 처리되기 전에 전송되는 미리 알림도 있습니다. 애플리케이션은 매일 실행되는 두 개의 배치 작업, 즉 해당 날짜 기한의 미리 알림을 전송하는 배치 작업과 해당 날짜 기한의 모든 결제를 처리하는 배치 작업을 통해 작동합니다.

1단계: 액세스 패턴 1(createSubscription) 처리

액세스 패턴 1(createSubscription)은 구독을 처음 만드는 데 사용되며 SKUNextPaymentDateNextReminderDatePaymentDetails 등의 세부 정보가 설정됩니다. 이 단계에서는 구독이 하나인 계정 한 개에 대한 테이블 상태를 보여 줍니다. 항목 컬렉션에 여러 개의 구독이 있을 수 있으므로 이는 일대다 관계입니다.

2단계: 액세스 패턴 2(createReceipt) 및 3(updateSubscription) 처리

액세스 패턴 2(createReceipt)는 영수증 항목을 만드는 데 사용됩니다. 매월 결제가 처리되면 결제 처리자는 기본 테이블에 영수증을 다시 기록합니다. 항목 컬렉션에 여러 개의 영수증이 있을 수 있으므로 이는 일대다 관계입니다. 또한 결제 처리자는 구독 항목을 업데이트하여(액세스 패턴 3(updateSubscription)) 다음 달의 NextReminderDate 또는 NextPaymentDate를 업데이트합니다.

3단계: 액세스 패턴 4(getDueRemindersByDate) 처리

애플리케이션은 당일 결제 미리 알림을 배치로 처리합니다. 따라서 애플리케이션은 계정이 아닌 날짜라는 다른 차원에서 구독에 액세스해야 합니다. 이는 글로벌 보조 인덱스(GSI)의 좋은 사용 사례입니다. 이 단계에서는 NextReminderDate를 GSI 파티션 키로 사용하는 인덱스 GSI-1을 추가합니다. 모든 항목을 복제할 필요는 없습니다. 이 GSI는 희소 인덱스이며 영수증 항목은 복제되지 않습니다. 또한 모든 속성을 프로젝션할 필요는 없으며, 속성의 일부만 포함하면 됩니다. 아래 이미지는 GSI-1의 스키마를 보여주며 애플리케이션이 미리 알림 이메일을 보내는 데 필요한 정보를 제공합니다.

4단계: 액세스 패턴 5(getDuePaymentsByDate) 처리

애플리케이션은 미리 알림과 마찬가지로 당일 결제를 배치로 처리합니다. 이 단계에서는 GSI-2를 추가하며, NextPaymentDate를 GSI 파티션 키로 사용합니다. 모든 항목을 복제할 필요는 없습니다. 영수증 항목은 복제되지 않으므로 이 GSI는 희소 인덱스입니다. 아래 이미지는 GSI-2의 스키마를 보여줍니다.

5단계: 액세스 패턴 6(getSubscriptionsByAccount) 및 7(getReceiptsByAccount) 처리

애플리케이션은 계정 식별자(PK)를 대상으로 하며 범위 연산자를 사용하여 SK가 'SUB#'로 시작하는 모든 항목을 가져오는 쿼리를 기본 테이블에서 사용하여 계정의 모든 구독을 검색할 수 있습니다. 또한 애플리케이션은 동일한 쿼리 구조로 범위 연산자를 사용하여 SK가 'REC#'로 시작하는 모든 항목을 가져옴으로써 모든 영수증을 검색할 수 있습니다. 이를 통해 액세스 패턴 6(getSubscriptionsByAccount) 및 7(getReceiptsByAccount)을 충족할 수 있습니다. 애플리케이션은 이러한 액세스 패턴을 사용하므로 사용자는 현재 구독과 지난 6개월 동안의 과거 영수증을 볼 수 있습니다. 이 단계에서 테이블 스키마는 변경되지 않으며, 액세스 패턴 6(getSubscriptionsByAccount)의 구독 항목만 대상으로 지정하는 방법을 아래에서 확인할 수 있습니다.

모든 액세스 패턴과 스키마 설계에서 이를 처리하는 방법이 아래 표에 요약되어 있습니다.

액세스 패턴 기본 테이블/GSI/LSI Operation 파티션 키 값 정렬 키 값
createSubscription 기본 테이블 PutItem ACC#account_id SUB#<SUBID>#SKU<SKUID>
createReceipt 기본 테이블 PutItem ACC#account_id REC#<RecieptDate>#SKU<SKUID>
updateSubscription 기본 테이블 UpdateItem ACC#account_id SUB#<SUBID>#SKU<SKUID>
getDueRemindersByDate GSI-1 Query <NextReminderDate>
getDuePaymentsByDate GSI-2 Query <NextPaymentDate>
getSubscriptionsByAccount 기본 테이블 쿼리 ACC#account_id SK begins_with “SUB#”
getReceiptsByAccount 기본 테이블 쿼리 ACC#account_id SK begins_with “REC#”

반복 결제 최종 스키마

다음은 최종 스키마 설계입니다. 이 스키마 설계를 JSON 파일로 다운로드하려면 GitHub의 DynamoDB 예제를 참조하세요.

기본 테이블

GSI-1

GSI-2

이 스키마 설계와 함께 NoSQL Workbench 사용

이 최종 스키마를 DynamoDB 데이터 모델링, 데이터 시각화, 쿼리 개발 기능을 제공하는 시각적 도구인 NoSQL Workbench로 가져와서 새 프로젝트를 추가로 탐색하고 편집할 수 있습니다. 시작하려면 다음 단계를 따릅니다.

  1. NoSQL Workbench 다운로드 자세한 내용은 DynamoDB용 NoSQL Workbench 다운로드 단원을 참조하십시오.

  2. 위에 나열된 JSON 스키마 파일을 다운로드합니다. 이 파일은 이미 NoSQL Workbench 모델 형식으로 되어 있습니다.

  3. JSON 스키마 파일을 NoSQL Workbench로 가져옵니다. 자세한 내용은 기존 데이터 모델 가져오기 단원을 참조하십시오.

  4. NOSQL Workbench로 가져온 후 데이터 모델을 편집할 수 있습니다. 자세한 내용은 기존 데이터 모델 편집 단원을 참조하십시오.

  5. 데이터 모델을 시각화하거나, 샘플 데이터를 추가하거나, CSV 파일에서 샘플 데이터를 가져오려면 NoSQL Workbench의 Data Visualizer 기능을 사용하세요.