이용후기 게시판은 글번호, 제목, 작성자, 작성일, 조회수를 보여주고 페이징 처리로 한 페이지에 글 10개씩 보여진다.
최신 작성일이 상단에 오도록 정렬했고 제목을 클릭하면 상세 게시글을 볼 수 있다.
❗조회수 증가는 나중에 포스팅할 예정이다.
✂️게시판
✂️페이징 처리
1. 페이징 처리로 글 10개씩 보이기
2. 최신 작성일 기준으로 상단 정렬
private int reviewNum;
private String title;
private String content;
private String regDate;
private int hitNum;
private String writer;
public void setRegDate(java.sql.Timestamp regDate) {
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
this.regDate = format.format(regDate);
}
게시판에 필요한 dto(글 번호, 제목,내용, 작성일, 조회수, 작성자)를 만들었다.
작성일은 SimpleDateFormat
을 이용해서 날짜 출력 포맷을 변경해준다.
📕sql
box_board add constraint fk_mem foreign key(writer) references box_member(buser_id) on delete cascade;
회원이 삭제되면 해당 회원이 작성한 게시글도 삭제되도록 제약 조건을 sql에 추가해준다.
<table class="board-table">
<tr>
<th scope="col" class="th-num">번호</th>
<th scope="col" class="th-title">제목</th>
<th scope="col" class="th-writer">글쓴이</th>
<th scope="col" class="th-date">작성날짜</th>
<th scope="col" class="th-view">조회수</th>
</tr>
<c:forEach items="${boardList}" var="dto">
<tr>
<td>${dto.reviewNum }</td>
<th><a href="${contextPath }/board/reviewDetail?reviewNum=${dto.reviewNum}">${dto.title }</a></th>
<td>${dto.writer }</td>
<td>${dto.regDate }</td>
<td>${dto.hitNum }</td>
</tr>
</c:forEach>
</table>
<div class="paging">
<c:forEach var="num" begin="1" end="${repeat }">
<a href="review?num=${num }">${num }</a>
</c:forEach>
</div>
게시판 목록에 필요한 항목들을 <tr><th>
에 적어주고 c:forEach
문으로 게시글이 반복되도록한다.
dto에서 글번호, 작성자, 작성일, 조회수를 불러오고 제목은 링크를 달아서 클릭하면 상세글로 이동한다.
하단에 페이징 처리를 위한 코드를 작성해준다. 페이지는 1부터 시작하고 계속해서 늘어나기 때문에 반복문을 이용했다.
@GetMapping("review")
public String review(Model model,@RequestParam(required = false, defaultValue = "1")int num){
bs.boardList(model,num);
return "board/review";
}
db에 저장된 모든 값을 가져오는데 값이 없다면 default값으로 1을 준다.
페이징을 위해 int형 변수 num을 service로 보내고 게시판 목록페이지를 보여준다.
public void boardList(Model model,int num);
public void boardList( Model model,int num) {//db로 요청
int pageLetter = 10;//한 페이지에 10개씩
int allCount = mapper.selectPageCount(); //총 글에 대한 갯수 얻어오기
int repeat = allCount / pageLetter;//총 페이지수 구하기
if(allCount % pageLetter != 0) {
repeat += 1;
}
int end = num * pageLetter;
int start = end + 1 -pageLetter;
model.addAttribute("repeat", repeat);
model.addAttribute("boardList", mapper.boardList(start,end));
}
한 페이지에 글 10개씩 보여지도록 코드를 작성한다.
처음 페이지와 끝 페이지를 지정하고 반복되는 저장값을 model에 넣어 보여주고 시작/끝이 출력될 목록을 mapper로 보낸다.
public List<boardDTO> boardList(@Param("s") int start, @Param("e") int end);
게시판 dto를 List
형식으로 받아주고 2개이상의 값(처음/끝 페이지)을 넘기기 위해 @Param
을 사용해준다.
❗메핑 작업은 생략했다.
✔️페이징이 없는 쿼리문
<select id="boardList" resultMap="board"> select * from box_board </select>
페이징 처리를 하지 않는 경우는 db를 리스트로 가져오면 되기 때문에 쿼리문은 단순하다.
✔️ 페이징 처리로 변경된 쿼리문 (서브쿼리문사용)
<select id="boardList" resultMap="board">
select B.* from(select rownum
rn, A.* from
(select * from box_board order by list_num desc)A)B where rn between #{s} and #{e}
</select>
서브 쿼리문은 안쪽 부터 읽어준다.
select B. from (select rownum rn, A. from
(select * from box_board order by list_num desc)A )B
where rn between #{s} and #{e}
글 번호를 내림차순으로 정렬한 모든 값을 가져오고 그 값을 A라고 칭한다.
rownum을 rn 별칭, A에 대한 모든값을 표현하는데 이것을 B라고 칭한다.
B의 모든 값 중에서 rn에 대해 s와 e사이에 있는 값을 가지고온다.