@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
복사