- 서비스 구현
- 컨트롤러 구현
1. 서비스 구현
서비스 구현
- 리뷰 있는지 확인
- 리뷰 삭제 권한 확인
- 리뷰 삭제
1. 리뷰 있는지 확인
댓글 삭제 메서드를 만들고 파라미터로 Long id를 받는다.
받은 id로 댓글이 있는지 확인하고

2. 리뷰 삭제 권한 확인
- 생각 로그인 할 때 JWT토큰을 받고 토큰 안에 userId가 있으니까 그것과 리뷰 있는지 없는지 확인 할 때 리뷰가 가지고 있는 userId와 비교하면 될 것 같음
- 먼저는 토큰을 가지고 와야 함 JwtUtil로 이동 HttpServletRequest Header에 토큰이 있을 거니까 Authorization이름의 해더를 뽑아오고, Bearer 를 지운 나머지 부분을 가지고 온다

- 토큰 가지고 왔으면 토큰 안에 있는 userId를 뽑아내기


- 찾은 userId와 리뷰의 userId를 비교 후 확인

3. 삭제하기
commentRepository에서 댓글 pk로 삭제한다!

2. 컨트롤러 구현
컨트롤러 구현
서비스에서 리뷰삭제 메서드를 호출하고 Json데이터 보내기

문제가 있었음
문제
- 리뷰 삭제 메서드를 실행 후 책 상세보기를 하면 책이 존재하지 않는다는 throw가 나옴
- 리뷰 삭제를 하면 책 자체가 없어지나?
- 리뷰는 삭제가 잘 되는건가?
- 둘 다 아니라면 뭐가 문제인가?
일단 리뷰를 삭제해보자
포스트맨에서 확인해보니 200 성공이 나왔고

1. 리뷰 삭제를 하면 책 자체가 없어지나?
책 있음

2. 리뷰는 삭제가 잘 되는건가?
h2에 가서 댓글 있는지 삭제 여부 확인
4번 없어짐

그러면 무슨 문제인가?
3. 책도 있고, 댓글도 잘 삭제 됐는데 상세보기 페이지에서 문제가 생겼으니 여기가 문제다
만들어둔 DetailDTO에서 문제가 있나 싶어 확인
필요한 것들 다 있고
이상 없어 보임 아직은 모름
생각해보니 bookRepository에서 쿼리문이 문제가 있나 생각함
왜냐하면 지금 계속 오류가 해당 책이 없습니다 라고 계속 뜨기에

@Query("SELECT b FROM Book b JOIN fetch b.comments ct JOIN fetch ct.user u WHERE b.isbn13 = :isbn13")
Optional<Book> mFindByIdWithComment(@Param("isbn13") String isbn13);
inner join을 사용했었는데 이러면 매칭되는 데이터가 없으면 그 레코드를 포함하지 않아서 책이 결과에서 제외될 수 있다! 그래서
left join으로 만드니까
@Query("SELECT b FROM Book b left JOIN fetch b.comments ct left JOIN fetch ct.user u WHERE b.isbn13 = :isbn13")
Optional<Book> mFindByIdWithComment(@Param("isbn13") String isbn13)
결과
보인다

Share article