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;
}
'Project > TIL, WIL' 카테고리의 다른 글
TIL(47) 21-12-07: ElasticBeanstalk으로 백엔드 아키텍처 구성하고 GithubAction으로 프로젝트 배포 (0) | 2021.12.27 |
---|---|
TIL(46) 21-12-06: S3와 CloudFront로 프론트엔드 인프라 구성하기 (0) | 2021.12.27 |
TIL(44) 21-11-30 : S3와 CloudFront를 이용한 사진 업로드 구현하기 (0) | 2021.12.25 |
TIL(43) 21-11-28 : Spring Secruity 사용하여, 인증 인가 구현하기 (0) | 2021.12.25 |
TIL(42) 11/22 - 11/27 : TDP 사이트 Flask 👉🏻 Spring (0) | 2021.12.22 |