본문 바로가기
💻 뚝딱뚝딱/팀내도서대여시스템(OBRS)

[개발일지#008] 나의책 / 빌린책 기능 구현

by 뚜루리 2024. 4. 9.
728x90
320x100
회원에 한해 내가 등록한 책 리스트와 내가 빌린 책 리스트를 확인할 수 있는 화면을 생성한다.

 

[개발목표]

  1. 나의 책 / 빌린 책 화면 구현

 


1. 나의 책 / 빌린 책 화면 구현

BookMapper.xml

<select id="findByAuthorId" parameterType="String"
            resultType="seulgi.bookRentalSystem.domain.book.Book">
        SELECT
               BOOK_ID AS bookId
             , BOOK_NAME AS bookName
             , BOOK_WRITER AS bookWriter
             , AUTHOR_ID AS authorId
             , (SELECT MEMBER_NAME
                FROM MEMBER_TB
                WHERE MEMBER_ID = AUTHOR_ID ) AS authorName
             , BOOK_STATE_CODE AS bookStateCode
             , (SELECT STATE_CODE_NAME
                FROM BOOK_STATE_CODE
                WHERE STATE_CODE = BOOK_STATE_CODE) AS bookStateCodeName
             , CREATE_DATE AS createDate
        FROM BOOK
        WHERE AUTHOR_ID = #{authorId}
          AND USE_AT = 'Y'
        ORDER BY createDate DESC;
    </select>

    <select id="findByBookRentalId" parameterType="String"
            resultType="seulgi.bookRentalSystem.domain.book.BookRental">
        SELECT
                  BOOK_ID AS bookId
                , (SELECT BOOK_NAME
                    FROM BOOK T2
                    WHERE T1.BOOK_ID = T2.BOOK_ID) AS bookName
                , BOOK_RENTAL_ID AS bookRentalId
                , (SELECT MEMBER_NAME
                    FROM MEMBER_TB
                    WHERE MEMBER_ID = BOOK_RENTAL_ID  ) AS rentalName
                , BOOK_STATE_CODE AS bookStateCode
                , (SELECT STATE_CODE_NAME
                    FROM RENTAL_STATE_CODE
                    WHERE STATE_CODE = BOOK_STATE_CODE) AS bookStateCodeName
                , RENTAL_DATE AS rentalDate
                , RETURN_DATE AS returnDate
        FROM BOOK_RENTAL T1
        WHERE BOOK_RENTAL_ID =#{bookRentalId}
        ORDER BY RENTAL_DATE DESC;
    </select>
  • 서브쿼리를 사용하여 외래키로 연결된 데이터를 모두 조회하도록 했다.

 

bookMapper.java

List<Book> findByAuthorId(@Param("authorId") String authorId);

List<BookRental> findByBookRentalId(@Param("bookRentalId") String bookRentalId);

 

bookService, bookServiceImpl.java

public List<Book> findByAuthorId(String authorId);

public List<BookRental> findByBookRentalId(String bookRentalId);
@Override
public List<Book> findByAuthorId(String authorId) {
    return bookMapper.findByAuthorId(authorId);
}

@Override
public List<BookRental> findByBookRentalId(String bookRentalId) {
    return bookMapper.findByBookRentalId(bookRentalId);
}

 

 

bookController.java

/**
 * 나의책 목록 조회
 * @param authorId
 * @param model
 * @return
 */
@GetMapping("/{authorId}/booksByAuthorId")
public String booksByAuthorId(@PathVariable String authorId, Model model){
    List<Book> books = bookService.findByAuthorId(authorId);
    model.addAttribute("books", books);
    return "book/booksByAuthorId";
}

/**
 * 빌린책 목록 조회
 * @param bookRentalId
 * @param model
 * @return
 */
@GetMapping("/{bookRentalId}/booksByBookRentalId")
public String booksByBookRentalId(@PathVariable String bookRentalId, Model model){
    List<BookRental> rentalBooks = bookService.findByBookRentalId(bookRentalId);
    List<BookStateCode> bookStateCodes = bookService.allRentalStateCodeList();
    model.addAttribute("bookStateCodes", bookStateCodes);
    model.addAttribute("rentalBooks", rentalBooks);
    return "book/booksByBookRentalId";
}

 

 

booksByAuthorId.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{common/layout}"
      layout:fragment="content">
<head>
    <title>나의 책</title>
</head>
<body>
<div class="container" style="max-width: 800px">
    <div class="py-5 text-center">
        <h2>나의 책</h2> </div>
    <div class="row">
        <div class="col">
            <button class="btn btn-primary float-end" type="button" onclick="location.href='/book/addBook'"> 책 등록</button> </div>
    </div>
    <hr class="my-4">
    <div>
        <table class="table">
            <thead>
            <tr style="text-align: center;">
                <th>No</th>
                <th>책이름</th>
                <th>저자</th>
                <th>소유자</th>
                <th>상태</th>
                <th>등록일</th>
            </tr>
            </thead>
            <tbody>
            <tr th:each="book, stat : ${books}">
                <td><a th:text="${stat.count}" style="text-align: center;">1</a></td>
                <td><a href="book.html" th:href="@{/book/{bookId} (bookId=${book.bookId})}" th:text="${book.bookName}">책 이름</a></td>
                <td><a th:text="${book.bookWriter}">저자</a></td>
                <td style="text-align: center;"><a th:text="${book.authorName}">소유자</a></td>
                <td style="text-align: center;">
                    <a th:if="${book.bookStateCode == 'ABLE'}" th:text="${book.bookStateCodeName}" style="color: darkgreen;">상태</a>
                    <a th:if="${book.bookStateCode == 'UNABLE'}" th:text="${book.bookStateCodeName}" style="color: red;">상태</a>
                </td>
                <td style="text-align: center;"><a th:text="${book.createDate}">등록일</a></td>
            </tr>
            </tbody>
        </table>
    </div>
    <hr class="my-4">
</div> <!-- /container -->
</body>
</html>

 

 

booksByBookRentalId.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{common/layout}"
      layout:fragment="content">
<head>
    <title>빌린 책</title>
</head>
<body>
<div class="container" style="max-width: 800px">
    <div class="py-5 text-center">
        <h2>빌린 책</h2> </div>
    <hr class="my-4">
    <div>
        <table class="table">
            <thead>
            <tr style="text-align: center;">
                <th>No</th>
                <th>책이름</th>
                <th>상태</th>
                <th>대여일</th>
                <th>반납일</th>
                <th></th>
            </tr>
            </thead>
            <tbody>
            <tr th:each="rentalBook, stat : ${rentalBooks}">
                <td><a th:text="${stat.count}" style="text-align: center;">1</a></td>
                <td><a href="book.html" th:href="@{/book/{bookId} (bookId=${rentalBook.bookId})}" th:text="${rentalBook.bookName}">책 이름</a></td>
                <td style="text-align: center;">
                    <a th:if="${rentalBook.bookStateCode == 'RENTAL'}" th:text="${rentalBook.bookStateCodeName}" style="color:red;">상태</a>
                    <a th:if="${rentalBook.bookStateCode == 'RETURN'}" th:text="${rentalBook.bookStateCodeName}" style="color:darkgreen;">상태</a>
                </td>
                <td style="text-align: center;"><a th:text="${rentalBook.rentalDate}">대여일</a></td>
                <td style="text-align: center;"><a th:text="${rentalBook.returnDate}">반납일</a></td>
            </tr>
            </tbody>
        </table>
    </div>
    <hr class="my-4">
</div> <!-- /container -->
</body>
</html>

 

728x90
320x100