

# DynamoDB에서 반복 결제 스키마 설계
<a name="data-modeling-schema-recurring-payments"></a>

## 반복 결제 비즈니스 사용 사례
<a name="data-modeling-schema-recurring-payments-use-case"></a>

이 사용 사례에서는 DynamoDB를 사용하여 반복 결제 시스템을 구현하는 방법을 설명합니다. 데이터 모델에는 *계정*, *구독*, *영수증*과 같은 엔터티가 있습니다. 사용 사례의 구체적인 내용은 다음과 같습니다.
+ 각 *계정*에는 여러 *구독*이 있을 수 있습니다.
+ *구독*에는 다음 결제를 처리해야 하는 `NextPaymentDate`가 있고 고객에게 이메일 미리 알림이 전송되는 `NextReminderDate`가 있습니다
+ 결제가 처리될 때 저장되고 업데이트되는 *구독* 항목이 있습니다(평균 항목 크기는 약 1KB이며 처리량은 *계정* 및 *구독* 수에 따라 다름).
+ 또한 *결제* 처리자는 테이블에 저장되고 [TTL](TTL.md) 속성을 사용하여 일정 기간 후에 만료되도록 설정된 프로세스의 일부로 *영수증*을 생성합니다

## 반복 결제 엔터티 관계 다이어그램
<a name="data-modeling-schema-recurring-payments-erd"></a>

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

![\[계정, 구독 및 영수증 엔터티를 보여주는 반복 결제 시스템 ERD.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/DataModeling/ReoccurringPayments-1-ERD.png)


## 반복 결제 시스템 액세스 패턴
<a name="data-modeling-schema-recurring-payments-access-patterns"></a>

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

1. `createSubscription`

1. `createReceipt`

1. `updateSubscription`

1. `getDueRemindersByDate`

1. `getDuePaymentsByDate`

1. `getSubscriptionsByAccount`

1. `getReceiptsByAccount`

## 반복 결제 스키마 설계
<a name="data-modeling-schema-recurring-payments-design-evolution"></a>

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

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

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

![\[계정의 구독 세부 정보를 보여주는 테이블 설계.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/DataModeling/ReoccurringPayments-2-Step1.png)


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

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

![\[다음 구독 알림 날짜를 보여주는 영수증 세부 정보 및 구독 항목 업데이트.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/DataModeling/ReoccurringPayments-3-Step2.png)


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

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

![\[이메일 주소와 같은 세부 정보가 포함된 GSI-1 스키마. 애플리케이션에서 알림 이메일을 보내야 합니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/DataModeling/ReoccurringPayments-4-Step3.png)


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

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

![\[결제를 처리하기 위한 세부 정보가 포함된 GSI-2 스키마. NextPaymentDate는 GSI-2의 파티션 키입니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/DataModeling/ReoccurringPayments-5-Step4.png)


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

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

![\[기본 테이블에 대한 쿼리 작업 결과. 특정 계정의 구독을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/DataModeling/ReoccurringPayments-6-Step5.png)


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


| 액세스 패턴 | 기본 테이블/GSI/LSI | 연산 | 파티션 키 값 | 정렬 키 값 | 
| --- | --- | --- | --- | --- | 
| createSubscription | 기본 테이블 | PutItem | ACC\$1account\$1id | SUB\$1<SUBID>\$1SKU<SKUID> | 
| createReceipt | 기본 테이블 | PutItem | ACC\$1account\$1id | REC\$1<RecieptDate>\$1SKU<SKUID> | 
| updateSubscription | 기본 테이블 | UpdateItem | ACC\$1account\$1id | SUB\$1<SUBID>\$1SKU<SKUID> | 
| getDueRemindersByDate | GSI-1 | 쿼리 | <NextReminderDate> |  | 
| getDuePaymentsByDate | GSI-2 | 쿼리 | <NextPaymentDate> |  | 
| getSubscriptionsByAccount | 기본 테이블 | 쿼리 | ACC\$1account\$1id | SK begins\$1with “SUB\$1” | 
| getReceiptsByAccount | 기본 테이블 | 쿼리 | ACC\$1account\$1id | SK begins\$1with “REC\$1” | 

## 반복 결제 최종 스키마
<a name="data-modeling-schema-recurring-payments-final-schema"></a>

다음은 최종 스키마 설계입니다. 이 스키마 설계를 JSON 파일로 다운로드하려면 GitHub의 [DynamoDB 예제](https://github.com/aws-samples/aws-dynamodb-examples/blob/master/schema_design/SchemaExamples/ReocurringPayments/ReocurringPaymentsSchema.json)를 참조하세요.

**기본 테이블**

![\[계정 정보와 구독 및 영수증 세부 정보를 보여주는 기본 테이블 설계.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/DataModeling/ReoccurringPayments-7-Base.png)


**GSI-1**

![\[이메일 주소, NextPaymentDate와 같은 구독 세부 정보가 포함된 GSI-1 스키마.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/DataModeling/ReoccurringPayments-8-GSI1.png)


**GSI-2**

![\[PaymentAmount 및 PaymentDay와 같은 결제 세부 정보가 포함된 GSI-2 스키마.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/DataModeling/ReoccurringPayments-9-GSI2.png)


## 이 스키마 설계와 함께 NoSQL Workbench 사용
<a name="data-modeling-schema-recurring-payments-nosql"></a>

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

1. NoSQL Workbench 다운로드 자세한 내용은 [DynamoDB용 NoSQL Workbench 다운로드](workbench.settingup.md) 섹션을 참조하세요.

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

1. JSON 스키마 파일을 NoSQL Workbench로 가져옵니다. 자세한 내용은 [기존 데이터 모델 가져오기](workbench.Modeler.ImportExisting.md) 섹션을 참조하세요.

1. NOSQL Workbench로 가져온 후 데이터 모델을 편집할 수 있습니다. 자세한 내용은 [기존 데이터 모델 편집](workbench.Modeler.Edit.md) 섹션을 참조하세요.