- LibraryBook 도메인 구조 -
libraryBook 객체는 도서관에서 보관하는 책의 정보를 나타낸다.
DB에서는 library 테이블과 book 테이블의 사이를 나타내는 조인 테이블.
1. Entity
도서관별로 보관중인 책, 책의 상태를 필드로 가진다.
<BookStatus가 Book이 아닌 LibraryBook에 있는 이유>
1.
Book Status는 그 책의 상태가 아닌, 도서관에 있는 그 책의 상태를 나타낸다.
LibraryBook은 특정 도서관에 저장된 책을 나타내는 엔티티이므로 BookStatus를 가지는 것이 맞다.
2.
사용자가 책을 대여했을 때, 상태를 '대여중'으로 변경해야 하는데
book 엔티티에 bookStatus가 있다면 해당 book을 가진 모든 도서관에 bookStatus가 영향을 받는다.
그러므로 대여가 될 때 해당 bookStatusId 에있는 bookStatus를 변경하면 개별적으로 관리가 가능하다.
2. mapper
도서관별로 보관중인 책의 response를 위해 Entity -> Dto로 변경하는 역할.
각 필드들을 채우는 @Mapping 애너테이션이 있다.
3. dto
도서관 별 보관중인 책의 단일 조회, 전체 조회에 사용되는 response에 포함될 필드들이 위치.
4. repository
Spring Data JPA 자동 완성 메서드로 사용해도 되지만,
쿼리문 호출 빈도와 조회 속도 향상을 위해 JPQL 사용. (SQL을 작성하여 조건을 직접 정해줌)
@Query("SELECT lb FROM LibraryBook lb JOIN lb.book b
WHERE lb.library.id = :libraryId ORDER BY b.bookTitle ASC")
public Page<LibraryBook> findAllLibraryBooksByLibraryId(@Param("libraryId")Long libraryId,
Pageable pageable);
@Query("SELECT lb FROM LibraryBook lb JOIN lb.book b
WHERE lb.library.id = :libraryId AND lb.book.id = :bookId")
public LibraryBook findLibraryBookByLibraryIdBookId(@Param("libraryId") Long libraryId,
@Param("bookId") Long bookId);
1. LibraryBook 테이블에서, Book 테이블과 연관이 있는 데이터 중
주어진 libraryId와 일치하는 데이터를 가져온다.
2. LibraryBook 테이블의 행(row) 중에 Book 테이블과 연관이 있는 데이터 중
주어진 libraryId, bookId와 일치하는 데이터를 가져온다.
5. service
LibraryBookRepository와 연계하여 DB에 저장하도록하는 메서드를 선언.
A 메서드 : libraryBook 객체를 DB에 저장 로직.
B 메서드 : Page 타입의 libraryBook 객체를 주어진 libraryId와 일치하는 데이터를 DB에서 불러오는 로직.
C 메서드 : libraryBook 테이블에서 주어진 libraryId, bookId와 일치하는 데이터를 반환하는 로직
'프로젝트 일지' 카테고리의 다른 글
#10. 싱글 프로젝트 일지 - MemberBook 도메인 (0) | 2023.05.11 |
---|---|
#9. 싱글 프로젝트 일지 - libraryMember 도메인 (0) | 2023.05.11 |
#7. 싱글 프로젝트 일지 - Book 도메인 (0) | 2023.05.10 |
#6. 싱글 프로젝트 일지 - Library 도메인 (0) | 2023.05.10 |
#5. 싱글 프로젝트 일지 - Member 도메인 (0) | 2023.05.10 |