v7
★ PART · BOARD

페이징 게시판

회원과 게시판 — 읽기 자료

📍 지금 어디를 만지고 있나요?
브라우저
회원과 게시판
DB

핵심 용어

LIMIT 시작행, 개수MySQL 페이징 SQL.
Paging페이지 계산용 보조 클래스 (도메인 아님).

1. 문제

전 차시까지의 답답함

글이 100 개가 되면 화면이 망가진다. 한 페이지에 다 보여줄 수 없음.

2. 새 도구

LIMIT 시작행, 개수

스키마 변경 없이 SQL 만 바꿈. myboard 컬럼은 v6 그대로.

3. 코드

// BoardMapper.xml
<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); }
    // getter
}

// 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. 정리

5. Before / After

전 차시 끝

글이 100 개가 되면 화면이 망가진다. 한 페이지에 다 보여줄 수 없음.

이번 차시 끝

페이징의 SQL 패턴과 화면 구현을 안다. v7.