티스토리 뷰
이번 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을 작성하면서 연관관계에 대해서 고민하고 적용해 볼 수 있었다.
#피드백
- 트러블 슈팅에 대해 작성한 것 잘했다.
- 좋아요 수의 동시성 오류를 생각해 보았고 이를 해결하기 위해 @Scheduler를 사용한 것은 좋은 접근이었다.
- 좋아요 수를 게시글 entity에 넣지 않고 service 부분에서 구현할 수 있다는 것을 생각해 보자.
'개발 > 프로젝트' 카테고리의 다른 글
| IoT - Spring TCP/IP 소켓 통신 (0) | 2024.01.17 |
|---|---|
| 채용 정보 공유 서비스 - Grasp 백엔드 개발 (0) | 2023.03.14 |
| 자기소개 웹사이트 만들기 (2) | 2022.11.05 |