Search

[스프링 게시판] 게시판 페이징 기초

@3/10/2023

페이징 공식

페이지 번호 → 첫번째 게시글 인덱스 변환(DB 쿼리에 사용)
firstIndex / size + 1 = pageNum
Java
복사
firstIndex = (pageNum - 1) * size
Java
복사
페이지 번호 → 첫번째 페이지 변환 (view 페이지에 사용)
startPage = (pageNum - 1) / 5 + 1;
Java
복사
5는 보여줄 페이지 버튼 개수

JPA 페이징 처리

setFirstResult와 getResultList 이용
PostRepository
public List<PostListDTO> findAll(int offset, int limit) { String query = "select new dev.gyuray.forum.repository.post.PostListDTO(" + "p.id, " + "p.title, " + "u.name, " + "p.regDate, " + "p.view" + ") " + "from Post p " + "join p.user u " + "order by p.id desc"; return em.createQuery(query, PostListDTO.class) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); }
Java
복사
PostService
public List<PostListDTO> findAll(int pageNum, int pageSize) { int firstIndex = (pageNum - 1) * pageSize; return postRepository.findAll(firstIndex, pageSize); }
Java
복사

컨트롤러 변경

기존 홈 컨트롤러 - 게시판 컨트롤러로 리다이렉트
@Controller @RequiredArgsConstructor @Slf4j public class HomeController { private final PostService postService; @GetMapping("/") public String home(Model model) { return "redirect:/posts/1"; } }
Java
복사
게시판 컨트롤러
@Controller @RequiredArgsConstructor @Slf4j public class PostController { private final PostService postService; @GetMapping("/posts/{pageNum}") public String postList( @PathVariable Integer pageNum, @CookieValue(required = false) Integer pageSize, Model model ) { if (pageSize == null) pageSize = 10; List<PostListDTO> postListDTOs = postService.findAll(pageNum, pageSize); model.addAttribute("postListDTOs", postListDTOs); return "index"; } }
Java
복사

상대 경로 문제

게시판 컨트롤러를 /에서 /posts로 바꿨더니 아이콘 상대경로쪽에 문제가 생김
<img src="assets/spring.png" ...>
Java
복사
위를 상대경로를 아래처럼 절대경로로 바꿔줌
<img src="/assets/spring.png" ...>
Java
복사

페이지 링크 및 현재 페이지 하이라이팅

th:each로 첫페이지부터 5개 뽑기
<button th:each="pageNum : ${#numbers.sequence(startPage, startPage + 4)}" type="button" class="btn btn-light"> <a th:text="${pageNum}" class="nav-link" href="#"></a> </button>
Java
복사