[Spring Boot] REST API 게시판 서버 만들기 #6(Board 페이징 처리)

모든 소스는 github에서 관리하고 있습니다.

따라하시다가 미처 제가 신경쓰지 못한 부분이 있다면 이곳을 확인해주세요^^

 

 

목표 : getAll을 없애고 list 페이징 처리를 하여 페이지당 10개의 게시물을 가져올 수 있도록 한다.

 

 

파일별 설명

BoardController.java

 @GetMapping(
            value = "/list/{page}",
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE
)
public Object getList(@PathVariable("page") @Min(0) Integer page) throws Exception{
    return boardService.getBoard(page);
}

- 기존 getAll() 메소드에서 페이징 넘버를 추가하였습니다.

- 페이징은 zero based Index로 처리될 것이며 흔히 1페이지라고 불리는 것을 0으로 처리하겠습니다.

 

 

BoardRepository.java

@Repository
public interface BoardRepository extends JpaRepository<BoardEntity, Long> {
    Page<BoardEntity> findAll(Pageable pageable);
}

- Page 객체를 반환하는 findAll 메소드를 선언해줍니다.

- 파라미터로 Pageable 객체를 던져주게 되면 선언된 @Id 태그(BoardEntity 기준 seq 컬럼.) 순으로 기본 정렬된 페이징 처리된 Page 객체를 반환하게 됩니다.

- service 로직에서 메소드를 호출할 때 Pageable 객체에 페이지페이징할 갯수(보통 10개)를 정해주면 됩니다.

 

 

BoardService.java

    @Transactional
    public List<BoardResult> getBoard(Integer page){
        Page<BoardEntity> boards = boardRepository.findAll(PageRequest.of(page, 10));

        List<BoardResult> results = boards.getContent().stream().map(boardEntity ->
                sourceToDestination(boardEntity, new BoardResult())
        ).collect(Collectors.toList());

        return results;
    }

- 앞서 repository 인터페이스에 정의한 findAll 메소드의 인자로 PageRequest의 static 메소드인 of() 메소드를 호출하였습니다.

- of(int page, int size) : 가져올 페이지(zero based)와, 크기(한페이지당 몇개)를 정해주면 됩니다.

- 그렇게 되면 Page객체를 반환하게 되는데 인스턴스에서 getContent() 메소드를 호출하게되면 페이징처리된 BoardEntity List객체를 반환하게 됩니다.

- 이후는 stream lamda를 이용하여 함수형으로 처리합니다.

 

 

테스트코드

- BoardControllerTests

    @Test
    public void getBoard() throws Exception {
        mockMvc.perform(get("/api/boards/list/0")
                .contentType("application/json;charset=utf-8")
                .accept("application/json;charset=utf-8"))
                .andDo(print())
                .andExpect(status().isOk());
    }

 

결과

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json;charset=utf-8"]
     Content type = application/json;charset=utf-8
             Body = {"code":200,"message":"success","result":[{"seq":1,"content":"내용1","user":{"seq":2,"id":"doqndnf1","name":"유저1","savedTime":"2020-02-20T22:52:39.828"},"title":"제목1","savedTime":"2020-02-20T22:52:39.828"},{"seq":3,"content":"내용2","user":{"seq":4,"id":"doqndnf2","name":"유저2","savedTime":"2020-02-20T22:52:39.912"},"title":"제목2","savedTime":"2020-02-20T22:52:39.912"},{"seq":5,"content":"내용3","user":{"seq":6,"id":"doqndnf3","name":"유저3","savedTime":"2020-02-20T22:52:39.916"},"title":"제목3","savedTime":"2020-02-20T22:52:39.916"},{"seq":7,"content":"내용4","user":{"seq":8,"id":"doqndnf4","name":"유저4","savedTime":"2020-02-20T22:52:39.919"},"title":"제목4","savedTime":"2020-02-20T22:52:39.919"},{"seq":9,"content":"내용5","user":{"seq":10,"id":"doqndnf5","name":"유저5","savedTime":"2020-02-20T22:52:39.922"},"title":"제목5","savedTime":"2020-02-20T22:52:39.922"},{"seq":11,"content":"내용6","user":{"seq":12,"id":"doqndnf6","name":"유저6","savedTime":"2020-02-20T22:52:39.925"},"title":"제목6","savedTime":"2020-02-20T22:52:39.925"},{"seq":13,"content":"내용7","user":{"seq":14,"id":"doqndnf7","name":"유저7","savedTime":"2020-02-20T22:52:39.929"},"title":"제목7","savedTime":"2020-02-20T22:52:39.929"},{"seq":15,"content":"내용8","user":{"seq":16,"id":"doqndnf8","name":"유저8","savedTime":"2020-02-20T22:52:39.933"},"title":"제목8","savedTime":"2020-02-20T22:52:39.933"},{"seq":17,"content":"내용9","user":{"seq":18,"id":"doqndnf9","name":"유저9","savedTime":"2020-02-20T22:52:39.937"},"title":"제목9","savedTime":"2020-02-20T22:52:39.937"},{"seq":19,"content":"내용10","user":{"seq":20,"id":"doqndnf10","name":"유저10","savedTime":"2020-02-20T22:52:39.94"},"title":"제목10","savedTime":"2020-02-20T22:52:39.941"}]}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

댓글

Designed by JB FACTORY