티스토리 뷰

이번 Spring 심화 팀 프로젝트는 게시글 서비스 구현이었다.

 

구현한 기능은 아래와 같다.

  • 회원가입 / 로그인
  • 전체 게시글 목록 조회
  • 게시글 작성
  • 선택한 게시글 조회 / 수정 / 삭제
  • 댓글 작성 / 수정 / 삭제
  • 게시글, 댓글 좋아요

 

아래 사이트에는 이번에 해야 할 과제와 완성자료가 있다.

 

팀 프로젝트 Git hub ->https://github.com/kimikhyeon1/tigerhunter1-board

 

GitHub - kimikhyeon1/tigerhunter1-board

Contribute to kimikhyeon1/tigerhunter1-board development by creating an account on GitHub.

github.com

팀 프로젝트 노션  -> https://broad-cilantro-b12.notion.site/88ceb94fb8804ac398e9b0e5ba23d396

 

착호갑사

내배캠 B반 1조 착호갑사팀의 팀 노션입니다.

broad-cilantro-b12.notion.site

 

 


#이번 과제를 통해 배운 점

 

1. 나는 이번 프로젝트에서 게시글 좋아요 부분을 구현하였다.

 

게시글 좋아요를 구현하면서 처음에는 addOrDeleteLike라는 메서드로 좋아요와 좋아요 취소를 한 번에 처리하였다.

하지만 이처럼 작성하면 PostMapping을 통해서 add와 delete를 한번에 처리하게 되고 이는 명확성이 떨어진다고 생각하였다. 또한 필요한 부분만 요청하여 불필요한 작업도 줄여 조금이나마 속도향상에 기여할 수 있다고 생각한다.

 

 

게시글 좋아요 Controller 부분.

    @PostMapping("/{postId}/like")
    public ResponseEntity like(@PathVariable Long postId, @AuthenticationPrincipal UserDetailImpl userDetails){
        boolean likeCheck = postLikeService.saveLikes(postId,userDetails);
        if (likeCheck){
            return new ResponseEntity<>("좋아요!", HttpStatus.OK);
        }else{
            return new ResponseEntity<>("이미 좋아요를 누르셨습니다!",HttpStatus.OK);
        }
    }

    @DeleteMapping("/{postId}/like")
    public ResponseEntity unLike(@PathVariable Long postId, @AuthenticationPrincipal UserDetailImpl userDetails){
        boolean unLikeCheck = postLikeService.deleteLikes(postId,userDetails);
        if (unLikeCheck){
            return new ResponseEntity<>("좋아요 취소!", HttpStatus.OK);
        }else{
            return new ResponseEntity<>("이미 좋아요 취소를 누르셨습니다!",HttpStatus.OK);
        }
    }

-게시글 좋아요 Service 부분.

    @Transactional
    public boolean saveLikes(Long postId, UserDetailImpl userDetails){
        Post post = postRepository.findById(postId).orElseThrow(() -> new CustomException(POST_NOT_FOUND));
        User user = userRepository.findById(userDetails.getUserId()).get();
        List<PostLike> postLikes = postLikeRepository.findByUserAndPost(user,post);
        if(postLikes.isEmpty()){
            postLikeRepository.save(new PostLike(post,user));
            return true;
        }
        return false;
    }

    @Transactional
    public boolean deleteLikes(Long postId, UserDetailImpl userDetails){
        Post post = postRepository.findById(postId).orElseThrow(() -> new CustomException(POST_NOT_FOUND));
        User user = userRepository.findById(userDetails.getUserId()).get();
        List<PostLike> postLikes = postLikeRepository.findByUserAndPost(user,post);
        if(!postLikes.isEmpty()){
            postLikeRepository.delete(postLikes.get(0));
            return true;
        }
        return false;
    }

 

 

2. Spring security와 JWT를 활용하였다.

 

이번 프로젝트에서 security와 JWT를 활용하여 인증/인가 권한을 위임하여 처리하였다.

또한 passwordEncoder를 통한 비밀번호 암호화 처리를 활용하였다.

 

 

3. Git hub branch전략을 사용하였다.

 

Main - Develop - Feature Branch    / 이렇게 3가지로 나누어 진행하였다.

 

규칙은 아래와 같다.

  • 최종 완성 시 Main에 merge 한다.
  • 각자 구현할 기능명을 Feature 브랜치로 작성하고 완성된 기능을 Develop에 merge 한다.
  • 코멘트는 기능 추가 시 feat, 기능 수정 시 fix로 통일하였다.
  • Main 브랜치에는 Dependency 설정을 하여 접근 시 승인을 받게 하였다.

 

이를 통해 Git 사용법에 조금 더 익숙해지고, 활용 방법에 대해 이해할 수 있었다.

 

 

4. ERD설계 및 Table 연관관계 설정을 이해하였다.

 

@ManytoOne , @OnetoMany를 활용하여 연관관계를 설정했다.

좋아요 table을 작성하면서 연관관계에 대해서 고민하고 적용해 볼 수 있었다.

 

 

 

 

#피드백

  1. 트러블 슈팅에 대해 작성한 것 잘했다.
  2. 좋아요 수의 동시성 오류를 생각해 보았고 이를 해결하기 위해 @Scheduler를 사용한 것은 좋은 접근이었다.
  3. 좋아요 수를 게시글 entity에 넣지 않고 service 부분에서 구현할 수 있다는 것을 생각해 보자.

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함