카테고리 없음

20240913Fri Page / Pageable Version.1

ddh1713 2024. 9. 13. 15:57
1. Page / Pageable

 

[1] TodoController

@GetMapping("/v1/newsfeed")
public Page<TodoNewsfeedDto> getTodoNewsfeed(
		@RequestParam(default = "1", name = "page") int page,
        @RequestParam(defualt = "10") int size) {
        
    return todoService.getTodoNewsfeed(page, size);
}
@GetMapping("/v1/newsfeed")
/v1/newsfeed : API 버전 1 을 의미하며, 추후 API가 발전하거나 변경될 가능성이 있음을 나타냅니다. v1 경로는 추후 다른 버전의 API와 구분을 하기 위해 사용됩니다.

 

@RequestParam : 요청에서 특정 파라미터 값을 가져오는 역할을 합니다.

@RequestParam(defaultValue = "1", name = "page")
defaultValue = "1" 은 클라이언트가 페이지 번호를 전달하지 않은 경우 기본 값을 1로 설정한다는 의미입니다.
name = "page" 는 파라미터 이름을 지정하는 것으로, 클라이언트가 요청할 때 page 라는 이름의 쿼리 파라미터를 통해 페이지 번호를 전달해야 합니다. 예를 들어, GET /v1/newsfeed?page=2 라면 2페이지를 요청하게 됩니다.
@RequestParam(defaultValue = "10", name = "size)
 위의 설명과 마찬가지로, defaultValue = "10" 은 기본값이 10으로 설정되어 있어 클라이언트가 별도의 크기를 지정하지 않으면, 한 페이지당 10개의 뉴스피드 항목을 반환합니다.
name = "size" 는 클라이언트가 size 라는 파라미터로 한 페이지의 항목 개수를 설정할 수 있게 합니다.
예를 들어, GET /v1/newsfeed?size=20 이라면 한 페이지에 20개의 항목을 요청하는 것입니다.
size : 한 페이지에 표시할 데이터의 개수를 나타냅니다.
반환 타입 Page<TodoNewsfeedDto>
Page 는 Spring Data JPA 에서 제공하는 클래스이며, 페이지네이션 처리된 데이터를 포함하고 있습니다. 이 객체는 해당 페이지의 데이터 뿐만 아니라 전체 페이지 수, 현재 페이지 번호 등의 메타 정보를 함께 제공합니다.

 


[2] todoService.getTodoNewsfeed()

public Page<TodoNewsfeedDto> getTodoNewsfeed(int page, int size) {

	Pageable pageable = PageRequest.of(page-1, size);
    Page<Todo> todoPage = todoRepository.findAllByOrderByModifiedAtDesc(pageable);
    
    return todoPage.map(todo -> new TodoNewsfeedDto(
    		todo.getTodo(),
            todo.getUsername(),
            todo.getCreatedAt(),
            todo.getModifiedAt(),
       		commentRepository.countByTodoId(todo.getId())
    ));
}
Pageable pageable = PageRequest.of(page-1, size);
PageRequest.of(page-1, size) : 페이지네이션 처리를 위해 PageRequest 객체를 생성합니다. 여기서 page-1 을 하는 이유는
Spring Data JPA 의 페이지 번호는 0부터 시작하지만, 일반적으로 사용자가 1부터 페이지 번호를 인식하기 때문에 page-1 을 적용합니다.