게시글 좋아요 기능을 구현하는 로직은 다음과 같다. 헤당 게시글과 좋아요를 누른 유저의 정보를 DB에 저장하며, 그 정보를 토대로 좋아요를 누른 상태와 아닌 상태를 구분하는 것이다.
1. PostDto 수정
기존의 PostDto에서 추가적으로 게시글에 대한 게시글 좋아요를 누른 상태인지를 반환해주는 like라는 불리언 변수를 추가해주었다.
@Data
public class PostDto {
private Long postId;
private UserDto user;
private String content;
private List<PostFileDto> postFileList;
private boolean like;
@Builder
public PostDto(Long postId, UserDto user, String content, List<PostFileDto> postFileList, boolean like) {
this.postId = postId;
this.user = user;
this.content = content;
this.postFileList = postFileList;
this.like = like;
}
}
2. PostService에 postLike를 등록, 삭제하는 로직 구현
@Transactional
public PostResponseDto setPostLike(User user, Long postId) {
Post post = postRepository.findById(postId).orElseThrow(() -> new EntityNotFoundException("해당 게시글이 없습니다."));
// postLike 저장 DB에 요청 좋아요 정보가 없다면, 저장한다.
if(!postLikeRepository.existsByPostAndUser(post, user)) {
postLikeRepository.save(PostLike.builder()
.post(post)
.user(user)
.build());
}
return this.getPostList(user);
}
@Transactional
public PostResponseDto deletePostLike(User user, Long postId) {
Post post = postRepository.findById(postId).orElseThrow(() -> new EntityNotFoundException("해당 게시글이 없습니다."));
PostLike postLike = postLikeRepository.findByPostAndUser(post, user).orElseThrow(() -> new EntityNotFoundException());
postLikeRepository.delete(postLike);
return this.getPostList(user);
}
- setPostLike는 좋아요를 누른 User와 그 게시글의 Id를 입력으로 받아, postLike DB에 저장해 준뒤, 이전에 작성했던 포스트 리스트를 반환해주는 getPostList의 결과 값을 반환해준다.
.- deletePostLike 또한 좋아요를 누른 User와 그 게시글의 Id를 입력으로 받아, postLike DB에서 해당 정보를 삭제 후, getPostList의 결과 값을 반환해준다.
3. PostController에 좋아요 요청을 처리하는 메서드 작성
@GetMapping("/like")
public ResponseEntity setPostLike(@CurrentUser User user, @RequestParam(value = "postId") Long postId) {
try {
return ResponseEntity.ok().body(postService.setPostLike(user, postId));
} catch (Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
@DeleteMapping("/like")
public ResponseEntity deletePostLike(@CurrentUser User user, @RequestParam(value = "postId") Long postId) {
try {
return ResponseEntity.ok().body(postService.deletePostLike(user, postId));
} catch (Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
- setPostLike는 Get 요청과 postId를 파라미터로 받아 setPostLike 메서드에 넘겨준다.
- deletePostLike는 Delete 요청과 postId를 파라미터로 받아 deletePostLike 메서드에 넘겨준다.
'Web > 인스타 클론 코딩' 카테고리의 다른 글
[인스타그램 클론코딩] 10. 게시물 댓글 기능 구현(Back-End) (0) | 2023.02.07 |
---|---|
[인스타그램 클론코딩] 09. 게시물 좋아요 기능 구현(Front-End) (0) | 2023.02.04 |
[인스타그램 클론코딩] 08. 홈 화면 구현(Front-End) (0) | 2023.02.03 |
[인스타그램 클론코딩] 08. 홈 화면 구현(Back-End) (0) | 2023.02.03 |
[인스타그램 클론코딩] 07. 팔로우 기능 구현(Back-End) (0) | 2023.02.02 |