10-2) 게시글 목록 조회
BoardController
@Controller
@RequestMapping("board")
@Slf4j
@RequiredArgsConstructor
public class BoardController {
private final BoardService service;
@GetMapping("{boardCode:[0-9]+}")
public String selectBoardList(@PathVariable("boardCode") int boardCode,
@RequestParam(value="cp", required = false, defaultValue = "1") int cp,
Model model) {
log.debug("bodeCode : " + boardCode);
Map<String, Object> map = service.selectBoardList(boardCode, cp);
model.addAttribute("pagination", map.get("pagination"));
model.addAttribute("boardList", map.get("boardList"));
return "board/boardList";
}
}
boardServiceImpl
@Override
public Map<String, Object> selectBoardList(int boardCode, int cp) {
int listCount = mapper.getListCount(boardCode);
Pagination pagination = new Pagination(cp, listCount);
int limit = pagination.getLimit();
int offset = (cp - 1) * limit;
RowBounds rowBounds = new RowBounds(offset, limit);
List<Board> boardList = mapper.selectBoardList(boardCode, rowBounds);
Map<String, Object> map = new HashMap<>();
map.put("pagination", pagination);
map.put("boardList", boardList);
return map;
}
board-mapper.xml
<select id="getListCount">
SELECT COUNT(*)
FROM "BOARD"
WHERE BOARD_DEL_FL = 'N'
AND BOARD_CODE = #{boardCode}
</select>
<select id="selectBoardList">
SELECT BOARD_NO, BOARD_TITLE, MEMBER_NICKNAME, READ_COUNT,
(SELECT COUNT(*)
FROM "COMMENT" C
WHERE C.BOARD_NO = B.BOARD_NO) COMMENT_COUNT,
(SELECT COUNT(*)
FROM "BOARD_LIKE" L
WHERE L.BOARD_NO = B.BOARD_NO) LIKE_COUNT,
<![CDATA[
CASE
WHEN SYSDATE - BOARD_WRITE_DATE < 1 / 24 / 60
THEN FLOOR((SYSDATE - BOARD_WRITE_DATE) * 24 * 60 * 60) || '초 전'
WHEN SYSDATE - BOARD_WRITE_DATE < 1 / 24
THEN FLOOR((SYSDATE - BOARD_WRITE_DATE) * 24 * 60) || '분 전'
WHEN SYSDATE - BOARD_WRITE_DATE < 1
THEN FLOOR((SYSDATE - BOARD_WRITE_DATE) * 24) || '시간 전'
ELSE TO_CHAR(BOARD_WRITE_DATE, 'YYYY-MM-DD')
END BOARD_WRITE_DATE
]]>
FROM "BOARD" B
JOIN "MEMBER" USING(MEMBER_NO)
WHERE BOARD_DEL_FL = 'N'
AND BOARD_CODE = #{boardCode}
ORDER BY BOARD_NO DESC
</select>
boardList.html 일부
<section class="board-list">
<th:block th:each="boardType : ${application.boardTypeList}">
<h1 class="board-name"
th:if="${boardType.boardCode} == ${boardCode}"
th:text="${boardType.boardName}"
>게시판 이름</h1>
</th:block>
<div class="list-wrapper">
<table class="list-table">
<thead>
<tr>
<th>글번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회수</th>
<th>좋아요</th>
</tr>
</thead>
<tbody>
<th:block th:if="${#lists.isEmpty(boardList)}">
<tr>
<th colspan="6">게시글이 존재하지 않습니다.</th>
</tr>
</th:block>
<th:block th:unless="${#lists.isEmpty(boardList)}">
<tr th:each="board : ${boardList}" th:object="${board}">
<td th:text="*{boardNo}">게시글 번호</td>
<td>
<a th:text="*{boardTitle}">게시글 제목</a>
<th:block th:text="|[*{commentCount}]|">댓글 수</th:block>
</td>
<td th:text="*{memberNickname}">닉네임</td>
<td th:text="*{boardWriteDate}">2023-10-26</td>
<td th:text="*{readCount}">0</td>
<td th:text="*{likeCount}">0</td>
</tr>
</th:block>
</tbody>
</table>
</div>
<div class="btn-area">
<button id="insertBtn">글쓰기</button>
</div>
<div class="pagination-area">
<ul class="pagination" th:object="${pagination}">
<li><a th:href="@{/board/{boardCode}(boardCode=${boardCode}, cp=1)}"><<</a></li>
<li><a th:href="@{/board/{boardCode}(boardCode=${boardCode}, cp=*{prevPage})}"><</a></li>
<th:block th:each="i : *{#numbers.sequence(startPage, endPage)}">
<li th:if="${i} == *{currentPage}">
<a class="current" th:text="${i}">현재페이지</a>
</li>
<li th:unless="${i} == *{currentPage}">
<a th:href="@{/board/{boardCode}(boardCode=${boardCode}, cp=${i})}"
th:text="${i}">이동할 페이지</a>
</li>
</th:block>
<li><a th:href="@{/board/{boardCode}(boardCode=${boardCode}, cp=*{nextPage})}">></a></li>
<li><a th:href="@{/board/{boardCode}(boardCode=${boardCode}, cp=*{maxPage})}">>></a></li>
</ul>
</div>

