메인 페이지에 책에 대한 정보를 표출해 주어야하는 과정에서 원했던 방식은 랜덤하게 몇 개만 DB에서 가지고 와서 프론트에 표출해주는 것이었는데, 머리로는 어떻게 하면 되겠다 라는 생각을 했지만 구현하지 못했다.
생각했던 방향은 컨트롤러에서 main 페이지를 호출해주고 service 에서 메소드를 실행하면, repository를 통해 책의 id 를 가지고 온 뒤 랜덤하게 반환해주고, 그 반환된 id 를 가지고 타임리프를 통해 원하는 값을 매칭해주면 되겠다!
였는데 막상 들어가서 해보려니 아무것도 하지못했다. (추후에 꼭 다시 해봐야겠다.)
결국 이것저것 찾아보면서 따라해본 방법은 타임리프를 통한 페이징 방법!
방법은 Pageable 인터페이스를 사용한 방법이라고한다.
Thymeleaf를 사용해 구현해보자!
1. Pageable를 사용해 컨트롤러 구현
@GetMapping("/main")
public String bookList(Model model, @PageableDefault(page=0,size=10, sort = "id",
direction = Sort.Direction.DESC) Pageable pageable) {
model.addAttribute("list", boardService.boardList(pageable));
return "main";
}
- Pageable 인터페이스를 통해 페이징 정보를 설정 할 수 있음
- page = 현재 페이지로 인덱스 0부터 시작
- size = 한 페이지 당 허용되는 데이터의 개수
- sort = 정렬 조건
- direction = 내림차순, 오름차순
- pageable을 매개변수로 사용해 요청이 오면 JpaRepository는 그에 해당하는 pageable 객체를 자동으로 만들어 줌
2. 서비스 구현
public Page<Book> bookList(Pageable pageable) {
return bookRepository.findAll(pageable);
}
3. Repository 설정
public interface BookRepository extends JpaRepository<Book, Long> {
List<Book> findAll();
}
4. 페이지 블럭을 view로 넘겨주기 위한 컨트롤러 작성
@GetMapping("/main")
public String bookList(Model model, @PageableDefault(page=0,size=10, sort = "id",
direction = Sort.Direction.DESC) Pageable pageable) {
Page<Book> list = bookService.bookList(pageable);
int nowPage = list.getPageable().getPageNumber() + 1;
int startPage = Math.max(nowPage -4, 1);
int endPage = Math.min(nowPage + 9, list.getTotalPages());
model.addAttribute("list", list);
model.addAttribute("nowPage", nowPage);
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);
return "main";
}
- int nowPage = list.getPageable().getPageNumber() + 1; - 현재 페이지를 나타내는 변수로 페이지 index가 0부터 시작하기에 +1을 해줌
- int startPage = Math.max(nowPage -4, 1); - 현재 페이지에서 가장 앞에 페이지 번호를 보여줄 변수 (max 함수를 사용하는 이유=> 현재페이지에서 -4를 해줬을 때 1보다 작은 수가 나오면 안되기에 1 또는 현재페이지 -4를 했을 때 더 큰 값을 쓰기 위해 사용)
- int endPage = Math.min(nowPage + 9, list.getTotalPages()); - 현재 페이지에서 가장 뒤에 페이지 번호를 보여줄 변수 (min 함수 사용 이유 => 해당 번호가 넘어가버리면 안되기 때문. 페이지가 11까지 있을 때 현재 페이지가 3이라면 12까지 보이기 때문에 최소값을 구하는 방식으로 진행)
728x90
'ssung_항해일지 > 항해99_실전 프로젝트' 카테고리의 다른 글
실전 프로젝트 - 12일차 (0) | 2023.03.21 |
---|---|
실전 프로젝트 - 11일차 (0) | 2023.03.20 |
실전 프로젝트 - 8일차 (0) | 2023.03.17 |
실전 프로젝트 - 7일차 (0) | 2023.03.16 |
실전 프로젝트 - 5일차 (0) | 2023.03.15 |