📖
Aaron's TECH BOOK
  • Intro
    • About me
  • Lecture
    • Kubernetes
      • Begin Kubernetes
    • Kafka
      • Begin Kafka
    • Kotlin
      • TDD, Clean Code Preview
      • woowa Kotlin
    • Java
      • Multithread Concurrency
      • The Java
    • Toby
      • Toby Spring 6
      • Toby Spring Boot
    • MSA
      • 01.Micro Service
      • 02.DDD 설계
      • 03.DDD 구현
      • 04.EDA 구현
    • Spring Boot
    • Spring Batch
    • Spring Core Advanced
    • Spring DB Part II
    • Spring DB Part I
    • JPA API and Performance Optimization
    • JPA Web Application
    • JPA Programming Basic
    • Spring MVC Part 2
      • 01.Thymeleaf
      • 02.ETC
      • 03.Validation
      • 04.Login
      • 05.Exception
    • Spring MVC Part 1
      • 01.Servlet
      • 02.MVC
    • Http
      • 01.Basic
      • 02.Method
      • 03.Header
    • Spring Core
    • Study
      • Concurrency issues
      • First Come First Served
      • Performance Test
      • TDD
      • IntelliJ
  • Book
    • Kafka Streams in Action
      • 01.카프카 스트림즈
      • 02.카프카 스트림즈 개발
      • 03.카프카 스트림즈 관리
    • Effective Kotlin
      • 01.좋은 코드
      • 02.코드 설계
      • 03.효율성
    • 이벤트 소싱과 MSA
      • 01.도메인 주도 설계
      • 02.객체지향 설계 원칙
      • 03-04.이벤트 소싱
      • 05.마이크로서비스 협업
      • 06.결과적 일관성
      • 07.CQRS
      • 08.UI
      • 09.클라우드 환경
    • 몽고DB 완벽 가이드
      • I. 몽고DB 시작
      • II. 몽고DB 개발
    • Kotlin Cookbook
      • 코틀린 기초
      • 코틀린 기능
      • ETC
    • Kotlin in Action
      • 함수/클래스/객체/인터페이스
      • 람다와 타입
      • 오버로딩과 고차 함수
      • 제네릭스, 애노테이션, 리플렉션
    • Kent Beck Tidy First?
    • 대규모 시스템 설계 기초
      • 01.사용자 수에 따른 규모 확장성
      • 02.개략적인 규모 추정
      • 03.시스템 설계 공략법
      • 04.처리율 제한 장치 설계
      • 05.안정 해시 설계
      • 06.키-값 저장소 설계
      • 07.유일 ID 생성기 설계
      • 08.URL 단축기 설계
      • 09.웹 크롤러 설계
      • 10.알림 시스템 설계
      • 11.뉴스 피드 시스템 설계
      • 12.채팅 시스템 설계
      • 13.검색어 자동완성 시스템
      • 14.유튜브 설계
      • 15.구글 드라이브 설계
      • 16.배움은 계속된다
    • 실용주의 프로그래머📖
    • GoF Design Patterns
    • 도메인 주도 개발 시작하기
      • 01.도메인 모델 시작하기
      • 02.아키텍처 개요
      • 03.애그리거트
      • 04.리포지터리와 모델 구현
      • 05.Spring Data JPA를 이용한 조회 기능
      • 06.응용 서비스와 표현 영역
      • 07.도메인 서비스
      • 08.애그리거트 트랜잭션 관리
      • 09.도메인 모델과 바운디드 컨텍스트
      • 10.이벤트
      • 11.CQRS
    • Effective Java 3/E
      • 객체, 공통 메서드
      • 클래스, 인터페이스, 제네릭
    • 소프트웨어 장인
    • 함께 자라기
    • Modern Java In Action
      • 01.기초
      • 02.함수형 데이터 처리
      • 03.스트림과 람다를 이용한 효과적 프로그래밍
      • 04.매일 자바와 함께
    • Refactoring
      • 01.리펙터링 첫 번째 예시
      • 02.리펙터링 원칙
      • 03.코드에서 나는 악취
      • 06.기본적인 리펙터링
      • 07.캡슐화
      • 08.기능 이동
      • 09.데이터 조직화
      • 10.조건부 로직 간소화
      • 11.API 리팩터링
      • 12.상속 다루기
    • 객체지향의 사실과 오해
      • 01.협력하는 객체들의 공동체
      • 02.이상한 나라의 객체
      • 03.타입과 추상화
      • 04.역할, 책임, 협력
      • 05.책임과 메시지
      • 06.객체 지도
      • 07.함께 모으기
      • 부록.추상화 기법
    • Clean Code
    • 자바 ORM 표준 JPA 프로그래밍
Powered by GitBook
On this page
  • EDA 기반 Microservice 구현
  • 아키텍처 구성도
  • 대여
  • 도서
  • 사용자
  • Best 서적
  1. Lecture
  2. MSA

03.DDD 구현

EDA 기반 Microservice 구현

아키텍처 구성도

회원관리
- 회원을 등록한다.
- 특정 회원은 관리자의 역할을 부여 받는다.
- 회원은 시스템 사용을 위해 로그인하거나 로그아웃 할 수 있다.
도서 관리
- 관리자는 도서분류정보를 등록/수정/삭제한다.
- 사내 도서관은 판교,정자에 위치한다.
- 도서는 도서공급사가 공급하거나 기부될 수 있다.
- 입고된 도서는 사서에 의해 분류된다.
- 사서는 분류한 도서의 상태(초기값: 대여 가능)를 설정하여 대여 가능토록 한다.
- 대여/반납에 의해 도서의 상태(대여 가능,대여 중) 조정된다.
도서 대여 및 반납
- 사용자는 도서를 검색할 수 있다.
- 사용자는 베스트 대여 목록을 조회할 수 있다.
- 사용자는 대여가능한 도서를 대여 할 수 있다.(대여 조건은 2주, 1인당 5권 이내이다.)
- 반납되지 않고 대여 기간이 지난 도서는 연체된다. 연체 시 연체 포인트가 1일 10포인트 부여된다.
- 1권이라도 연체되면 사용자는 대여 불가 상태가 된다.
- 사용자는 대여한 도서를 반납할 수 있다.
- 반납시 연체료가 계산된다.
- 사용자는 대여한 도서 이력을 볼 수 있다.
- 사용자가 도서를 대여하거나 반납 시 사용자에게 10 포인트가 적립된다.
- 연체가 있으면 대여할 수 없다.
- 대여된 도서는 모두 반납이 되어야지 대여 정지를 해제할 수 있다.
- 포인트를 활용하여 대여 정지를 해제할 수 있다.
- 포인트는 연체료를 감면할 수 있다.
- 연체포인트를 0으로 만들면 대출 가능 상태가 된다.

.

이벤트 스토밍 결과

.

서비스 매핑도

.

아키텍처 구성도

.

전술적 설계(구현 전략)

서브시스템 유형

  • 핵심(Core): 회사가 경쟁업체와 다르게 수행하고 있는 시스템

    • 사내에서 직접 구현

    • 핵심 숙련 인재 할당

    • 가장 진보된 엔지니어링 기술 적용

  • 일반(Generic): 모든 회사가 같은 방식으로 수행하는 비지니스 활동

    • 이미 만들어진 제품(오픈 소스 솔루션)

  • 지원(Supporting): 회사 비지니스 지원 활동

    • 사내 구현 X

    • 고급 엔지니어링 기술 불필요

MSA 내부 아키텍처 스타일

  • 헥사고날 아키텍처, 클린 아키텍처

  • 레이어드 아키텍처

  • CQRS

비지니스 로직 구현 스타일

  • Transaction Script: 간단한 비지니스 로직구현, 절차지향, 트랜젝션간 비즈니스 로직 중복, 핵심 도메인 X

  • Active Record: 자료 holding 전용 객체 사용(자료구조 외에도 CRUD 구현), Anemic Domain Model(빈약한 도메인 모델), 지원/일반 도메인

  • Domain Model: 비지니스 로직을 POJO로 구성(인프라/기술적 관심사 분리), 응용서비스 업무 흐름 제어, 대부분의 비즈니스 로직은 도메인 모델에 위임, 핵심 도메인

핵심 도메인 (대여)

  • Type1: 헥사고날 아키텍처, Domain Model 중심, Spring MVC, Spring DATA JPA, RDB

일반 도메인(회원,도서)

  • Type1: 헥사고날 아키텍처, Domain Model 중심, Spring MVC, Spring DATA JPA, RDB

지원 도메인(Best도서)

  • Type2: 레이어드 아키텍처 + CQRS, Domain Model, Spring MVC, Spring DATA, MogoDB, NoSQL

.

Hexagonal MSA

헥사고날 아키텍처는 도메인, 어플리케이션, 프레임워크 헥사곤으로 구성

Domain Hexagon

  • aggregate, entity, VO, Enum, Domain Event 로 구성

  • 비지니스 로직 구현

Application Hexagon

  • 유스케이스(I/F), 입력 포트, 출력포트(I/F) 로 구성

  • 트랜잭션 처리, 흐름 제어, 유스케이스 구현

  • 유스케이스

    • 유스케이스의 입출력 매개 변수인 DTO는 애플리케이션 헥사곤 내에서 활동(framework.web 패키지에 위치)

    • DTO는 유스케이스마다 달라야 한다. (재사용을 위해 하나의 큰 DTO를 만들어 사용 X)

    • 모델을 DTO로 변경하여 사용

Framework Hexagon

  • 입력/출력 어댑터 로 구성

  • 데이터 입/출력, 메시지 생산(발행)/소비(가입)

  • API 제공

대여

com
 └── msa
    └── rental
        ├── application
        ├── inputport
        │   │   ├── ClearOverdueItemInputPort.java
        │   │   ├── CompensationInputPort.java
        │   │   ├── CreateRentalCardInputPort.java
        │   │   ├── InquiryInputPort.java
        │   │   ├── OverDueItemInputPort.java
        │   │   ├── RentItemInputPort.java
        │   │   └── ReturnItemInputPort.java
        │   ├── outputport
        │   │   ├── EventOutputPort.java
        │   │   └── RentalCardOutputPort.java
        │   └── usecase
        │       ├── ClearOverdueItemUseCase.java
        │       ├── CompensationUseCase.java
        │       ├── CreateRentalCardUseCase.java
        │       ├── InquiryUsecase.java
        │       ├── OverdueItemUserCase.java
        │       ├── RentItemUseCase.java
        │       └── ReturnItemUserCase.java
        ├── config
        │   ├── KafkaConfig.java
        │   └── SwaggerConfig.java
        ├── domain
        │   └── model
        │      ├── event
        │      │   ├── EventResult.java
        │      │   ├── EventType.java
        │      │   ├── ItemRented.java
        │      │   ├── ItemReturned.java
        │      │   ├── OverdueCleared.java
        │      │   └── PointUseCommand.java
        │      ├── vo
        │      │   ├── IDName.java
        │      │   ├── Item.java
        │      │   ├── LateFee.java
        │      │   ├── RentalCardNo.java
        │      │   ├── RentStatus.java
        │      │   └── ReturnItem.java
        │      ├── RentalCard.java
        │      └── RentalItem.java
        └── framework
            ├── jpaadapter
            │   ├── RentalCardJpaAdapter.java
            │   └── RentalCardRepository.java
            ├── kafkaadapter
            │   ├── RentalEventConsumers.java
            │   └── RentalKafkaProducer.java
            └── web
                ├── jpaadapter
                │   ├── ClearOverdueInfoDTO.java
                │   ├── RentalCardOutputDTO.java
                │   ├── RentalResultOutputDTO.java
                │   ├── RentItemOutputDTO.java
                │   ├── ReturnItemOutputDTO.java
                │   ├── UserInputDTO.java
                │   └── UserItemInputDTO.java
                └── RentalController.java

도서

사용자

Best 서적

com
 └── msa
    └── BestBookMS
        ├── BestBookMsApplication.java
        ├── config
        │   ├── KafkaConfig.java
        │   └── SwaggerConfig.java
        ├── domain
        │   ├── BestBookService.java
        │   └── model
        │       ├── BestBook.java
        │       ├── evnet
        │       │   ├── IDName.java
        │       │   └── ItemRented.java
        │       └── vo
        │           └── Item.java
        ├── persistence
        │   └── BestBookRepository.java
        └── web
            ├── BestBookController.java
            └── BestBookEventConsumers.java 

Last updated 1 year ago

RentMS Repository
BookMS Repository
MemberMS Repository
BestBookMS Repository