요약
- 7장. 사례연구 - 백엔드 마이크로서비스 구현에 대한 내용
- 도서 대출 마이크로서비스 개발 (나머지 부분)
- 내부 영역 - 도메인 모델 개발: 도서 연체 및 연체된 도서 반납
- 내부 영역 - 도메인 모델 개발: 대출 불가 해제 처리 기능 구현
- 외부 영역 - REST 컨트롤러 개발
메모
7.1.12 내부 영역 - 도메인 모델 개발: 도서 연체 및 연체된 도서 반납
- Rental 엔티티 객체의 책임으로, 세 가지 주요 비즈니스 로직을 처리하는 메서드를 통해 수행됨.
- overdueBook(연체 처리)
- 이 메서드는 도서 일련번호로 대출아이템(RentedItem) 객체를 찾아 연체아이템 객체(OverdueItem)를 만들어 Rental에 추가하고, 기존의 대출아이템 객체는 삭제함.
- returnOverdueBook(연체아이템 반납 처리)
- 이 메서드는 도서 일련번호로 Rental에서 연체아이템(OverdueItem)을 찾아 반납아이템 객체(ReturnedItem)를 만들어 Rental에 추가하고, 기존 연체아이템은 삭제함.
- makeRentUnable(대출 불가 처리)
- 이 메서드는 도서가 연체된 경우 대출을 불가하게 처리함.
- 대출 가능 여부 상태를 대출 불가로 변경하고, Rental에 연체료 30포인트를 기록함.
서비스 흐름 처리
- 서비스 구현체에서 도서 연체 및 연체아이템 반납 처리에 대한 유스케이스 구현을 진행함.
- 도메인 모델에서 정의된 로직을 사용하여 저장소 처리 등의 기능을 구현하는 방법이 나와 있음.
- 연체 처리
- 사용자의 Rental을 조회함.
- 그런 다음 Rental 객체에 도서 연체 처리를 위임함.
- 그 후, Rental의 대출 가능 상태를 대출 불가로 설정함.
- 이를 리포지토리에 저장함.
- 연체아이템 반납 처리
- 사용자의 Rental을 조회함.
- 그 다음 Rental 엔티티 객체에 연체아이템 반납 처리를 위임함.
- 카프카를 사용하여 비동기 메시지 통신을 통해 도서 마이크로서비스와 도서 카탈로그 마이크로서비스의 도서 상태를 대출 가능으로 변경함.
- 마지막으로, 변경된 Rental을 리포지토리에 저장함.
- 이제 모든 내부 영역의 비즈니스 로직이 구현되었으므로, 외부 영역의 REST 컨트롤러에도 연체 처리와 연체아이템 반납 처리에 대한 API를 구현해 제공해야 함.
- 이 부분은 앞서 구현한 대출 처리와 매우 유사함.
7.1.13 내부 영역 - 도메인 모델 개발: 대출 불가 해제 처리 기능 구현
- 이 기능은 도서가 연체되어 사용자가 대출 불가 상태로 처리되고, Rental에 연체료 30포인트가 부과될 때 필요함.
- 사용자는 부과된 연체료를 모두 결제하면 대출 불가 처리가 해제됨.
- 먼저, Rental 엔티티는 대출 불가 해제의 책임을 가짐.
- 이 엔티티에는 대출 불가 해제를 처리하는 메서드가 구현되어 있음.
- 사용자가 연체료를 결제하면 연체료를 0으로 수정하고, 대출 가능 여부를 대출 가능으로 변경함.
- 그런 다음, 서비스 구현체에서는 도메인 모델에 정의된 메서드를 호출하여 비즈니스 로직의 구현을 완료함.
- 대출 불가 해제를 위한 메서드는 대출 서비스 구현체에 선언되어 있음.
- 이 메서드를 사용하면 사용자의 Rental을 조회한 후, Rental의 연체 해제 메서드를 호출하여 처리함.
- 그 다음에는 대출 리포지토리에 변경된 Rental을 저장함.
7.1.14 외부 영역 - REST 컨트롤러 개발
- 대출불가 해제 처리는 HTTP 리소스
/rentals/release-overdue/user/{userId}
로 정의되며, PUT 방식으로 선언되어 있음.
- 이 로직은 먼저 포인트 결제를 처리하는 동기 이벤트인 userClient를 호출한 후, 그 결과에 따라 rentalService.releaseOverdue를 호출하여 위임함.
- REST 컨트롤러에서는 클라이언트로부터 대출불가 해제 처리를 요청받아 처리하는 RentalResource를 제공함.
- 이때 연체 해제를 위해서는 사용자의 포인트가 필요하며, 연체료만큼의 포인트가 차감되어야 함.
- 그래서 먼저 사용자 정보와 연체료 정보를 담을 객체인 LateFeeDTO를 생성함.
- 그리고 Rental의 연체료를 조회하여 LatefeeDTO에 넣음.
- 그 다음, 동기 호출(Feign)로 사용자 마이크로서비스를 호출하여 해당 연체료만큼 포인트를 차감함
- 그리고 결제가 완료된 경우 대출 마이크로서비스를 호출하여 대출불가 해제를 수행함.
- 사용자 마이크로서비스에서 포인트 차감이 정확히 확인된 후에 대출불가 해제를 하기 위해 동기 호출 방식을 사용함.
- 이로써 사용자의 포인트가 연체료보다 작아 결제에 실패한 경우에 대비하여 예외 처리를 할 수 있음.
- 대출 마이크로서비스의 구조에는 이제 연체 처리, 연체아이템 반납 처리, 대출 불가 처리, 대출 불가 해제 처리가 추가되었음.
- 또한 대출 불가 해제 처리를 위해 추가한 사용자 마이크로서비스 동기 호출용 UserClient도 확인할 수 있음.
- 프로젝트의 패키지 구조는 내부 영역과 외부 영역이 섞이지 않도록 구성되었으며, 내부 영역을 구성하는 패키지로는 domain, domain.event, repository, service, service.impl이 있고, 외부 영역을 구성하는 패키지로는 adaptor, web.rest, web.rest.dto가 있음.
댓글