본문 바로가기

프로젝트 일지

#10. 싱글 프로젝트 일지 - MemberBook 도메인

- MemberBook 도메인 구조 -

MemberBook 도메인은 회원이 대여한 책을 나타내는 도메인이다.

1. DTO

회원이 대여중인 책에 대한 응답을 나타내는 클래스로
각 상황마다 응답 속에 필요한 내용이 다르므로 3가지 종류로 만들었다.

1. 도서 대여 메서드에서 대여한 책에 대한 response 클래스
=> 대여할 떄 반납 여부를 나타낼 필요가 없음.

2. 대여 기록 조회시 나오는 책에 대한 response 클래스
=> 대여일, 대여일 기준 최대 대여 가능 기간, 반납 여부 필드로 가짐.

3. 대여 반납 메서드에서 반납한 책에 대한 응답을 나타내는 클래스
=> 대여일, 반납일, 연체일, 메시지 (연체일이 있다면, 안내해주고 다음 대여 가능날 전달)

 

2. Entity

1. 대여중인 책에 대한 정보를 담고 있는 역할.
2. 연관 관계가 있는 다른 도메인들의 관계도를 필드로 담고 있는 역할.

 

3. Mapper

회원이 대여중인 책에 대한 정보를 응답에 담기 위해 데이터를 Entity -> DTO 타입으로 변환하는 역할.
3가지 종류로 나뉜 DTO를 각 각 담당하므로 3가지 종류가 있다.

1. 도서 대여 시 응답에 담을 데이터를 Entity -> Dto 타입으로 변환해주는 Mapper

    @Mapping(target = "memberId", source = "member.memberId")
    @Mapping(target = "libraryId", source = "libraryId")
    @Mapping(target = "bookId", source = "book.bookId")
    @Mapping(target = "bookTitle", source = "book.bookTitle")
    @Mapping(target = "memberBookId", source = "memberBookId")
    @Mapping(target = "createdAt", source = "createdAt")
    @Mapping(target = "dueReturnDate", source = "dueReturn")
    MemberBookDto.Response memberBookToMemberBookDtoResponse(MemberBook memberBook);
    List<MemberBookDto.Response> memberBooksToMemberBooksDtoResponse (List<MemberBook> memberBooks);

2. 도서 대여 기록 조회 시 응답에 담을 데이터를 Entity -> Dto 타입으로 변환해주는 Mapper

    @Mapping(target = "memberId", source = "member.memberId")
    @Mapping(target = "libraryId", source = "libraryId")
    @Mapping(target = "bookId", source = "book.bookId")
    @Mapping(target = "memberBookId", source = "memberBookId")
    @Mapping(target = "bookTitle", source = "book.bookTitle")
    @Mapping(target = "createdAt", source = "createdAt")
    @Mapping(target = "dueReturnDate", source = "dueReturn")
    @Mapping(target = "returnedDate", source = "returnedAt")
    MemberBookDto.RentalHistoryResponse HistoryMemberBookToMemberBookDtoResponse(MemberBook memberBook);
    List<MemberBookDto.RentalHistoryResponse> HistoryMemberBooksToMemberBooksDtoResponse (List<MemberBook> memberBooks);

3. 도서 반납 시 응답에 담을 데이터를 Entity -> Dto 타입으로 변환해주는 Mapper

    @Mapping(target = "memberId", source = "member.memberId")
    @Mapping(target = "libraryId", source = "libraryId")
    @Mapping(target = "bookId", source = "book.bookId")
    @Mapping(target = "memberBookId", source = "memberBookId")
    @Mapping(target = "bookTitle", source = "book.bookTitle")
    MemberBookDto.ReturnResponse ReturnMemberBookToMemberBookDtoResponse(MemberBook memberBook);

 

4. Repository

MemberBook 테이블에 대한 데이터를 다루기 위한 메서드를 가지고 있는 역할.
Spring Data JPA와 JPQL 사용.

@Repository
public interface MemberBookRepository extends JpaRepository<MemberBook, Long> {
    (1)
    int countByMemberAndReturnedAtIsNull(Member member);
	
    (2)
    @Query("SELECT COUNT(mb) FROM MemberBook mb 
    WHERE mb.member.memberId = :memberId AND mb.returnedAt IS NULL")
    int countUnreturnedBooksByMember(@Param("memberId") Long memberId);
	
    (3)
    @Query("SELECT mb FROM MemberBook mb 
    WHERE mb.member.id =:memberId AND mb.book.id =:bookId AND mb.returnedAt IS NULL")
    MemberBook findByMember_IdAndBook_IdAndReturnedAtIsNull(Long memberId, Long bookId);
	
    (4)
    @Query("SELECT mb FROM MemberBook mb WHERE mb.member.id =:memberId")
    List<MemberBook> findByMember_Id(@Param("memberId") Long memberId);
	
    (5)
    @Query("SELECT mb FROM MemberBook mb JOIN mb.book b WHERE mb.member.id = :memberId")
    Page<MemberBook> findMemberBookByMemberId 
    (@Param("memberId") Long memberId, Pageable pageable);
	
    (6)
    @Transactional
    @Modifying
    @Query("DELETE FROM MemberBook mb WHERE mb.member.id =:memberId")
    void deleteByMember_Id(@Param("memberId") Long memberId);

}

1. Spring Data JPA에서 제공하는 네이밍 컨벤션에 의한 자동 완성 메서드.
2. 1번의 자동완성 메서드를 JPQL로 사용하면 어떻게 되는지를 나타내기 위해 작성함.
3. MemberBook 테이블에서 주어진 memberId와 bookId와 일치하고 returnedAt이 null 인 Data 호출.
4. MemberBook 테이블에서 주어진 memberId와 일치한 데이터 호출.
5. MemberBook 테이블에서 Book 테이블의 PK를 가진 데이터 중, 주어진 memberId와 일치하는 Data 호출
6. MemberBook 테이블에서 주어진 memberId와 일치하는 Data를 '삭제'

 

5. Service

MemberBook 과 관련된 데이터를 Repository와 연계하여 DB로 다루는 역할.

 

A. 메서드 : 도서 대여 반납 메서드에서 주어진 memberId, bookId와 일치하는 MemberBook 찾는 로직.
B. 메서드 : 회원 대여 내역 조회 메서드에서 주어진 memberId와 일치하는 MemberBook 찾는 로직.