[TIL] Pagination - 페이징 처리

정석·2024년 8월 13일

TIL

목록 보기
18/40
post-thumbnail

블로그 글처럼 한 페이지에 보여지는 글의 개수를 정해서 보여주도록 작업

기존에 3 Layer 로 구현 중이던 프로젝트에서 페이징 처리를 해보려한다.

시작에 앞서 참고한 영상 ➡️ 유튜브 영상
영상에서 매우 매우 간단하게 설명해주셔서 어떤 흐름인지 감을 찾기 쉬웠다.

일단 페이징 처리가 안된 '모든 데이터들'을 불러오면 다음과 같다.

{
        "scheduleId": 1,
        "managerId": 1,
        "content": "담당자 따로 처리 후 테스트",
        "createDate": "2024-08-13",
        "modifyDate": "2024-08-13"
    },
    {
        "scheduleId": 3,
        "managerId": 3,
        "content": "마지막 테스트",
        "createDate": "2024-08-13",
        "modifyDate": "2024-08-13"
    },
    {
        "scheduleId": 4,
        "managerId": 2,
        "content": "두번째 테스트",
        "createDate": "2024-08-13",
        "modifyDate": "2024-08-13"
    },
    {
        "scheduleId": 36,
        "managerId": 10,
        "content": "신규 파트너 협의",
        "createDate": "2024-03-19",
        "modifyDate": "2024-03-20"
    },
    {
        "scheduleId": 35,
        "managerId": 9,
        "content": "해외 출장",
        "createDate": "2024-03-17",
        "modifyDate": "2024-03-18"
    },
    {
        "scheduleId": 34,
        "managerId": 8,
        "content": "이사회 회의",
        "createDate": "2024-03-15",
        "modifyDate": "2024-03-16"
    },
    {
        "scheduleId": 33,
        "managerId": 7,
        "content": "품질 관리 점검",
        "createDate": "2024-03-13",
        "modifyDate": "2024-03-14"
    },
    {
        "scheduleId": 32,
        "managerId": 6,
        "content": "계약서 검토",
        "createDate": "2024-03-11",
        "modifyDate": "2024-03-12"
    },
    {
        "scheduleId": 31,
        "managerId": 5,
        "content": "사업 계획 회의",
        "createDate": "2024-03-09",
        "modifyDate": "2024-03-10"
    },

너무 많아서 조금 잘랐다. 보여주는 정보의 양이 너무 많다보니 보기가 싫다.
한 번 5개씩 잘라서 보여줘 보자.


이 때 코드를 수정하게 되는데, 우선 Controller 에서 다음과 같이 수정해야 한다.

1. Controller

코드에서 `@PageableDefault` 를 볼 수 있다. 해당 어노테이션을 통해 아주 간단하게 페이징을 할 수 있는데 어노테이션 내의 설정은
  • page : 시작 할 페이지
  • size : 한 페이지에 보여 줄 데이터 개수
  • sort : 한 페이지에서 데이터를 정렬하고자 하는 기준
  • direction : 정렬을 어떻게 할 건지 (내림차순 / 오름차순)

이런 설정을 마치고, Pageable 인터페이스의 pagealbe 을 매개변수로 넘겨주면 끝!

(당연히 그럼 Service , Repository 에도 매개변수가 들어가도록 수정)

나는 size 를 5로 기입해 5개씩 보여지도록 했다.

2. Service


똑같이 매개변수로 Pageable 을 넘겨준다.

3. Repository

이제 여기서 조금 헤맸다.

매개변수로 넘겨는 줬는데 리스트에 담을 때 처리를 어떻게 하지?

결론적으로 SQL 쿼리문에 LIMITOFFSET 을 사용해야 한다.

그럼 LIMIT 은 미리 size 를 정해서 '5'라고 정하면 되겠는데, OFFSET 은 매번 계산을 어떻게 할까??

라는 고민을 했다.

공부해본 결과로는

이와 같이 pageable 인터페이스 안에

.getPageSize() 메서드와 .getOffset() 메서드를 활용하면 저절로 계산이 되며 쿼리문이 실행되는 거 같다.

0개의 댓글