오늘 진행한 과제 Lv5의 요구조건으로는 기존의 진행했던 게시판 프로젝트에서 댓글과 게시글에 좋아요 기능을 구현하는 것이었다.
그래서 좋아요와 회원, 게시글, 댓글간 연관관계에 대해 생각해보았다. 우선 게시글의 좋아요에 대해서만 생각해보면 회원은 게시글에 좋아요를 누를 수 있다. 여러 회원이 여러 게시글에 좋아요를 누를 수 있다. 이는 M:N관계이므로 이를 풀어서 새로운 Like엔티티를 만들어 회원엔티티, 게시글엔티티와 각각 N:1관계를 맺어주었다.
그 후 컨트롤러, 서비스, 리포지토리 클래스를 각각 만들어주었다.
LikeService클래스에서는 각각 좋아요 저장, 삭제에 해당하는 로직이 담긴 메소드를 작성하였다.
좋아요를 저장하는 메소드에서는 좋아요를 누를 postId와 JWT인증을 통해 유저 객체를 파라미터로 받고 PostRepository에서 게시글을 찾은 후 PostLike생성자를 통해 엔티티를 생성하여 PostLikeRepository에 저장한다.
public void postLike(Long postId, User user) {
Post post = findPost(postId);
PostLike postLike = new PostLike(post, user);
postLikeRepository.save(postLike);
}
findPost는 postId를 사용하여 PostRepository에서 Post를 찾는 메소드이며 이 과정에서 만약 해당하는 Post가 없다면 예외가 발생한다.
@Entity
@Getter
@NoArgsConstructor
public class PostLike {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id")
private Post post;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
public PostLike(Post post, User user) {
this.post = post;
this.user = user;
post.getPostLikeList().add(this);
}
}
저장 과정을 예외없이 거치면 DB에는 다음과 같이 post_id, user_id와 함께 저장된다.
좋아요를 삭제하는 메소드는 삭제하고자 하는 postLike의 id와 user를 받고 우선 postLikeRepository에 해당하는 엔티티가 있는지 확인하고 없다면 예외를 발생시킨다. 그 후 입력받은 user의 user_id와 postLike엔티티의 user_id가 일치하는지 확인하여 맞다면 삭제를 진행하고 일치하지 않는다면 예외를 발생시킨다.
public void deletePostLike(Long postLikeId, User user) {
PostLike postLike = postLikeRepository.findById(postLikeId).orElseThrow(() ->
new CustomException(ErrorCode.WRONG_LIKE_PID));
if(!postLike.getUser().getId().equals(user.getId())){
throw new CustomException(ErrorCode.WRONG_NAME);
}
postLikeRepository.delete(postLike);
}
댓글 좋아요 또한 같은 방식으로 메소드를 작성하고 엔티티와 CommentRepository를 작성하였다.
이제 기존의 게시글과 댓글을 조회할 때 좋아요의 수는 포함되지 않았으므로 PostResponseDto의 필드에 like를 추가해주고 생성자에 Post엔티티의 PostLikeList리스트의 size() 를 통해 좋아요수를 초기화하여 조회할때 좋아요 수도 함께 반환한다.
포스트맨으로 전체 게시글을 조회하는 api호출시 다음과 같이 좋아요수도 같이 반환됨을 확인할 수 있다.
오늘로써 레벨 5를 완성함으로써 모든 단계의 과제를 제출할 수 있었다.
과제에서 요구한 기능들은 모두 구현하였고 그 과정에서 전역 예외처리나 스프링 시큐리티, Auditing기능 등 몰랐던것들을 많이 배울수 있었다. 하지만 매니저님에게 전체적으로 코드리뷰를 받아본 결과 불필요한 부분이나 매니저님이 어노테이션이나 작성한 코드에 대해 왜 작성했느냐 물었을때 확실하게 답변하지 못한것들이 있었다.
주특기 주차가 아직 3일정도 남았는데 그 기간동안 시간을 반으로 나눠 오전시간에는 페어와 함께 추가적인기능(회원 탈퇴 기능, 페이징 처리, 게시글 카테고리 분류)를 진행할것이고 오후시간에는 코드를 둘러보며 매니저님이 물어보셨을 때 명확하게 대답하지 못했던것들과 한번 공부해보라 하셨던것들에 대해 공부하도록 하겠다.
'백엔드(Back End) > Spring' 카테고리의 다른 글
[TIL]20230711 - 회원탈퇴 기능 구현 (0) | 2023.07.11 |
---|---|
[Spring]@ControllerAdvice를 이용한 전역 예외 처리 (1) | 2023.07.10 |
[TIL]20230708 - 스프링 컴포넌트 스캔 (0) | 2023.07.09 |
[TIL]20230706 - 스프링 예외 처리 @ExeptionHandler, @ControllerAdvice (0) | 2023.07.06 |
[TIL]20230704 - 엔티티와 DTO다루기 (0) | 2023.07.05 |