[Spring] 인터넷 강의 클론 - 7 페이징

춤인형의 개발일지·2025년 2월 22일

Spring실습

목록 보기
34/40

페이징

한 페이지에 엄청나게 많은 양의 데이터를 한번에 주게 되면 굉장히 느려지게 된다. 따라서 한 페이지에 작은 수의 데이터만 보여줘서 관리한다. 그걸 페이징이라 부른다!

페이징은 다양한 방법이 있는데 QueryDsl로 페이징을 해줬다.
나는 기존에 QueryDsl을 사용하고 있기 때문에 그게 쉽게 접근이 가능할 것 같다고 생각했다.

public List<Lecture> findAll(String title, String teacherName, Category category, Pageable pageable){
        return jpaQueryFactory
                .selectFrom(lecture)
                .join(lecture.teacher).fetchJoin()
                .where(
                        lecture.deleted.isFalse(),
                        lecture.isPrivate.isFalse(),
                        containsTitle(title),
                        containsTeacherName(teacherName),
                        containsCategory(category))
                .orderBy(
                        lecture.createTime.desc(),
                        lecture.countStudent.desc())
                .offset(pageable.getOffset())
                .limit(pageable.getPageSize())
                .fetch();

    }

아래 두 코드가 추가 되었다.

.offset(pageable.getOffset())
.limit(pageable.getPageSize())

.offset(pageable.getOffset())

  • offset(n): 조회할 데이터의 시작 위치(인덱스)를 설정
    pageable.getOffset()은 pageable 객체가 가진 현재 페이지의 시작 위치(첫 번째 레코드의 인덱스)를 반환한다.
    Ex) 한 페이지에 10개씩 데이터를 가져온다고 가정하고,
    첫 번째 페이지 (page=0) → offset = 0
    두 번째 페이지 (page=1) → offset = 10
    세 번째 페이지 (page=2) → offset = 20
    이런 식으로 offset 값이 변하면서 데이터가 잘라져 조회한다.

.limit(pageable.getPageSize())

  • limit(n): 한 번에 조회할 데이터 개수를 제한
    pageable.getPageSize()는 한 페이지에 표시할 데이터 개수를 의미한다.
    Ex) pageSize = 10이라면 최대 10개의 데이터만 조회한다.

그럼 Test는 어떻게 하지?
= test코드는 임의로 내가 offset과 pageSize를 줘서 그만큼이 잘 들어왔는지를 확인하면 된다.

@Test
    void 강의페이지() throws InterruptedException {
        LectureResponse lecture1 = createLecture("자바 배우기", "자바, Spring을 통한 웹 개발 강의입니다.", 50000, Category.Math, teacher.getId());
        Thread.sleep(1);
        LectureResponse lecture2 = createLecture("자바 응용하기", "자바, Spring을 통한 웹 개발 실습강의입니다.", 50000, Category.Math, teacher.getId());
        Thread.sleep(1);
        LectureResponse lecture3 = createLecture("과학 배우기", "과학 강의입니다.", 50000, Category.Science, teacher.getId());
        Thread.sleep(1);
        LectureResponse lecture4 = createLecture("파이썬 기초", "파이썬을 통한 프로그래밍 기초 강의입니다.", 40000, Category.English,teacher.getId());
        Thread.sleep(1);
        LectureResponse lecture5 = createLecture("AI 응용", "AI 및 머신러닝 강의입니다.", 60000, Category.Math, teacher.getId());

        updateLectureToPublic(lecture1.id());
        updateLectureToPublic(lecture2.id());
        updateLectureToPublic(lecture3.id());
        updateLectureToPublic(lecture4.id());
        updateLectureToPublic(lecture5.id());
        int page = 1;
        int size = 2;

        List<LectureListResponse> list = RestAssured
                .given().log().all()
                .param("page", page)
                .param("size", size)
                .when()
                .get("/lectures")
                .then().log().all()
                .statusCode(200)
                .extract()
                .jsonPath()
                .getList(".", LectureListResponse.class);

        assertThat(list.size()).isEqualTo(2);
        assertThat(list.get(0).title()).isEqualTo("AI 응용");
        assertThat(list.get(1).title().equals("과학 배우기")).isFalse();

        page=2;
        List<LectureListResponse> list2 = RestAssured
                .given().log().all()
                .param("page", page)
                .param("size", size)
                .when()
                .get("/lectures")
                .then().log().all()
                .statusCode(200)
                .extract()
                .jsonPath()
                .getList(".", LectureListResponse.class);

        assertThat(list2.size()).isEqualTo(2);
        assertThat(list2.get(0).title()).isEqualTo("과학 배우기");

        page=3;
        List<LectureListResponse> list3 = RestAssured
                .given().log().all()
                .param("page", page)
                .param("size", size)
                .when()
                .get("/lectures")
                .then().log().all()
                .statusCode(200)
                .extract()
                .jsonPath()
                .getList(".", LectureListResponse.class);

        assertThat(list3.size()).isEqualTo(1);
        assertThat(list3.get(0).title()).isEqualTo("자바 배우기");


    }

5개의 강의를 만들어놓고, 페이지가 1페이지 일때, 2페이지 일때 3페이지 일때의 개수와 맞게 잘 들어왔는지를 확인했다.

0개의 댓글