상황: 댓글을 삭제할 때 현재 삭제를 요청하는 사용자와 댓글 작성자가 동일한 인물인지 검증해야 함.
기존 코드
1. 존재하는 댓글인지 확인하기 위해 commentReposiotiry에서 댓글id로 찾고, 존재하지 않으면 익셉션을 던졌다.
2. 작성자id를 찾기 위해 다시 commentRepository에서 댓글id로 댓글을 찾고, 작성자id를 가져왔다.
@Transactional
public ResponseDto<?> deleteComment(Long commentId, UserDetailsImpl userDetails) {
commentRepository.findById(commentId).orElseThrow(
() -> new EntityNotFoundException(ErrorCode.COMMENT_NOT_FOUND));
Long writerId = commentRepository.findById(commentId).get().getUser().getUserId();
Long userId = tokenProvider.getUserFromAuthentication().getUserId();
if (Objects.equals(writerId, userId)) {
commentRepository.deleteById(commentId);
} else {
throw new InvalidValueException(ErrorCode.COMMENT_UNAUTHORIZED);
}
return ResponseDto.success("댓글 삭제가 완료되었습니다.");
}
변경 후 코드
기존 코드 1, 2번을 .map 을 통해 한 번에 해결!
@Transactional
public ResponseDto<?> deleteComment(Long commentId, UserDetailsImpl userDetails) {
Long writerId = commentRepository.findById(commentId)
.map(comment -> comment.getUser().getUserId())
.orElseThrow(
() -> new EntityNotFoundException(ErrorCode.COMMENT_NOT_FOUND));
Long userId = tokenProvider.getUserFromAuthentication().getUserId();
if (Objects.equals(writerId, userId)) {
commentRepository.deleteById(commentId);
} else {
throw new InvalidValueException(ErrorCode.COMMENT_UNAUTHORIZED);
}
return ResponseDto.success("댓글 삭제가 완료되었습니다.");
}