기록이 힘이다.

6. 사례 연구 - 마이크로서비스 도출과 아키텍처 구성 본문

IT서적/도메인 주도 설계로 시작하는 마이크로서비스 개발

6. 사례 연구 - 마이크로서비스 도출과 아키텍처 구성

dev22 2023. 8. 31. 17:49
728x90

도서 대출 시스템

1. 요구사항 정의

2. 이벤트 스토밍을 통한 마이크로서비스 도출

3. 외부 아키텍처 정의

4. 내부 아키텍처 정의

5. JHipster를 이용한 아키텍처 구성

 

1. 요구사항 정의 

사용자 관리 및 로그인

  • 사용자를 등록한다. 등록 시 사내 HR(Human Resource) 시스템에 의해 검증된다. 
  • 특정 사용자는 사서의 역할을 부여받는다.
  • 사용자는 시스템 사용을 위해 로그인하거나 로그아웃할 수 있다. 

도서 관리

  • 사서는 도서분류정보를 등록/수정/삭제한다. 
  • 사서는 입고된 도서를 분류하고 등록/수정/삭제한다.
  • 일반적인 도서는 도서공급사에 의해 공급된다.
  • 각 도서는 대출할 수 있는 수량(재고)이 있으며, 대출/반납에 의해 재고가 조정된다. 

도서 대출 및 반납

  • 사용자는 도서를 검색한다.
  • 사용자는 베스트 대출 목록을 조회할 수 있다.
  • 사용자는 재고가 있는 도서를 대출한다(대출 조건은 2주, 1인당 5권 이내다).
  • 반납되지 않고 대출 기간이 지난 도서는 연체된다.
  • 1권이라도 연체되면 사용자는 대출 불가 상태가 된다.
  • 사용자는 대출한 도서를 반납할 수 있다.
  • 대출한 모든 도서 이력은 기록된다.
  • 대출하거나 반납 시 사용자에게 10포인트가 부여된다. 
  • 연체가 있는 사용자는 대출할 수 없다(대출불가상태).
  • 포인트는 연체 1일당 10포인트씩 연체일을 감면하는 데 사용된다.
  • 연체일을 0으로 만듦으로써 대출가능상태가 된다.

배송

  • 원격지의 사용자는 배송을 요청할 수 있다.
  • 배송의 상태는 접수/준비/발송/배송완료다. 
  • 배송은 외부 배송업체를 이용한다. 

이메일

  • 주요 업무 변화 시 이메일로 사용자에게 통보한다. 

 

2. 이벤트 스토밍을 통한 마이크로서비스 도출

이벤트 스토밍 워크숍

[회원정보 등록됨] 이벤트가 발생하면 레거시 스템인 [HR 시스템]과 연계되어 [직원여부체크] 정책에서 사원인지 검증하고, 그에 따라 [회원등록 승인됨] 이벤트가 발생하거나 [회원등록 거부됨] 이벤트가 발생한다. 

다음으로 [회원정보 수정됨] 이벤트와 [회원 탈퇴됨] 이벤트가 발생되고 도서 대출, 반납 처리에 영향을 받는 회원별 [포인트 적립], [포인트 감소] 이벤트도 발생한다. 회원이 로그인하는 과정을 통해 [로그인됨], [로그아웃됨] 이벤트가 발생한다. 

이벤트에 매핑되는 커맨드도 도출돼 있고 커맨드/이벤트에 영향을 받는 데이터 요소인 [회원], [포인트], [로그인]이라는 애그리거트도 식별했다. 또한 다른 문제 영역의 커멘드를 트리거할 수 있는 정책들도 도출됐는데, 바로 회원정보가 변경될 때 이메일을 전송하는 정책이다. 

 

업무 흐름에 따라 다른 이벤트의 사전 이벤트가 되는 [운영자 등록됨], [도서 분류 등록됨], [도서관 정보 등록됨], [도서제공업체 등록됨] 이벤트가 발생하고, 그 뒤로 [도서 입고됨], [도서 분류됨], [도서 정보 등록됨]의 순서대로 이벤트가 발생한다. 

대출 서브시스템에서 대출/반납이 진행됨에 따라 영향을 받는 [도서 재고 변경됨]이벤트도 발생할 것이며, 도서 생명주기에 따라 [도서 정보 폐기됨] 이벤트가 마지막에 발생한다. 

도서를 제공하는 외부 연계시스템도 [도서제공시스템]이라는 외부 시스템으로 식별됐고, 관련 커맨드, 액터, 애그리거트도 도출됐다. 

액터를 살펴보면 회원, SYS, 타이머, 연체자 등 역할별로 다양한 액터가 도출됐는데, 액터의 역할을 세밀하게 구분함으로써 커맨드와 이벤트가 좀 더 구체화되거나 새로 식별될 수 있다.

관계를 통해 이후에 식별될 바운디드 컨텍스트 간의 연관관계를 정의할 수 있다. 도출된 정책들을 살펴보면 [이메일 발송], [포인트 적립], [배송 접수], [대출 정지] 등이 식별되어 이벤트 스티커 밑에 붙여진 것을 볼 수 있다. 

애그리거트로는 [대출도서집계정보], [도서검색정보], [대출], [배송요청정보], [반납], [연체], [대출가능여부] 등이 도출됐다. 

바운디드 컨텍스트 식별

사용자 관리 서브도메인 -> 로그인 / 회원

게시판, 도서 관리 , 배송은 각각 바운디드 컨텍스트로 식별

대출, 반납 서브도메인 -> 대출, 도서, 카탈로그(도서 정보 조회 및 검색 역할 전담)

 

컨텍스트 다이어그램

실선은 동기, 점선은 비동기 

 

이벤트 스토밍 결과를 헥사고날 아키텍처로 표현하기 

외부 아키텍처 정의 

내부 아키텍처 정의

패키지 구조 및 명명 규칙

내부 아키텍처 구조는 패키지 구조로 표현될 수 있다. 

 

JHipster를 활용한 아키텍처 구성

로컬에서 구성해본다. 

JHipster란 웹 애플리케이션과 마이크로서비스 아키텍처를 빠르게 적용, 개발, 배포할 수 있도록 도와주는 오픈소스 개발 플랫폼이다. 지원영역 다음과 같다. 

프런트엔드 : Angular, React, Vue.js

백엔드: Spring Boot, Micronaut, Quarkus, Node.js, .NET

배포 영역 지원: Docker and Cubernetes for AWS, Azure, Cloud Foundry, Google Cloud Platform, Heroku, OpenShift

 

JHipster의 목적

완전하고 현대적인 웹 애플리케이션과 마이크로서비스 아키텍처를 생성하는 데 있으며 , 다음과 같은 항목들을 통합하는 것이 목표

-광범위한 테스트를 커버할 수 있는 우수한 성능의 강력한 서버 스택

-세련되고 현대적인 모바일 친화적 UI를 위한 앵귤러, 리액트, 뷰 + 부트스트랩을 갖춘 CSS

-웹팩 및 메이븐 또는 그래들을 사용해 애플리케이션을 빌드하는 강력한 워크플로

-클라우드에 빠르게 배포할 수 있는 코드 기반 인프라

 

JHipster로 마이크로서비스 애플리케이션을 개발하는 순서

1. 게이트웨이 생성

2. 레지스트리 생성 

3. 마이크로서비스 생성

4. 생성한 마이크로서비스에 엔티티 생성

5. 생성된 엔티티를 게이트웨이가 인식할 수 있도록 게이트웨이에 등록

 

먼저 book, rental, user라는 3개의 마이크로서비스를 생성하고 게이트웨이에 등록해 간단한 CRUD 기능이 동작하게 해보자.

 

게이트웨이 만들기