본문 바로가기

Backend

[SpringBoot] 게시판 만들기 (advanced type) (7) - 페이징 처리

반응형

게시판에서 구현해낼 수 있는 마지막은 페이징 처리라고 생각한다. JPA에서는 Pageable 인터페이스를 통해 쉽게 필요한 만큼의 데이터만 가져오게 해줄 수 있다. 페 이지 번호, 페이지당 항목 수, 필요에 따라 정렬 정보 등 default 값으로 미리 설정해둘수도, 쿼리 파라미터에 입력하여 활용할 수도 있다. 

Pagination 작업 도입 이전에는 List<BoardResponseListDto>를 활용해서 dto를 리스트 형태로 반환했다. 하지만 페이징을 도입하기 위해서는 java에 존재하는 Page class를 활용해서 리턴해야한다고 한다. 게시글 목록 뿐만 아니라, 페이징 작업의 메타데이터가 함께 담겨서 프론트단으로 넘어가야해서라고 이해했다.

 

@GetMapping("/list")
public ResponseEntity<Page<BoardResponseListDto>> boardList(
        @PageableDefault(size = 10, sort = "id", direction = Sort.Direction.DESC)Pageable pageable
        ){
    Page<BoardResponseListDto> allBoards = boardService.getAllBoards(pageable);
    return ResponseEntity.status(HttpStatus.OK).body(allBoards);
}

게시글은 보통 최신순, 즉 게시글 id가 내림차순으로 나열된다. @PageableDefault 어노테이션을 활용해 미리 디폴트값을 지정해주었다 (커스텀 진행) 

 

    // 전체 게시물 조회(홈화면)
    
    public Page<BoardResponseListDto> getAllBoards(Pageable pageable){
        Page<Board> boardList = boardRepository.findAll(pageable);
        List<BoardResponseListDto> returnList = boardList.stream().map(BoardResponseListDto::fromEntity).toList();
        return new PageImpl<>(returnList, pageable, boardList.getTotalElements());
    }

db에서 게시글들을 가져와서 DTO로 변환시키는 작업을 수행한 후, Page인터페이스 구현체에 담아서 리턴해준다.

 

@Test
@DisplayName("페이징처리")
public void pageTest(){
   Pageable pageable = PageRequest.of(0,2);
   Page<BoardResponseListDto> allBoards = boardService.getAllBoards(pageable);
   logger.info(allBoards.getContent());
}

간단하게 테스트코드도 작성했다. PageRequest.of() 안의 파라미터 순서는 pagenumber,pagesize 값이다.

내림차순 설정을 넣지 않았기 때문에 logger로 값을 찍어봤을 때, boardId가 1,2번의 게시글이 리턴되는 것을 확인할 수 있었다.

 

http://localhost:8080/board/list?page=0&size=2 

해당 url로 postman을 활용해 실행시킨 결과이다. default값으로 DESC 내림차순 설정이 들어있어 boardId가 큰 게시글부터 두개씩 가져온 결과이다. 

http://localhost:8080/board/list?page=1&size=2  로 전송했을 땐 그 다음 게시글 두개가 리턴된 것을 확인할 수 있었다.

"pageable": {
        "pageNumber": 1,
        "pageSize": 2,
        "sort": {
            "empty": false,
            "sorted": true,
            "unsorted": false
        },
        "offset": 2,
        "paged": true,
        "unpaged": false
    },
    "last": false,
    "totalPages": 3,
    "totalElements": 5,
    "size": 2,
    "number": 1,
    "sort": {
        "empty": false,
        "sorted": true,
        "unsorted": false
    },
    "first": false,
    "numberOfElements": 2,
    "empty": false

 

다음은 페이지의 메타데이터 정보이다. 이 정보를 바탕으로 프론트단에서는 UI처리를 진행할 것으로 예상했다.

 


일단 게시판 만들기는 여기까지만 구현하려고 한다. 이젠 프론트팀과 회의하면서 프로젝트를 준비해야하기 때문이다.

다시 한번 미숙했던 개념들을 되새길 수 있는 기회가 되었던 것 같다. 혹시 풀스택 개발자가 된다면,, 이 게시판 코드를 가지고 UI도 깔끔하게 만들 수 있지 않을까? 라는 생각도 든다. -FIN-

반응형