Entity - Like
- Like : Post -> ManyToOne : 게시물 1개에 여러개의 Like 가능
- Like : User -> ManyToOne : User 1명 당 여러개의 Like 가능( 각각 다른 게시물에 가능하게 할거임 )
@Getter
@Entity
@NoArgsConstructor
@Table(name="likes")
public class Like {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; //id
@JoinColumn(name = "postId")
@ManyToOne
private Post post;
@JoinColumn(name = "userId")
@ManyToOne
private User user;
public Like(Post post, User user) {
this.post = post;
this.user = user;
}
}
Controller - LikeController
- 좋아요 추가
- @PostMapping : HTTP POST 요청을 처리
- @PathVariable : postId를 경로 변수로 받음
- @AuthenticationPrincipal : 현재 인증된 사용자의 정보를 userDetails를 매개변수로 받음
- 좋아요 취소
- @DeleteMapping : HTTP DELETE 요청을 처리
- @PathVariable: likeId를 경로 변수로 받음
- @AuthenticationPrincipal : 현재 인증된 사용자의 정보를 userDetails를 매개변수로 받음
// 게시물 좋아요
@PostMapping("/post/{postId}/like")
public ResponseEntity<String> createPostLike(@PathVariable Long postId, @AuthenticationPrincipal UserDetailsImpl userDetails) {
likeService.createPostLike(postId, userDetails.getUser());
return ResponseEntity.ok().body("게시물 좋아요 완료 ~");
}
// 게시물 좋아요취소
@DeleteMapping("/post/like/{likeId}")
public ResponseEntity<String> deletePostLike(@PathVariable Long likeId, @AuthenticationPrincipal UserDetailsImpl userDetails) {
likeService.deletePostLike(likeId, userDetails.getUser());
return ResponseEntity.ok().body("게시물 좋아요 취소 ");
}
Like - LikeService
createPostLike() : 좋아요 메서드
- postService.findPost(postId) : postId를 통해서 좋아요를 할 post를 찾는다.
- Like 객체를 생성
- QueryMethod사용-findByUserAndPost(user, post) : likeRepository에서 user와 post를 기준으로 좋아요를 누른적이 있는지 없는지 확인 (userId, postId 모두 같아야지만 좋아요를 누른적이 있음)
- .isEmpty() 를 통해 검색된 결과가 비어있으면 true를 반환 ( 좋아요를 누른적이 없다는 뜻 )
public void createPostLike(Long postId, User user) {
Post post = postService.findPost(postId);
Like like = new Like(post, user);
// 사용자가 해당 게시물에 좋아요를 누른 적이 없는 경우
if(likeRepository.findByUserAndPost(user, post).isEmpty()) { // 누른적이 없는 경우: true 반환
// 좋아요 정보를 저장
likeRepository.save(like);
} else {
throw new IllegalArgumentException("좋아요를 누른 적이 있습니다.");
}
}
deletePostLike() : 좋아요 취소 메서드
- likeId를 통해서 id에 해당하는 좋아요 정보를 찾는다.
- like.getUser().equals(user) : 좋아요를 한 사용자를 가지고와 user가 같은지 확인
- 좋아요를 한 사용자가 맞다면 delete
public void deletePostLike(Long likeId, User user) {
Like like = findLike(likeId);
if(!like.getUser().equals(user)) {
throw new RejectedExecutionException("좋아요를 클릭한 유저가 아닙니다.");
}
likeRepository.delete(like);
}
public Like findLike(Long id) {
return likeRepository.findById(id).orElseThrow(() ->
new IllegalArgumentException("좋아요를 클릭한 적이 없습니다."));
}
PostResponseDto - 게시물 조회했을 때 좋아요 갯수
@Getter
public class PostResponseDto {
private Integer like;
public PostResponseDto(Post post) {
this.like = post.getLikeList().size();
}
}
--> 고민 중이다. post entity에 likeCount column을 추가하여 메서드가 실행될때마다 +1,-1을 해서 갯수를 나타낼지..
반응형
'study > study_spring' 카테고리의 다른 글
[TIL] TDL프로젝트 - 유저 검색 기능 구현 (Spring) (0) | 2023.07.18 |
---|---|
[S.A] TDL 프로젝트 (0) | 2023.07.17 |
[TIL] 게시물 조회 메서드 (+댓글) (0) | 2023.07.11 |
[TIL] 회원가입 구현 (0) | 2023.06.26 |
[TIL] @Builder (0) | 2023.06.22 |