한 페이지에 엄청나게 많은 양의 데이터를 한번에 주게 되면 굉장히 느려지게 된다. 따라서 한 페이지에 작은 수의 데이터만 보여줘서 관리한다. 그걸 페이징이라 부른다!
페이징은 다양한 방법이 있는데 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(n): 조회할 데이터의 시작 위치(인덱스)를 설정limit(n): 한 번에 조회할 데이터 개수를 제한그럼 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페이지 일때의 개수와 맞게 잘 들어왔는지를 확인했다.