요약
- 7장. 사례연구 - 백엔드 마이크로서비스 구현에 대한 내용
- 사용자 마이크로서비스 개발 (나머지 부분)
- 외부 영역 - REST 컨트롤러 개발
- 외부 영역 - 아웃바운드 어댑터 개발
- 사용자 마이크로서비스 - 포인트 관리 기능 구현
- 기본 포인트 부여 기능 구현
- 포인트 적립/결제 기능 구현
메모
7.2.8 외부 영역 - REST 컨트롤러 개발
- 두 가지 종류의 컨트롤러가 주로 사용됨
- 개인정보관리(AccountResource) 컨트롤러
- 회원 가입, 사용자 개인 정보 수정, 사용자 본인의 비밀번호 찾기 등을 처리함.
- 관리자용 회원정보관리(UserResource) 컨트롤러
- 관리자가 사용자 정보를 생성, 수정, 삭제하는 등의 작업을 처리함.
- UserResource에서는 요청을 받을 때 사용자가 관리자(ADMIN)인지 확인하고 요청을 처리함.
- 사용자 정보 수정을 위한 API는 PUT 방식을 사용하며,
@PreAuthorize
어노테이션을 통해 요청한 사용자의 권한이 ADMIN인 경우에만 요청을 처리함.
- 또한 수정하려는 이메일과 로그인 계정이 이미 사용 중인지 검증한 후, 유효하다면
userService.updateUser
메서드를 호출하여 사용자 정보를 수정함.
7.2.9 외부 영역 - 아웃바운드 어댑터 개발
- 도서 대출 시스템에서는 각 회원마다 Rental이라는 개체를 가지도록 설계되었음.
- 따라서 새로운 사용자가 생성될 때마다 대출 서비스에 Rental을 생성하도록 비동기 호출이 필요함.
- 회원가입이나 관리자에 의한 사용자 등록이 발생하면,
userService.registerUser
와 userService.createUser
메서드가 호출되며, 이 메서드들은 도메인 이벤트를 발행하여 대출 마이크로서비스에서 Rental을 생성하도록 함.
- 서비스 구현체는 새로운 사용자를 생성하고 저장한 다음, 아웃바운드 어댑터 인터페이스인
gatewayProducer.createRental
을 호출하여 대출 마이크로서비스에서 Rental을 생성하도록 비동기 메시지 이벤트를 전송함.
- 아웃바운드 어댑터, 즉
GatewayProducer.createRental
메서드는 사용자의 ID 정보를 받아 UserIdCreated라는 도메인 이벤트를 생성하고, 이를 대출 서비스가 구독 중인 Topic에 카프카 메시지로 전송함.
- 이렇게 전송된 메시지는 대출 서비스의 인바운드 어댑터를 통해 수신되어 Rental 엔티티를 생성함.
7.3 사용자 마이크로서비스 - 포인트 관리 기능 구현
- 최초 기본 포인트 부여와 포인트 적립/결제 두 기능을 구현
- 포인트 관리 기능 중 첫 번째 기능인 최초 기본 포인트 부여는 사용자 서비스 구현체에서 구현됨.
- 두 번째 기능인 포인트 적립 및 결제는 사용자(User) 도메인 모델 내부에서 처리하도록 설계됨.
7.3.1 기본 포인트 부여 기능 구현
- 사용자가 처음 생성될 때 기본 포인트 1000점을 부여하는 것으로,
UserService
클래스에서 구현됨.
- 사용자를 생성하는
UserService.registerUser
와 UserService.createUser
메소드에서 setPoint(1000);
을 호출하여 포인트를 부여함.
- 현재 구현된 방식은 기본 포인트 부여 기능을 서비스 구현체에서 처리하는 것임.
- 하지만, 사용자 객체 생성과 기본 포인트 부여 책임을 사용자 도메인 모델에 부여하는 것이 더 적절해 보인다는 지적이 있음.
- 따라서 이 부분은 나중에 리팩터링이 필요함.
7.3.2 포인트 적립/결제 기능 구현
- 사용자 도메인 모델인
User
엔티티 클래스 내부에 메서드로 구현되었음.
savePoints
메서드
- 이 메서드는 포인트를 적립하는 기능을 수행함.
- 적립할 포인트를 받아 현재 사용자가 보유하고 있는 포인트에 합산한 후 사용자 정보를 반환함.
usePoints
메서드
- 이 메서드는 포인트를 결제하는 기능을 수행함.
- 보유 중인 포인트가 결제 요청된 포인트보다 많거나 같은 경우에만 결제를 처리함.
- 만약 보유 포인트가 결제 요청된 포인트보다 적다면,
UsePointsUnavailableException
예외를 던져 결제를 거부함.
댓글