
한 줄 요약 — 클로드코드가 만든 커스텀 페이저 템플릿에 $pager->setSurroundCount() 호출이 빠져 있었고, CI4 PagerRenderer는 이 값이 없으면 첫 페이지부터 마지막 페이지까지 전부 그립니다. 한 줄을 추가해서 해결했습니다.
증상
미단재 게시판에 글이 쌓이면서 목록 하단 페이지네이션이 1부터 41까지 한 줄로 전부 출력됐습니다. 화면 폭을 넘어 가로로 삐져나갔고, 모바일에서는 더 심했습니다. 글이 몇 개 없을 때는 페이지가 두세 개뿐이라 아무도 몰랐습니다. 데이터가 쌓여야 드러나는 버그였습니다.
원인
CI4 기본 템플릿(default_full.php)은 첫 줄이 이렇습니다.
php
setSurroundCount(2) ?>
이 호출이 현재 페이지 앞뒤로 몇 개를 보여줄지 정하고, 그 결과로 first와 last 범위를 다시 계산합니다. 그런데 PagerRenderer 생성자는 처음에 first = 1, last = pageCount로 초기화합니다. 그래서 setSurroundCount()를 부르지 않으면 범위가 전체 페이지가 됩니다.
클로드코드는 디자인에 맞춰 페이저 뷰를 새로 짜면서
- 마크업과 클래스는 깔끔하게 만들었지만, 기본 템플릿 맨 위의 이 한 줄은 가져오지 않았습니다. 화면만 보고 옮기면 이 줄은 "출력"이 아니라 "설정"이라서 눈에 띄지 않습니다.
수정
php
setSurroundCount(2) ?>
참고로 hasPrevious()/hasNext()도 surround 범위 기준으로 동작합니다. 범위가 전체라면 "이전/다음" 버튼도 영원히 나오지 않습니다. 같은 뿌리에서 나온 두 번째 증상이었습니다.
혹시 몰라서 CSS에도 안전장치를 하나 걸었습니다.
css
.pagination { display: flex; flex-wrap: wrap; gap: 4px; }
배운 것
- AI는 보이는 것을 옮긴다. 마크업, 클래스, 링크 출력은 완벽했습니다. 빠진 것은 출력 없이 상태만 바꾸는 한 줄이었습니다. 프레임워크 기본 템플릿을 커스터마이징하라고 시킬 때는 "기본 템플릿에서 시작해서 마크업만 바꿔라"라고 지시하는 편이 안전합니다.
- 빈 DB로 하는 테스트는 페이징을 검증하지 못한다. 페이지가 3개일 때는 "전부 출력"과 "앞뒤 2개 출력"의 결과가 똑같습니다. 시더로 글을 수백 개 넣고 중간 페이지(예: 20페이지)를 열어보는 것을 체크리스트에 추가했습니다.
- CLAUDE.md에 한 줄 추가. “CI4 페이저 뷰를 만들 때는 반드시
setSurroundCount()를 첫 줄에 호출할 것.”
댓글 1개
정말?