페이징 적용

Yuri Lee·2020년 12월 10일
0

고전적인 방식의 페이징

  • SQL의 limit과 offset 사용하기
    • limit : 몇개까지의 데이터를 가져오겠다.
    • offset : 앞에 몇개를 떼어서 가져오겠다. (ex. 첫번째 페이지는 offset 이 1일 것)

스프링 데이터 JPA가 제공하는 Pageable 사용하기

  • page와 size
  • sort도 지원한다.
  • 기본값 설정하는 방법 @PageableDefault

이전에 emtpy 콜렉션을 Model에 넣을 때 발생했던 버그(?)에 대하여...

  • 사실 버그가 아니라 스프링 MVC의 정해진 동작 방식. (이상하긴 하지만..)
  • 우회하려면 이름을 반드시 줄 것.

Test data 를 만들었다. jpa 를 태그로 다 넣어주기로..
빌더의 문제 😫 set의 기본값이 셋팅이 안된다. null값..

다음과 같이 테스트 데이터가 다 채워졌음을 확인할 수 있다.

        JPQLQuery<Study> pageableQuery = getQuerydsl().applyPagination(pageable, query);
        QueryResults<Study> fetchResults = pageableQuery.fetchResults();
        return new PageImpl<>(fetchResults.getResults(), pageable, fetchResults.getTotal());// 쿼리 실행, study의 목록을 가져올 수 있음

getQuerydsl을 가져온다. 이것은 QuerydslRepositorySupport가 지원해주고 있다. 여기 안에 보면 applyPagination 라는 게 있다. 이를 query에 적용해준다. 그럼 그게 적용된 (페이지가 적용된) query가 나온다.

fetch는 데이터만 가져온다. 따라서 fetchResults 를 사용해야 한다. 그래야 페이징과 관련된 데이터들도 같이 꺼내오기 때문이다. 이를 사용해서 페이지를 리턴! 이 때문에 pageImpl라는 구현체를 만들어준다. 첫번째 파라미터는 content list 이다.

search.html
page type 이 제공하는 기능들을 사용하면 된다. getTotalElements는 전체 개수를 의미한다. 이게 0 이면 없는 거니까 없는 메시지를 보여주면 된다.

MainController.java

	@GetMapping("/search/study")
	public String searchStudy(String keyword, Model model, @PageableDefault(size = 9, sort = "publishedDateTime",
			direction = Sort.Direction.DESC)Pageable pageable) {
		Page<Study> studyPage  = studyRepository.findByKeyword(keyword, pageable);
		model.addAttribute("studyPage", studyPage );
		model.addAttribute("keyword",keyword); //화면에서 어떤 키워드로 조회했는지 알아야 하므로 keyword 넣어줌
		return "search";
	}

한 페이지의 기본 값이 20 이다. 기본값으로 9개만 조회하고 싶을 경우 , 기본 정렬 조건은 날짜로 할 것이다.

  • DESC(역순) : 가장 최근에 만들어진 study 부터 보여줌

출처 : 인프런 백기선님의 스프링과 JPA 기반 웹 애플리케이션 개발

profile
Step by step goes a long way ✨

0개의 댓글