슬기로운슬기

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() : 좋아요 메서드 

  1. postService.findPost(postId) : postId를 통해서 좋아요를 할 post를 찾는다. 
  2. Like 객체를 생성
  3. QueryMethod사용-findByUserAndPost(user, post) : likeRepository에서 user와 post를 기준으로 좋아요를 누른적이 있는지 없는지 확인 (userId, postId 모두 같아야지만 좋아요를 누른적이 있음) 
  4. .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() : 좋아요 취소 메서드 

  1. likeId를 통해서 id에 해당하는 좋아요 정보를 찾는다. 
  2. like.getUser().equals(user) : 좋아요를 한 사용자를 가지고와 user가 같은지 확인 
  3. 좋아요를 한 사용자가 맞다면 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
profile

슬기로운슬기

@스를기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!