책너두 (도메인 주도 설계로 시작하는 마이크로서비스 개발) 29일차 (~246p)

요약

  • 7장. 사례연구 - 백엔드 마이크로서비스 구현에 대한 내용
    • 도서 대출 마이크로서비스 개발 (나머지 부분)
      • 내부 영역 - 도메인 모델 개발(도서 대출, 반납)
      • 내부 영역 - 서비스 개발

메모

7.1.6 내부 영역 - 도메인 모델 개발(도서 대출, 반납)

  • 도메인 모델의 비즈니스 로직은 도메인 객체에 부여된 책임으로 수행됨.
    • 즉, 도메인 객체는 해당 로직을 수행할 수 있는 책임을 가지게 됨.
  • 개발의 시작점은 Rental 클래스로, Rental 애그리거트의 최상위 엔티티에 해당함.
    • 이 클래스는 다양한 속성을 가지고 있으며, 이러한 속성들은 사용자 ID, 대출 가능 상태, 연체료, 대출 아이템, 연체 아이템, 반납 아이템 등을 포함함.
  • 사용자 일련번호(userId)는 사용자마다 유일하게 생성되는 고유 번호로, 로그인 이름을 의미하는 것이 아님.
    • 사용자(User) 마이크로서비스의 User 클래스에서 생성될 때 유일하게 생성되며, 여기에서도 동일하게 사용됨.
  • 도메인 모델에 직접 객체-관계 매핑(OR Mapping)을 하는 것에 대한 의견이 분분함.
    • 일부는 이 방식이 비즈니스 로직과 기술 영역을 혼합하므로 헥사고날 아키텍처를 위반한다고 주장하며, 다른 사람들은 스프링 데이터의 OR 매핑이 애너테이션으로 구현되므로 도메인 모델을 이해하는 데 전혀 문제가 없다고 주장함.
  • 도메인 모델 내에서 수행할 수 있는 비즈니스 로직은 도메인 객체가 갖게 해야 함.
    • Rental 클래스 내에서 수행할 수 있는 비즈니스 로직은 Rental 생성 및 사용자의 대출 가능 여부 체크 등이 있음.
  • Rental 생성 로직은 사용자 일련번호를 입력받아 Rental 객체를 생성하며, 초기 상태는 대출 가능 상태로 설정하고 연체료는 0으로 설정함.
    • 이러한 로직은 Rental 클래스 내부에 캡슐화되어 있음.
    • checkRentalAvailable 메서드는 도서 대출 가능 여부를 확인함.
      • 대출 상태(RentalStatus)가 대출 불가능(RENT_UNAVAILABLE) 이거나 연체료(latefee)가 0이 아니라면 대출이 불가능하며, 해당 경우에는 예외를 발생시킴.
      • 또한, 현재 대출 중인 책의 수가 5권 이상인 경우에도 대출이 불가능하며, 이럴 경우 예외를 발생시키고 대출 가능한 도서의 수를 알려줌.
    • rentBook 메서드는 도서를 대출하는 과정을 처리함.
      • 이 메서드는 책의 아이디와 제목을 가지고 대출 아이템(RentedItem)을 생성하고 이를 Rental에 추가함
    • returnBook 메서드는 도서를 반납하는 과정을 처리함.
      • 이 메서드는 반납할 책의 아이디를 사용하여 Rental에서 해당 RentedItem을 찾아 삭제하고, 그 정보를 사용하여 반납 아이템(ReturnedItem)을 생성한 후 Rental에 추가함.
  • RentedItem 클래스는 대출된 도서의 정보를 저장하는 엔티티임.
    • 이 클래스는 대출 아이템의 아이디, 도서 아이디, 대출 시작일, 반납 예정일, 도서 제목을 속성으로 가짐.
    • createRentedItem 메서드를 통해 새로운 RentedItem 객체를 생성하며, 대출 기간은 기본적으로 2주로 설정됨.
  • ReturnedItem 클래스는 반납된 도서의 정보를 저장하는 엔티티임.
    • 이 클래스는 반납 아이템의 아이디, 도서 아이디, 반납일, 도서 제목을 속성으로 가짐.
    • createReturnedItem 메서드를 통해 새로운 ReturnedItem 객체를 생성함.
  • RentalStatus는 대출 가능 상태를 나타내는 열거형임.
    • 대출 가능(RENT_AVAILABLE)과 대출 불가능(RENT_UNAVAILABLE)의 두 가지 상태를 가짐.

7.1.7 내부 영역 - 서비스 개발

  • 도서 대출 및 반납에 관한 핵심 비즈니스 로직은 도메인 객체인 Rental에서 처리됨.
    • 서비스 구현체는 핵심 비즈니스 로직 외에 비즈니스 흐름을 처리하며, 저장소 처리, 다른 서비스와의 연계 처리 등을 구현함.
  • 먼저 도서 대출의 경우, 다음의 과정을 거침.
    1. 사용자 아이디에 해당하는 Rental을 찾는다.
    2. 대출 가능한 상태인지 확인함.
    3. 대출이 가능하다면 Rental에 도서 정보를 전달해서 도서 대출 처리를 위임함.
    4. 대출 처리가 완료되면 Rental을 대출 리포지토리에 저장함.
  • 이 외에도, 대출로 인해 발생해야 할 다른 서비스 업무를 처리하기 위한 정보를 도서 마이크로서비스, 도서 카탈로그 마이크로서비스, 사용자 마이크로서비스에 이벤트로 전송함.
  • 대출 후 이벤트 전송의 주요 단계는 다음과 같음.
    1. 도서 마이크로서비스에 대출로 인한 도서 재고 감소를 알림.
    2. 도서 카탈로그 마이크로서비스에 도서가 대출된 상태로 검색되도록 이벤트를 발송함.
    3. 도서를 대출할 때마다 포인트를 적립할 수 있기 때문에 사용자 마이크로서비스에 포인트 적립 이벤트를 전송함.
  • 이러한 이벤트 전송은 비동기적으로 처리되며, 아웃바운드 어댑터를 통해 이루어짐.
  • 다음으로, 도서 반납의 경우, 이는 대출 로직과 유사하게 이루어짐.
    1. 사용자 아이디에 해당하는 Rental을 찾는다.
    2. Rental에 반납하고자 하는 도서 정보를 전달해서 도서 반납을 위임함.
    3. 반납이 끝난 Rental은 대출 리포지토리를 통해 저장함.
  • 마찬가지로, 도서의 상태가 변경되면 이를 도서 마이크로서비스와 도서 카탈로그 마이크로서비스에 이벤트로 전달함.
    • 이러한 이벤트는 도서의 상태를 변경하기 위해 사용됨.

댓글

Designed by JB FACTORY