[Project] 2차 프로젝트 - 상세보기(리뷰)

김호정's avatar
Oct 25, 2024
[Project] 2차 프로젝트 - 상세보기(리뷰)
  • 더미 데이터 삽입 시 varchar 길이 초과 나 문제가 생겼다 나왔다
notion image
insert into comment_tb(content, created_at, isbn13, user_id) values('너무 감명깊에 읽었지만 평가에 귀여운 여우에 대한 감정이 들어간게 아닌가 싶어 보류 드리겠습니다.',now(),'9791190669313', 1);
 
→ 해결
isbn13이라는 책 pk를 가지고 와야하는데 더미를 넣을 때 책 더미보다 위쪽에 넣어서 오류났음
→ book더미 밑에 리뷰더미를 넣어 book더미 먼저 만들어지고 리뷰더미 만들어지게 변경함
 
 
상세보기 댓글 쿼리
  • 9788937462788 책의 내용 및 댓글쿼리
SELECT * FROM book_tb b inner join comment_tb ct on b.isbn13 = ct.book_isbn13 where b.isbn13= 9788937462788
notion image
 
  • 이제 댓글적은 유저의 닉네임만 알면 된다!
근데 이대로 test하니까 유저 닉네임이 나오기는 하는데 2번 select한다 문제임
test코드
//책 상세보기 @Test public void mFindByIdWithComment_test(){ String isbn13 = "9788937462788"; Book detailBook = bookRepository.mFindByIdWithComment(isbn13).get(); //2번 들락날락은 별로라고 했는데 그럼 join할까? System.out.println(detailBook.getComments().get(0).getContent()); System.out.println(detailBook.getComments().get(0).getUser().getNick()); }
select 2번하는 문제
 
notion image
그래서 2번 select할 바에 join한번 더 하자 해서 함
@Query("SELECT b FROM Book b JOIN b.comments ct join ct.user u WHERE b.isbn13 = :isbn13") Optional<Book> mFindByIdWithComment(@Param("isbn13") String isbn13);
 
 
뭐가 다르지?
  1. 전부 join한 것
notion image
notion image
notion image
 
차이가 있다 fetch 안 해서 그런듯
fetch 붙이니까
@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);
한방에 똭
notion image
 
 
서비스, 컨트롤러 만들기
 
서비스
public BookResponse.DetailDTO 책상세보기(String isbn13){ Book bookPS = bookRepository.mFindByIdWithComment(isbn13) .orElseThrow(()-> new ExceptionApi404("해당 책이 없습니다")); return new BookResponse.DetailDTO(bookPS); }
 
컨트롤러
@GetMapping("/api/books/detail") public ResponseEntity<?> detail(@RequestParam(name = "isbn13") String isbn13){ BookResponse.DetailDTO bookDetail = bookService.책상세보기(isbn13); return ResponseEntity.ok(Resp.ok(bookDetail)); }
 
확인
notion image

emergency

문제가 있었다!
원래는 inner join으로 해서 댓글을 삭제하니까 책을 찾을 수 없다 나왔다
inner join하면 공통된 것만 모아서 보여줘서 그런가
left outer join하니까 해결됨
 

emergency2

로그인을 안 하면 상세 페이지에 들어갈 수 없다
뭐가 문제인가
상세 페이지에 DTO가 문제 인가 확인하고 쿼리에서 찾을 때 문제가 생기는가 확인하고 서비스쪽으로 가니까 토큰이 여기서 확인하는데 한 줄 한 줄 확인함
 
책 상세보기 메서드에 토큰을 받는게 있다
문제는 로그인을 하지 않으면 토큰이 없는데
notion image
없는 토큰으로 userId를 찾고 이것을 DetailDTO에 담아서 문제가 생긴 것 같다
notion image
그래서
토큰이 없을 때 if문으로 주고 currentUserId는 null로 던졌다
notion image
 
그리고 받는 DetailDTO안에 CommentDTO에서 만약 currentUserId가 ≠null일 때 지금 Id와 리뷰의 id를 비교하는 걸로 변경함
notion image
 

책 상세보기, 댓글 따로 따로 보내기

책 상세보기
 
책 댓글 조회
SELECT * FROM COMMENT_TB c where c.book_isbn13 = '9791190669313'
Share article

keepgoing