오늘은 Part 2. 게시판 서비스 강의의 `게시판 페이징 구현` 부분을 학습하였다.
페이지네이션 서비스 구현
페이지네이션을 스프링 서비스 빈 형태로 설계하여 현재 페이지와 총 페이지 수를 넣어주면 페이지 바에 사용할 번호 리스트를 반환하게 설계하였다.
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.IntStream;
@Service
public class PaginationService {
private static final int BAR_LENGTH = 5;
public List<Integer> getPaginationBarNumbers(int currentPageNumber, int totalPages) {
int startNumber = Math.max(currentPageNumber - (BAR_LENGTH / 2), 0);
int endNumber = Math.min(startNumber + BAR_LENGTH, totalPages);
return IntStream.range(startNumber, endNumber).boxed().toList();
}
public int currentBarLength(){
return BAR_LENGTH;
}
}
바 길이는 5로 해주었다.
페이지네이션을 컨트롤러에 반영
@GetMapping
public String articles(
@RequestParam(required = false)SearchType searchType,
@RequestParam(required = false)String searchValue,
@PageableDefault(size=10,sort="createdAt",direction = Sort.Direction.DESC) Pageable pageable,
ModelMap map
){
Page<ArticleResponse> articles = articleService.searchArticles(searchType, searchValue, pageable).map(ArticleResponse::from);
List<Integer> barNumbers = paginationService.getPaginationBarNumbers(pageable.getPageNumber(), articles.getTotalPages());
map.addAttribute("articles", articles);
map.addAttribute("paginationBarNumbers", barNumbers);
return "articles/index";
}
컨트롤러에 바에 사용할 번호리스트를 받아와서 뷰에 barNumbers에 전달하는 코드를 추가하였다.
@ParameterizedTest - @MethodSource
@MethodSource를 사용해 복잡한 인수들을 파라미터로 넘길 수 있다.
Stream을 반환하는 static 메서드를 작성해주면 된다.