결제 시스템이 결제를 끝내면 "결제 완료" 소식을 보내요. 우리 포인트 서비스는 그 소식을 받아서, 그 주문에 해당하는 포인트만큼 사용자의 잔액을 깎아야 해요. PointConsumer.handlePaymentCompleted(event) 를 완성하세요. event 에는 orderId, userId, points 가 들어 있어요. 받은 points 만큼 그 사용자의 잔액에서 빼면 돼요. Note: 결제 시스템은 소식을 "적어도 한 번"은 보내준다고 약속해요. 네트워크 사정에 따라 같은 소식이 늦게 한 번 더 도착할 수도 있어요.
NestJS 로 결제가 끝났다는 소식을 받아 사용자 포인트를 차감하는 컨슈머를 만드는 문제입니다. 결제 시스템은 소식을 적어도 한 번 보내며, 네트워크 사정에 따라 같은 소식이 다시 도착할 수 있는 환경을 가정합니다. 결제가 끝났다는 소식을 받는 컨슈머의 처리를 완성하고, 잔액은 인메모리 저장소를 유일한 진실의 원천으로 씁니다.
이 문제는 "같은 소식이 다시 와도 결과가 한 번만 반영되어야 하는" 처리를 다룹니다. 포인트·잔액·재고처럼 한 번 일어난 일을 한 번만 반영해야 하는 자원에서는, 소식을 한 번만 받을 때는 멀쩡해 보여도 같은 소식이 재전송되는 순간이 진짜 시험대가 됩니다. 이런 코드를 검증할 때는 한 번 처리만 보지 말고, 그 소식을 다시 한 번 넣어본 뒤 결과가 한 번만 반영됐는지 확인하는 습관이 중요합니다.