From 5b25d23578ecd923737359d62ce71e4a1f5da1e2 Mon Sep 17 00:00:00 2001 From: appleg Date: Sat, 19 Mar 2022 22:37:00 +0900 Subject: [PATCH] =?UTF-8?q?[230319]=20readme=20=EC=88=98=EC=A0=95,=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 48 +++++++++++++----- img_1.png | Bin 0 -> 20560 bytes .../example/{user => cash}/domain/Cash.java | 3 +- .../application/PaymentServiceImpl.java | 2 +- .../java/com/example/user/domain/User.java | 1 + 5 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 img_1.png rename payment-command/src/main/java/com/example/{user => cash}/domain/Cash.java (93%) diff --git a/README.md b/README.md index debeab4..ea561e9 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,70 @@ # Payment System with DDD ## Project Settings + ### 1. Module Guide -본 프로젝트는 CQRS 패턴을 이용하여 구현되어 있다. -이에 따라 gradle을 이용하여 모듈이 둘로 나뉘어져 있는 디렉토리 구조를 확인할 수 있다. -서비스를 위해서는 `payment-command` 모듈과 `payment-query` 모듈을 각각 실행해야 한다. + +본 프로젝트는 CQRS 패턴을 이용하여 구현되어 있다. 이에 따라 gradle을 이용하여 모듈이 둘로 나뉘어져 있는 디렉토리 구조를 확인할 수 있다. 서비스를 위해서는 `payment-command` 모듈과 `payment-query` 모듈을 각각 실행해야 한다. #### payment-command 모듈 -CRUD 중에서 CUD 만을 담당하는 모듈이다. -본인의 테이블에 DB를 저장하며, 해당 이벤트를 Kafka에 발행하여 Query 모듈에 알려준다. -DDD의 핵심 도메인들은 이곳에 구현이 된다. + +CRUD 중에서 CUD 만을 담당하는 모듈이다. 본인의 테이블에 DB를 저장하며, 해당 이벤트를 Kafka에 발행하여 Query 모듈에 알려준다. DDD의 핵심 도메인들은 이곳에 구현이 된다. #### payment-query 모듈 -CRUD 중에서 R 만을 담당하는 모듈이다. -payment-command에서 발행한 이벤트를 Kafka로부터 consume하여 본인의 DB를 업데이트 한다. -이 모듈은 DDD의 핵심 도메인 중심이 아닌, 클라이언트에게 필요한 정보를 제공한다. 위의 command 모듈과는 다르게 조회의 효율성, 클라이언트의 호출과 관련하여 조회에 유연하게 구성해야 한다. + +CRUD 중에서 R 만을 담당하는 모듈이다. payment-command에서 발행한 이벤트를 Kafka로부터 consume하여 본인의 DB를 업데이트 한다. 이 모듈은 DDD의 핵심 도메인 중심이 아닌, 클라이언트에게 필요한 정보를 제공한다. 위의 command +모듈과는 다르게 조회의 효율성, 클라이언트의 호출과 관련하여 조회에 유연하게 구성해야 한다. ### 2. Infra Used + ``` 1. MySQL 8.0.21 for Command 2. MySQL 8.0.21 for Query 3. Kafka(Zookeeper) ``` -위의 인프라는 로컬 실행을 위해서 docker-compose를 이용하였다. -> :warning: m1 맥북의 경우 docker-compose.yaml 파일에서 platform 관련 주석을 해제하고 실행할 것 +위의 인프라는 로컬 실행을 위해서 docker-compose를 이용하였다. + +> :warning: m1 맥북의 경우 docker-compose.yaml 파일에서 platform 관련 주석을 해제하고 실행할 것 - CQRS에서 DB를 분리하는 방법은 여러가지가 있지만, 가장 보편적인(?) 방식인 물리 DB를 나누는 방식을 이용하였다. -command와 query 모듈은 각각 다른 DB를 보게된다. + command와 query 모듈은 각각 다른 DB를 보게된다. - kafka의 경우 application.yaml에 특별한 설정 없이도 kafka에 자동으로 붙게 설정이 되어 있다.(autoconfigure 덕분에) -이외의 운영을 위한 상세 설정은 생략했다. + 이외의 운영을 위한 상세 설정은 생략했다. ## Domain 소개 + 이 프로젝트에서는 '결제' 컨텍스트를 예시로하는 간단한 DDD 프로젝트다. + 1. 유저는 결제창에서 결제를 진행하여, 본인의 계정에 서비스 전용 재화(캐시)를 획득하게 된다. 게임이나 스타벅스 앱의 페이와 같이 충전과 관련된 시스템 대부분의 유형을 따르면 된다. 2. 결제는 결제 대행사를 이용해서 처리하기 때문에 결제창에서 유저가 결제를 완료하면 본 도메인에서 제공하는 api로 결제 금액 정보가 담긴 결제 완료 요청을 보낸다. 결제창은 웹의 영역이므로 해당 도메인에서 다루지 않아도 무방하다. 3. 서비스에는 특정 아이템이 있으며, 서비스 전용 재화를 이용해서 구매할 수 있다.(게임이라면 아이템, 스타벅스라면 구매한 식음료) 다만 아이템은 본 컨텍스트에서는 관리하지 않는다. +도메인은 대략 다음과 같은 구조를 따른다. + +1. User: 유저는 캐시를 소유할 수 있어 내부 엔터티로 구현. 유저 계정 관리 서비스가 따로 있다고 가정한다. 여기에서는 자체적으로 생성한다. +2. Payment: 캐시를 획득하는 행위 +3. Cash: Payment로부터 생성된 User에게 할당되는 Cash +4. Purchase: 캐시를 사용하는 행위. 캐시를 차감한다. + +![img_1.png](img_1.png) + ## Use Case + ### i. Command + - 외부 결제 시스템 결제로 인한 캐시 증가 + +``` +1. 유저 캐시 추가 및 잔액 업데이트 +2. 결제 기록 추가 +3. 해당 이벤트를 consumer로 publish +``` + - 각종 이유(구매 등)에 대한 캐시 사용 ### ii. Query + - 유저의 결제 내역 단건/기간별 조회 - 유저의 사용 내역 단건/기간별 조회 diff --git a/img_1.png b/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e94fa3e887768ad7d020147729d923d64a9c9f9d GIT binary patch literal 20560 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 literal 0 HcmV?d00001 diff --git a/payment-command/src/main/java/com/example/user/domain/Cash.java b/payment-command/src/main/java/com/example/cash/domain/Cash.java similarity index 93% rename from payment-command/src/main/java/com/example/user/domain/Cash.java rename to payment-command/src/main/java/com/example/cash/domain/Cash.java index 34bb013..71fa195 100644 --- a/payment-command/src/main/java/com/example/user/domain/Cash.java +++ b/payment-command/src/main/java/com/example/cash/domain/Cash.java @@ -1,5 +1,6 @@ -package com.example.user.domain; +package com.example.cash.domain; +import com.example.user.domain.User; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; diff --git a/payment-command/src/main/java/com/example/payment/application/PaymentServiceImpl.java b/payment-command/src/main/java/com/example/payment/application/PaymentServiceImpl.java index 2129ecb..891f39e 100644 --- a/payment-command/src/main/java/com/example/payment/application/PaymentServiceImpl.java +++ b/payment-command/src/main/java/com/example/payment/application/PaymentServiceImpl.java @@ -1,6 +1,6 @@ package com.example.payment.application; -import com.example.user.domain.Cash; +import com.example.cash.domain.Cash; import com.example.event.EventPublisher; import com.example.payment.domain.Payment; import com.example.payment.domain.PaymentRepository; diff --git a/payment-command/src/main/java/com/example/user/domain/User.java b/payment-command/src/main/java/com/example/user/domain/User.java index 143b51f..bb71d97 100644 --- a/payment-command/src/main/java/com/example/user/domain/User.java +++ b/payment-command/src/main/java/com/example/user/domain/User.java @@ -1,5 +1,6 @@ package com.example.user.domain; +import com.example.cash.domain.Cash; import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.Id;