[개발] 페이징과 정렬

이진규·2023년 1월 11일
1

시작

페이징과 정렬 기능을 구현한 것을 작성

페이징과 정렬 구현

  • PostController
	@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);
	}
  • PostService
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;
profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글