뉴스피드 만들기 (팀프로젝트) v2: 좋아요, 댓글 기능(쿼리)

김재현·2023년 11월 23일
0

TIL

목록 보기
38/88
post-thumbnail

어제에 이어 팀프로젝트를 진행했다.
오전에 모여 진행상황을 나누고 계획을 수립했다.

다른 팀원 분께서 회원 탈퇴를 구현하기 위해서는 다른 DB를 연결해야 된다고 하셨고, 맡아주시기로 했다. 인증/인가는 역시 어렵다...

나의 오늘, 내일 목표는 좋아요/좋아요취소 기능과 댓글 CRUD가 되었다.


좋아요/좋아요취소 기능 구현

좋아요 기능을 위해 Post entity에 아래와 같은 코드를 추가했다.

    private List<String> memberIdList = new ArrayList<>();

    @Column
    private int likes =0;

like는 Boolean 타입의 요청에 대해 로직을 수행하여 like 수를 올리거나 내리도록 구현했다.
(물론 토큰 인증 과정을 거쳐 회원만 가능하며, 자신의 글에는 좋아요 불가!)

ResponseEntity 응용

추가적으로 어제 배우고 공부해서 포스팅 했던 ResponseEntity를 응용해서 사용해봤다.

            Long likes = postService.toggleLikePost(postId, booleanLike, memberDetails);
            if(likes != null) {
                if (booleanLike) {
                    return ResponseEntity.ok().body(new LikesResponseDto("좋아요 성공", HttpStatus.OK.value(),likes));
                } else {
                    return ResponseEntity.ok().body(new LikesResponseDto("좋아요 취소 성공", HttpStatus.OK.value(),likes));
                }
            }

        return ResponseEntity.ok().body(new LikesResponseDto("잘못된 요청입니다.", HttpStatus.BAD_REQUEST.value(),null));

경우에 따라 메세지를 더 명확하게 전달 할 수 있었다.


댓글 작성 및 조회 구현

댓글은 굉장히 머리싸메고 만들었다.
왜냐하면 Comment entity는 물론이고, PostComment entity를 추가하여 서로간의 참조,연관관계를 설정한 뒤, 알맞게 사용해야 했기 때문이다.

기존에 팀원들과 작성해놓은 ERD를 기반으로 엔터티를 만들며 연관관계를 설정했다.

이 때 혹시 FetchType이 LAZY로 설정되어 오류가 나지 않을까 조심했다.

추가적으로 참조관계에서 쓸데없는 참조로 의도치 않은 변경이 생기지 않도록 의도하면 좋겠지만, 일단은 기능 구현을 목적으로 서로 모두 참조되게끔 설정했다.

이 쿼리문을 넣는게 가장 힘들었다.
일단은 Comment를 return해야한다고 생각하며 CommentRepository에 접근했다.
거기서 postId를 통해 comments를 받아와야한다.
따라서 Comment의 속성 중 postCommentList를 이용하여 PostComment에 접근한 뒤,
postComments 중에서 postId와 일치하는 commentId의 comments를 찾아온다.
그 뒤에는 Dto형태로 반환하면 끝!

쿼리문

말로 설명하는 것 보다, 쿼리문으로 작성하면 아래와 같다.

Comment에 PostComment를 commentId로 (left join) 한뒤 postId로 검색.

    select
        c1_0.id,
        c1_0.content,
        c1_0.is_deleted,
        c1_0.member_id 
    from
        comment c1_0 
    left join
        post_comment p1_0 
            on c1_0.id=p1_0.comment_id 
    where
        p1_0.post_id = {postId}

SQL 공부했던게 많은 도움이 된다.

내일은 댓글 CRUD 마무리하고 개인과제를 좀 더 보충해봐야겠다.


관련 포스팅

Previouse Post

Following Post

profile
I live in Seoul, Korea, Handsome

0개의 댓글