오늘은 프로젝트 21일 차이다. 오늘은 서비스 론칭을 하기에 앞서서
조회기능 향상을 위해서 기존에 사용하던 오프셋 기반의 페이징 조회가 아니라 커서 기반의 조회를 구현을 진행했다.
커서기반의 조회를 구현할라면 커서 Id와 사이즈가 필요하다 커서 Id는 현재 보고 있는 공연의 위치와 같으며 사이즈는 조회 시 현재 위치하고 있는 커서에서 어디까지 조회를 진행할 건지 나타내는 기능을 한다.
또한 기존의 카테고리 이름을 받아서 필요한 카테고리에 따라서도 조회가 가능하게끔 했다.
실제로 구현한 코드는 다음과 같다.
@GetMapping("/goods")
public ResponseEntity<ApiResponse<GoodsGetCursorResponse>> getAllGoods(
@RequestParam(value = "cursorId", required = false) Long cursorId,
@RequestParam(value = "size", defaultValue = "10") int size,
@RequestParam(value = "categoryName", required = false) String categoryName) {
GoodsGetCursorResponse goodsGetCursorResponse = goodsService.getGoodsWithCursor(cursorId, size, categoryName);
return ResponseEntity
.status(SUCCESS_GET_SLICE_GOODS.getHttpStatus())
.body(
ApiResponse.of(
SUCCESS_GET_SLICE_GOODS.getCode(),
SUCCESS_GET_SLICE_GOODS.getMessage(),
goodsGetCursorResponse)
);
}
@Override
@Transactional(readOnly = true)
public GoodsGetCursorResponse getGoodsWithCursor(Long cursorId, int size, String categoryName) {
List<Goods> goodsList = goodsRepository.findAllByGoodsAndCategoryName(cursorId, size, categoryName);
Long nextCursorId = null;
boolean hasNext = false;
if (goodsList.size() > size) {
hasNext = true;
nextCursorId = goodsList.get(size - 1).getId();
goodsList = goodsList.subList(0, size);
}
return new GoodsGetCursorResponse(goodsList, nextCursorId, hasNext);
}
@Override
public List<Goods> findAllByGoodsAndCategoryName(
Long cursorId,
int size,
String categoryName) {
// JPAQuery 시작
JPAQuery<Goods> query = this.query.select(goods);
query.from(goods)
.leftJoin(goods.goodsInfo, goodsInfo).fetchJoin()
.leftJoin(goodsInfo.goodsCategory, goodsCategory).fetchJoin()
.where(goods.endDate.after(LocalDate.now()));
// 카테고리 이름 조건
if (categoryName != null) {
query.where(goodsCategory.name.eq(categoryName));
}
// 커서 ID 기반 조건
if (cursorId != null) {
query.where(goods.id.gt(cursorId));
}
// 페이징 처리와 정렬
return query
.limit(size)
.orderBy(goods.id.asc())
.fetch();
}
오늘은 구현 정도만 진행을 했고 실제 테스트에서 잘 조회되는것을 확인했다.
이제는 오프셋으로 조회하는 슬라이스 기능과 커서기능의 차이에 대해서 분석해 볼 예정이다.
'내일 배움 캠프' 카테고리의 다른 글
2024-01-26 (1) | 2024.01.27 |
---|---|
2024-01-25 (1) | 2024.01.27 |
2024-01-23 (0) | 2024.01.23 |
2024-01-22 (0) | 2024.01.23 |
2024-01-19 (0) | 2024.01.21 |