본문 바로가기
Team Project/TIL, WIL

TIL(45) 21-12-03 : Spring에서 게시글 Pagination 처리하기

by 감사쟁이야 2021. 12. 27.

Facts

오늘은 게시글 전체와, 게시글 검색결과를 Pagination처리를 해주었다.

Findings

Pagination 처리

  • 🤔 왜 Pagination처리를 해줄까?
    만약, 검색을 할 때, 검색 결과 값이 수천만 개의 문서를 Json 형식으로 받는다면?
    메모리가 감당이 되지 않을 것이다.
    그러므로, Pagination 처리는 필수적이다.
    Youtube도 다 Pagination처리를 해서 제공한다.
    무한 스크롤로 보이겠지만, 어느 정도 스크롤을 내리면, 로딩 후에 데이터를 제공한다.
    이것도 Pagination 처리를 해줘서 제공해주는 것이다.

  • TilRepository
    pageable이라는 라이브러리를 사용하면, Page object 형식의 게시글들을 가져올 수 있다.
public interface TilRepository extends JpaRepository<Til, Long> {
    Page<Til> findAllByOrderByIdDesc(Pageable pageable);
    Page<Til> findAllByUser(User user, Pageable pageable);
    Page<Til> findAllByTilTitle(String til_title, Pageable pageable);
    Page<Til> findAllByTagsName(String keyword, Pageable pageable);
}​
  • TilService
public Page<Til> getTilList(int page, int size) {
        Pageable pageable = PageRequest.of(page, size);
        return tilRepository.findAllByOrderByIdDesc(pageable);
}

 public Page<Til> SearchTil(int page, int size, String keyword, String setting) {
        Pageable pageable = PageRequest.of(page, size);

        if(setting.equals("제목")) {  return tilRepository.findAllByTilTitle(keyword, pageable);    }
        else if(setting.equals("작성자")) {
        	 User user = userRepository.findByUsername(keyword)
                    .orElseThrow(() -> new UsernameNotFoundException("해당 작성자 없음"));
            return tilRepository.findAllByUser(user, pageable);
        }
        else {  return tilRepository.findAllByTagsName(keyword, pageable);    }
}
  • TilController
    client로 부터, 조회하고 싶은 게시글의 페이지와 한 페이지당 게시글의 수를 받는다.
    client에게 Pagination 처리된 결과를 TilListDto에 담아 전달한다.
@GetMapping("/til_board")
public TilListDto getTilList(@RequestParam int page, @AuthenticationPrincipal UserDetailsImpl userDetails) {
	page --;
	int size = 10;
    
	Page<Til> tils = tilService.getTilList(page, size, userDetails.getUser());
	TilListDto tilList = TilListDto.builder()
                .tils(tils)
                .page(tils.getNumber())
                .size(tils.getSize())
                .totalPages(tils.getTotalPages()).build();
	return tilList;
 }
@GetMapping("/til/search")
public TilListDto searchTil(@RequestParam int page, @RequestParam String keyword, @RequestParam String setting, @AuthenticationPrincipal UserDetailsImpl userDetails){
	page --;
	int size = 10;
    
	Page<Til> tils = tilService.searchTil(page, size, keyword, setting, userDetails.getUser());
	TilListDto tilList = TilListDto.builder()
                .tils(tils)
                .page(tils.getNumber())
                .size(tils.getSize())
                .totalPages(tils.getTotalPages()).build();
	return tilList;

}
  • TilListDto
    Pagination 처리된 결과를 전송할 객체 TilListDto를 만들어주었다.
    Pagination 처리된 결과의 til과 til의 해당 page, size, totalPages를 담아 client에게 보내준다.
@NoArgsConstructor
@Builder
@Data
@AllArgsConstructor
public class TilListDto {

    private Page<Til> tils;

    private int page;
    private int size;
    private int totalPages;

}​