학습 목표
- 페이징 게시판 의 핵심 개념을 안다
- LIMIT 시작행, 개수 의 동작을 안다 (MySQL)
- 스키마는 그대로 — SQL 만 바뀐다.
1. 문제
글이 100 개가 되면 화면이 망가진다. 한 페이지에 다 보여줄 수 없음.
2. 새 도구
LIMIT 시작행, 개수: MySQL 페이징. 스키마 변경 없이 SQL 만 추가. Paging 보조 클래스 (도메인 아님) 로 화면 계산.
3. 코드
<!-- 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>
// com.smhrd.domain.Paging — 보조 클래스 (도메인 아님)
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); }
}
// BoardService
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);
}
<!-- list.jsp 의 페이지 번호 -->
<c:forEach begin="1" end="${paging.totalPages}" var="p">
<a href="?page=${p}">${p}</a>
</c:forEach>
4. 정리
- LIMIT #{startRow}, #{pageSize} (MySQL)
- 총 개수는 별도 COUNT(*) 쿼리
- Paging 보조 클래스 — 도메인이 아님
- 스키마는 v6 그대로 — v7 보강
5. Before / After
전 차시
글이 100 개가 되면 화면이 망가진다. 한 페이지에 다 보여줄 수 없음.
이번 차시
페이징의 SQL 패턴과 화면 구현을 안다. v7.
학습 확인 체크리스트
- LIMIT #{startRow}, #{pageSize} (MySQL)
- 총 개수는 별도 COUNT(*) 쿼리
- Paging 보조 클래스 (도메인 아님)
- 스키마는 v6 그대로