- 더미 데이터 삽입 시 varchar 길이 초과 나 문제가 생겼다 나왔다

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

- 이제 댓글적은 유저의 닉네임만 알면 된다!
근데 이대로 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번하는 문제

그래서 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);
뭐가 다르지?
- 전부 join한 것



차이가 있다 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);
한방에 똭

서비스, 컨트롤러 만들기
서비스
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));
}
확인

emergency
문제가 있었다!
원래는 inner join으로 해서 댓글을 삭제하니까 책을 찾을 수 없다 나왔다
inner join하면 공통된 것만 모아서 보여줘서 그런가
left outer join하니까 해결됨
emergency2
로그인을 안 하면 상세 페이지에 들어갈 수 없다
뭐가 문제인가
상세 페이지에 DTO가 문제 인가 확인하고 쿼리에서 찾을 때 문제가 생기는가 확인하고 서비스쪽으로 가니까 토큰이 여기서 확인하는데 한 줄 한 줄 확인함
책 상세보기 메서드에 토큰을 받는게 있다
문제는 로그인을 하지 않으면 토큰이 없는데

없는 토큰으로 userId를 찾고 이것을 DetailDTO에 담아서 문제가 생긴 것 같다

그래서
토큰이 없을 때 if문으로 주고 currentUserId는 null로 던졌다

그리고 받는 DetailDTO안에 CommentDTO에서 만약 currentUserId가 ≠null일 때 지금 Id와 리뷰의 id를 비교하는 걸로 변경함

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