💻 뚝딱뚝딱/팀내도서대여시스템(OBRS)
[개발일지#008] 나의책 / 빌린책 기능 구현
뚜루리
2024. 4. 9. 00:19
728x90
320x100
회원에 한해 내가 등록한 책 리스트와 내가 빌린 책 리스트를 확인할 수 있는 화면을 생성한다.
[개발목표]
- 나의 책 / 빌린 책 화면 구현
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