[Spring Boot] REST API 게시판 서버 만들기 #6(Board 페이징 처리)
- 웹 개발/Spring Boot
- 2020. 2. 20. 22:56
모든 소스는 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: |