본문 바로가기

내일 배움 캠프

2023-12-20

오늘은 개인 프로젝트 2일 차이다. 오늘 구현한 내용은 다음과 같다.

1. 페이징 조회 구현 및 테스트 코드 작성

 

1. 페이징 조회를 구현하기 위해서 여러 사이트를 찾아보면서 Pagerble로 간편하게 구현이 가능하다고 해서 여러 구글링과 튜터님의 조언을 통해 구현 완료했다. 

Controller는 다음과 같다.

@GetMapping("/todo")
    public ResponseEntity<?> getPagingCard(Pageable pageable , @AuthenticationPrincipal UserDetailsImpl userDetails){
        ToDoPageCardListResponseDto toDoPageCardListResponseDto  = toDoService.getPageCard(pageable, userDetails);
        return ResponseEntity.status(SUCCESS_GET_PAGE_CARD.getHttpStatus().value())
            .body(new SuccessResponse(SUCCESS_GET_PAGE_CARD,toDoPageCardListResponseDto));
    }

Controller를 보면 단순하게 Pageable의 데이터와 User의 정보만 받는 것을 확인할 수 있다. @RequestParam으로 원래 개별적으로 page, size, sort에 대한 정보를 받아야 하지만 Pageable을 설정하면 따로따로 입력받을 필요 없이 아래의 POSTMAN처럼 간편하게 입력을 받을 수 있다.

다음은 Service 코드이다 입력받은 Pageable을 통해 바로 Repository JPQL을 호출하여 원하는 데이터를 받는다.

public ToDoPageCardListResponseDto getPageCard(Pageable pageable, UserDetailsImpl userDetails){

      Page<ToDoCard> pageCardList = toDoRepository.findPageCard(pageable, userDetails.getUser().getId());
return new ToDoPageCardListResponseDto(pageCardList);
  }

Repository에 있는 코드는 다음과 같다. JQPL쿼리를 통해 완료처리와 히든처리가 안된 카드와 히든처리가 됐다면 히든처리한 유저의 ID와 같은지 검사하여 Page목록을 반환하는 코드이다.

@Query("select t from ToDoCard t WHERE (t.complete = false AND t.hidden = false) OR (t.hidden = true AND t.user.id = :id)")
Page<ToDoCard> findPageCard(Pageable pageable, @Param("id") Long userId);

 

 

POSTMAN을 통해 간단하게 한명의 user에서 4개의 카드를 생성한 다음 2,3번만 완료처리를 하고 출력한 페이지 출력이다.

{
    "status": 200,
    "message": "카드 조회 완료",
    "data": {
        "pageList": {
            "content": [
                {
                    "toDoId": 4,
                    "title": "user1_testCard3 ",
                    "username": "testuser1",
                    "contents": "user1_testCard_contents",
                    "createdAt": "2023-12-20T19:12:30.282437"
                },
                {
                    "toDoId": 1,
                    "title": "user1_testCard ",
                    "username": "testuser1",
                    "contents": "user1_testCard_contents",
                    "createdAt": "2023-12-20T19:12:00.004198"
                }
            ],
            "pageable": {
                "pageNumber": 0,
                "pageSize": 5,
                "sort": {
                    "empty": false,
                    "sorted": true,
                    "unsorted": false
                },
                "offset": 0,
                "paged": true,
                "unpaged": false
            },
            "last": true,
            "totalElements": 2,
            "totalPages": 1,
            "size": 5,
            "number": 0,
            "sort": {
                "empty": false,
                "sorted": true,
                "unsorted": false
            },
            "first": true,
            "numberOfElements": 2,
            "empty": false
        }
    }
}

결과를 보면 목록 아래에 pageable있는 부분을 보면 데이터 목록의 개수 및 몇 번째 페이지인지 페이지의 크기는 얼마인지 보여주는 코드들이 있다. 전체적인 변수의 의미는 파악하지 못했지만 핵심적인 부분만 봤을 때 정상적으로 출력된 것을 확인할 수 있다.

오늘 처음 페이징 처리관련해서 적용했지만 아직은 모르는 부분이 더 많다. 다양하게 응용이 가능해 보이는데 추가적으로 기능 구현을 하면서 아마 수도 없이 많은 페이징처리를 할 때 효율적이고 추가적인 응용을 통해 코드를 발전시킬 수 있을 것 같다.

'내일 배움 캠프' 카테고리의 다른 글

2023-12-22  (0) 2023.12.24
2023-12-21  (1) 2023.12.22
2023-12-19  (0) 2023.12.19
2023-12-18  (1) 2023.12.18
2023-12-15  (0) 2023.12.15