inblog logo
|
keepgoing
    Project

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

    김호정's avatar
    김호정
    Oct 25, 2024
    [Project] 2차 프로젝트 - 상세보기(리뷰)
    Contents
    emergencyemergency2책 상세보기, 댓글 따로 따로 보내기
    • 더미 데이터 삽입 시 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
    Contents
    emergencyemergency2책 상세보기, 댓글 따로 따로 보내기

    keepgoing

    RSS·Powered by Inblog