오늘은 게시글 목록조회 하는 법을 배웠다 ㅎㅎ
컨트롤러부터 살펴보자면
// 게시글 목록 조회
@GetMapping("/{boardCode}")
public String selectBoardList(@PathVariable("boardCode") int boardCode
,@RequestParam(value="cp", required=false, defaultValue="1") int cp
, Model model){
// boardCode 확인
// System.out.println("boardCode : " + boardCode);
// 게시글 목록 조회 서비스 호출
Map<String, Object> map = service.selectBoardList(boardCode, cp);
// 조회 결과를 request scope에 세팅 후 forward
model.addAttribute("map", map);
return "board/boardList";
}
여기서 @PathVariable을 배웠는데 짧게 정리해보자면
@PathVariable
@PathVariable을 사용하는 경우
Query String을 사용하는 경우
정렬, 필터링
ex) search.naver.com?query=날씨
ex) search.naver.com?query=점심
ex) /board2/insert?code=1
ex) /board2/insert?code=2
--> 삽입이라는 공통된 동작 수행
단, code에 따라 어디에 삽입할지 지정(필터링)
ex) /board/list?order=recent (최신순)
ex) /board/list?order=most (인기순)
두개의 개념이 헷갈리는데 나중에 직접 게시판 만들때 상황에 따라서 골라 써봐야겠다 'ㅁ'
url 경로에 있는 값을 매개변수로 이용할 수 있게 해준다니..@PathVariable도 상당히 유용한거 같다
/** 게시글 목록 조회
* @param boardCode
* @param cp
* @return map
*/
Map<String, Object> selectBoardList(int boardCode, int cp);
// 게시글 목록 조회
@Override
public Map<String, Object> selectBoardList(int boardCode, int cp) {
// 1. 특정 게시판의 삭제되지 않은 게시글 수 조회
int listCount = dao.getListCount(boardCode);
// 2. 1번 조회 결과 + cp를 이용해서 Pagination 객체 생성
// -> 내부 필드가 모두 계산되어 초기화됨
Pagination pagination = new Pagination(cp, listCount);
// 3. 특정 게시판에서 현재 페이지에 해당하는 부분에 대한 게시글 목록 조회
// (어떤 게시판 (boardCode)에서 몇 페이지(pagination.currentPage)에 대한 게시글 몇개인지(pagination.limit) 조회 )
List<Board> boardList = dao.selectBoardList(pagination, boardCode);
// 4. pagination, boardList를 Map에 담아서 반환
Map<String, Object> map = new HashMap<String, Object>();
map.put("pagination", pagination);
map.put("boardList", boardList);
return map;
}
/** 특정 게시판의 삭제되지 않은 게시글 수 조회
* @param boardCode
* @return listCount
*/
public int getListCount(int boardCode) {
return sqlSession.selectOne("boardMapper.getListCount", boardCode);
}
/** 특정 게시판에서 현재 게시판에 해당하는 부분에 대한 게시글 목록 조회
* @param pagination
* @param boardCode
* @return
*/
public List<Board> selectBoardList(Pagination pagination, int boardCode) {
// RowBounds 객체
// - 마이바티스에서 페이징 처리를 위해 제공하는 객체
// - offset 만큼 건너 뛰고
// 그 다음 지정된 행 개수(limit) 만큼 조회
// 1) offset 계산
int offset
= (pagination.getCurrentPage() -1) * pagination.getLimit();
// 2) RowBounds 객체 생성
RowBounds rowBounds = new RowBounds(offset, pagination.getLimit());
// 3) selectList("namespace.id", 파라미터, RowBounds) 호출
return sqlSession.selectList("boardMapper.selectBoardList", boardCode, rowBounds);
}
<!-- 특정 게시판의 삭제되지 않은 게시글 수 조회 -->
<select id="getListCount" resultType="_int">
SELECT COUNT(*) FROM BOARD
WHERE BOARD_DEL_FL = 'N'
AND BOARD_CODE = #{boardCode}
</select>
<!-- CDATA 태그 : 해당 태그 내부에 작성된 것은 모두 문자로 취급 -->
<!-- 게시글 목록 조회 -->
<select id="selectBoardList" resultMap="board_rm">
SELECT BOARD_NO, BOARD_TITLE, MEMBER_NICKNAME, READ_COUNT,
<![CDATA[
CASE
WHEN SYSDATE - B_CREATE_DATE < 1/24/60
THEN FLOOR( (SYSDATE - B_CREATE_DATE) * 24 * 60 * 60 ) || '초 전'
WHEN SYSDATE - B_CREATE_DATE < 1/24
THEN FLOOR( (SYSDATE - B_CREATE_DATE) * 24 * 60) || '분 전'
WHEN SYSDATE - B_CREATE_DATE < 1
THEN FLOOR( (SYSDATE - B_CREATE_DATE) * 24) || '시간 전'
ELSE TO_CHAR(B_CREATE_DATE, 'YYYY-MM-DD')
END B_CREATE_DATE,
]]>
(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,
(SELECT IMG_PATH || IMG_RENAME FROM BOARD_IMG I
WHERE I.BOARD_NO = B.BOARD_NO
AND IMG_ORDER = 0) THUMBNAIL
FROM "BOARD" B
JOIN "MEMBER" USING(MEMBER_NO)
WHERE BOARD_DEL_FL = 'N'
AND BOARD_CODE = #{boardCode}
ORDER BY BOARD_NO DESC
</select>
페이지네이션이 어려운데 나중에 게시판 예쁘게 꾸밀거 생각하니 더 열심히 해야겠다는 생각이 든 아자아자아자자 💪🏻💪🏻💪🏻!!!