알림 데이터는 별도 스키마에 저장
대댓글, 좋아요, 공지사항시 사용자에게 알림이 전송됩니다. 해당 이벤트가 발생한 경우, 특정 사용자에게 알림을 전송하는 로직을 Spring Event Handler를 통해 구현했습니다.
Spring Event Handler 를 사용한 이유는 아래와 같습니다.
@Component
@RequiredArgsConstructor
public class CommentLikeNotificationEventListener {
private final CommentRepository commentRepository;
private final MemberRepository memberRepository;
private final NotificationProducer notificationProducer;
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void handleLikeNotificationEvent(final CommentLikeNotificationEvent event) {
final Member receiver = findMemberById(event.receiverId());
if (!receiver.hasEmail()) {
return;
}
final Comment comment = findCommentById(event.commentId());
final Member sender = findMemberById(event.senderId());
notificationProducer.sendCommentLikeNotification(
CommentLikeNotificationCreateRequest.of(sender, receiver, comment)
);
}
private Comment findCommentById(final Long commentId) {
return commentRepository.findById(commentId)
.orElseThrow(() -> new NotFoundCommentException(commentId));
}
private Member findMemberById(final Long memberId) {
return memberRepository.findById(memberId)
.orElseThrow(() -> NotFoundMemberException.createWhenInvalidMemberId(memberId));
}
}