페이징과 정렬 기능을 구현한 것을 작성
@Operation(summary = "게시글 목록 조회", description = "게시글 구분(kind)값과 현재 페이지(page), 정렬 조건(orderby)를 파라미터로 받아 목록을 불러올 수 있습니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "게시글 목록 조회 성공", content = @Content(schema = @Schema(implementation = PostResponseDto.class))),
@ApiResponse(responseCode = "404", description = "존재하지 않는 리소스 접근", content = @Content(schema = @Schema(implementation = Error.class)))
})
@GetMapping("/lists/{kind}") // 게시글 목록 조회
public ResponseEntity<Page<PostResponseDto>> list(@Parameter(description = "게시글 구분 값", in = ParameterIn.PATH) @PathVariable @Min(1) @Max(3) Integer kind,
@Parameter(description = "현재 페이지 값", in = ParameterIn.PATH) @RequestParam(required = false, defaultValue = "0", value = "page") Integer page,
@Parameter(description = "정렬 조건(createdAt: 최신순, viewCnt: 조회순, recommendCnt: 추천순)", in = ParameterIn.PATH) @RequestParam(required = false, defaultValue = "createdAt", value = "orderby") String orderCriteria
) {
Page<PostResponseDto> postResponseDto = postService.getPostLists(kind, page, orderCriteria);
return new ResponseEntity<>(postResponseDto, HttpStatus.OK);
}
private static final int PAGE_POST_COUNT = 3; // 한 화면에 보일 컨텐츠 수
// 게시글 목록 조회
public Page<PostResponseDto> getPostLists(Integer kind, Integer page, String orderCriteria) {
/* 게시판 종류(kind), 정렬 조건(orderCriteria)에 따라 게시판 내용물을 불러온 후 반환
* 게시판 종류(kind) -> 1: 자유게시판, 2: 정보공유, 3: 중고거래
* 정렬 조건(orderCriteria) -> createdAt: 최신순, viewCnt: 조회순, recommendCnt: 추천순 */
/* 넘겨받은 orderCriteria 를 이용해 내림차순하여 PageRequest 객체 반환
* PageRequest는 Pageable 인터페이스를 구현한 구현체 */
PageRequest pageRequest = PageRequest.of(page, PAGE_POST_COUNT, Sort.by(Sort.Direction.DESC, orderCriteria));
// 게시판 종류(kind)에 해당하는 post 페이지 객체 반환
Page<Post> post = postRepository.findByKind(kind, pageRequest);
// 람다식을 활용하여 간단히 DTO로 변환
Page<PostResponseDto> postResponseDto = post.map(PostResponseDto::new);
return postResponseDto;