회원과 게시판 — 실습
한 번에 일정 개수만 가져오고, 페이지 번호로 이동.
-- MySQL 에서 100 건 INSERT
INSERT INTO myboard(title, writer, content)
SELECT CONCAT('테스트 글 ', seq), 'tester', '본문'
FROM (
SELECT @row := @row + 1 AS seq
FROM (SELECT 0 UNION SELECT 1 UNION SELECT 2) t1,
(SELECT 0 UNION SELECT 1 UNION SELECT 2) t2,
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) t3,
(SELECT @row := 0) r
) numbers
LIMIT 100;
v6 의 /board/list 에 들어가 100 건이 한 화면에 쏟아지는 것을 직접 본다.
SELECT COUNT(*) FROM myboard; 가 100 (이상) 인가?// com/smhrd/domain/Paging.java — 도메인 아님 (계산용)
public class Paging {
private int pageNo, pageSize, totalCount;
public Paging(int pageNo, int pageSize, int totalCount) {
this.pageNo = pageNo < 1 ? 1 : pageNo;
this.pageSize = pageSize;
this.totalCount = totalCount;
}
public int getStartRow() { return (pageNo - 1) * pageSize; }
public int getTotalPages() { return (int) Math.ceil((double) totalCount / pageSize); }
public int getPageNo() { return pageNo; }
public int getPageSize() { return pageSize; }
}
<!-- BoardMapper.xml — 스키마 변경 없음, SQL 만 추가 -->
<select id="selectListPaging" parameterType="map"
resultType="com.smhrd.domain.Board">
SELECT num, title, writer, content, created_at
FROM myboard
ORDER BY num DESC
LIMIT #{startRow}, #{pageSize}
</select>
<select id="count" resultType="int">
SELECT COUNT(*) FROM myboard
</select>
// BoardService
public Paging buildPaging(int pageNo) {
return new Paging(pageNo, 10, mapper.count());
}
public List<Board> selectListPaging(Paging paging) {
Map<String, Integer> param = new HashMap<>();
param.put("startRow", paging.getStartRow());
param.put("pageSize", paging.getPageSize());
return mapper.selectListPaging(param);
}
SHOW COLUMNS FROM myboard; — v6 와 동일한 5 컬럼인가? (스키마 변경 없음)LIMIT 0, 10 (1 페이지) 이 찍히는가?@GetMapping("/board/list")
public String list(@RequestParam(defaultValue = "1") int page,
Model model) {
Paging paging = service.buildPaging(page);
model.addAttribute("boards", service.selectListPaging(paging));
model.addAttribute("paging", paging);
return "board/list";
}
<!-- list.jsp -->
<c:forEach var="b" items="${boards}">
<tr><td>${b.num}</td><td>${b.title}</td><td>${b.writer}</td></tr>
</c:forEach>
<c:forEach begin="1" end="${paging.totalPages}" var="p">
<c:choose>
<c:when test="${p == paging.pageNo}"><strong>${p}</strong></c:when>
<c:otherwise><a href="?page=${p}">${p}</a></c:otherwise>
</c:choose>
</c:forEach>
?page=2 로 이동했을 때 MyBatis SQL 로그가 LIMIT 10, 10 이 되는가?ceil(전체/10) 과 일치하는가?