v7
★ LAB · BOARD

페이징 게시판

회원과 게시판 — 실습

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

사전 준비

이번 실습의 목표

한 번에 일정 개수만 가져오고, 페이지 번호로 이동.

1
더미 데이터 100 건 + 부하 체감
-- 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 건이 한 화면에 쏟아지는 것을 직접 본다.

CHECKPOINT
  • MySQL SELECT COUNT(*) FROM myboard; 가 100 (이상) 인가?
  • v6 list 화면을 스크롤해야 끝까지 보이는가? — 「불편」을 직접 느끼고 다음 단계로.
2
Paging 보조 클래스 + Mapper / Service
// 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);
}
CHECKPOINT
  • SHOW COLUMNS FROM myboard; — v6 와 동일한 5 컬럼인가? (스키마 변경 없음)
  • MyBatis 로그에 LIMIT 0, 10 (1 페이지) 이 찍히는가?
3
Controller / JSP — 페이지 번호 UI
@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>
CHECKPOINT
  • ?page=2 로 이동했을 때 MyBatis SQL 로그가 LIMIT 10, 10 이 되는가?
  • 총 페이지 수가 ceil(전체/10) 과 일치하는가?
  • 현재 페이지 숫자만 굵게 보이는가?

실습 완료 체크리스트

100 건 더미 INSERT 후 v6 list 의 「불편」 체감
Paging 보조 클래스 — 도메인이 아닌 계산용
SQL 만 LIMIT 추가 — 스키마는 v6 그대로
페이지 번호 UI 동작 (현재 페이지 강조)