카테고리 없음
8월 10일 목요일 TIL 회고록
tft4rollz
2023. 8. 11. 01:06
댓글 좋아요 API 개발
먼저 댓글 좋아요 (CommentLike) 엔티티를 만들었다.
유저 한명이 여러개의 좋아요를 누를 수 있으니 ManyToOne, 하나의 댓글에 여러개의 좋아요를 누를 수 있으니 ManyToOne 어노테이션을 사용했다.
CommentLike.class
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class CommentLike {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "COMMENT_LIKE_ID")
private Long Id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COMMENT_ID")
private Comment comment;
public CommentLike(User user, Comment comment) {
this.user = user;
this.comment = comment;
}
}
그 다음 컨트롤러에 좋아요 추가, 좋아요 취소 기능을 만들었다.
RequestParam 어노테이션 대신에 PathVariable 어노테이션을 사용했다.
CommentController.class
// 댓글 좋아요
@PostMapping("/comments/like/{commentId}")
public ResponseEntity<String> commentLikePost(@PathVariable Long commentId,
@AuthenticationPrincipal UserDetailsImpl userDetails) {
commentLikeService.commentLikePost(commentId, userDetails.getUser());
return new ResponseEntity<>("댓글 좋아요!", HttpStatus.OK);
}
// 댓글 좋아요 취소
@DeleteMapping("/comments/like/{commentId}")
public ResponseEntity<String> commentLikeDelete(@PathVariable Long commentId,
@AuthenticationPrincipal UserDetailsImpl userDetails) {
commentLikeService.commentLikeDelete(commentId, userDetails.getUser());
return new ResponseEntity<>("댓글 좋아요 취소!", HttpStatus.OK);
}
서비스에서 댓글 좋아요, 좋아요 취소 기능을 구현했다.
CommentLikeServiceImpl.class
// 댓글 좋아요
@Override
public void commentLikePost(Long commentId, User user) {
Comment comment = commentRepository.findById(commentId).orElseThrow(
() -> new CustomException(ExceptionStatus.COMMENT_NOT_FOUND)
);
if (existsCommentLikeCommentIdAndUserId(commentId, user.getId())) {
throw new IllegalStateException("이미 좋아요를 누르셨습니다");
} else {
CommentLike commentLike = new CommentLike(user, comment);
commentLikeRepository.save(commentLike);
}
}
// 댓글 좋아요 취소
@Override
public void commentLikeDelete(Long commentId, User user) {
if (!existsCommentLikeCommentIdAndUserId(commentId, user.getId())) {
throw new IllegalStateException("좋아요를 누르지 않으셨습니다.");
} else {
CommentLike commentLike = commentLikeRepository.findByCommentIdAndUserId(
commentId, user.getId());
commentLikeRepository.delete(commentLike);
}
}
댓글 좋아요 프론트엔드 구현
vs code에서 댓글 좋아요, 좋아요 취소 function을 구현했다.
// 댓글 좋아요
function commentLikePost(commentId) {
var settings = {
"url": `http://localhost:8080/api/comments/like/${parseInt(
commentId
)}`,
"method": "POST",
"timeout": 0,
"headers": {
"Authorization": localStorage.getItem('accessToken')
},
};
$.ajax(settings).done(function (response) {
console.log(response);
reloadComments();
})
.fail(function (response) {
console.log(response)
});
}
// 댓글 좋아요 취소
function commentLikeCancel(commentId) {
var settings = {
"url": `http://localhost:8080/api/comments/like/${parseInt(
commentId
)}`,
"method": "DELETE",
"timeout": 0,
"headers": {
"Authorization": localStorage.getItem('accessToken')
},
};
$.ajax(settings).done(function (response) {
console.log(response);
reloadComments();
})
.fail(function (response) {
console.log(response)
});
}
실행 결과
좋아요를 누르지 않았을때
좋아요를 눌렀을때