1. store항목 페이징 조회, 단건 조회하는 api 추가
1.1 pageDto 추가
1.2 페이징 쿼리 추가
1.3 단건조회 api
2. url, mapping 어노테이션 수정
2.1 url 수정
2.2 어노테이션 수정
1. store항목 페이징 조회, 단건 조회하는 api 추가
1. pageDto추가
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Setter
public class StorePageDto {
int page;
int size;
boolean isAsc;
String sortBy;
boolean cutByStarRate;
int starCut;
public Pageable toPageable() {
if(Objects.nonNull(sortBy)){
return isAsc ? PageRequest.of(page, size,
Sort.by(sortBy).descending()) : PageRequest.of(page, size,
Sort.by(sortBy).ascending());
}
return isAsc ? PageRequest.of(page, size,
Sort.by("createdAt").descending()) : PageRequest.of(page, size,
Sort.by("createdAt").ascending());
}
}
페이징을 하기 위해 받는 파라미터의 요소들이 너무 많아 @RequestParam을 이용해 요소들을 받기보다는 Dto를 사용해 받는것이 가독성과 유지보수 측면에서 더 좋다고 생각이 되어 Dto를 만들어 받게 했습니다.
2.페이징 쿼리 추가
@RequiredArgsConstructor
public class StoreRepositoryQueryImpl implements StoreRepositoryQuery {
private final JPAQueryFactory jpaQueryFactory;
@Override
@Transactional(readOnly = true)
public Page<StoreIndexResponseDto> getStores(StorePageDto storePageDto) {
Pageable pageable = storePageDto.toPageable();
int starCut = storePageDto.getStarCut();
List<StoreIndexResponseDto> dtoList;
if(Objects.nonNull(storePageDto.getSortBy())) dtoList = getStoresAndSortByKeyword(pageable,storePageDto);
else if (storePageDto.isCutByStarRate()) dtoList = getStoresAndCutByStarRate(pageable, starCut);
else dtoList = getStoresSortByCreatedAtDesc(pageable);
long totalSize = storeCountQuery().fetch().get(0);
return PageableExecutionUtils.getPage(dtoList, pageable, () -> totalSize);
}
private List<StoreIndexResponseDto> getStoresAndSortByKeyword(Pageable pageable,StorePageDto storePageDto) {
OrderSpecifier<?> orderSpecifier = getOrderSpecifier(storePageDto.getSortBy(),
storePageDto.isAsc());
return query()
.orderBy(orderSpecifier)
.limit(pageable.getPageSize())
.offset(pageable.getOffset())
.fetch();
}
private List<StoreIndexResponseDto> getStoresAndCutByStarRate(Pageable pageable, int starCut) {
return query()
.where(store.starRate.gt(starCut))
.limit(pageable.getPageSize())
.offset(pageable.getOffset())
.fetch();
}
private List<StoreIndexResponseDto> getStoresSortByCreatedAtDesc(Pageable pageable) {
return query()
.orderBy(store.createdAt.desc())
.limit(pageable.getPageSize())
.offset(pageable.getOffset())
.fetch();
}
private JPAQuery<StoreIndexResponseDto> query(){
return jpaQueryFactory
.select(
Projections.bean(
StoreIndexResponseDto.class
, store.id
, store.storeName
, store.storeLocation
, store.starRate
)
)
.from(store)
.setHint("org.hibernate.readOnly", true);
}
private JPAQuery<Long> storeCountQuery() {
return jpaQueryFactory.select(Wildcard.count)
.from(store);
}
private OrderSpecifier<?> getOrderSpecifier(String sortBy, boolean isAsc) {
PathBuilder<Object> defaultPath = new PathBuilder<>(Store.class, Store.class.getSimpleName());
return isAsc ? defaultPath.getString(sortBy).asc() : defaultPath.getString(sortBy).desc();
}
}
pageDto의 분기를 받아 분기별로 처리하도록 쿼리dsl을 작성했습니다. 또한, OrderSpecifier객체를 통해 .orderBy의 요소를 동적으로 처리하게 했는데, 테스트를 해보지 않아서 테스트를 해 보아야 할 것 같습니다.
3. 단건조회 api
기존의 방식과 동일하게 @PathVariable과 id를 통하여 조회하게 작성했습니다.
2. url, mapping 어노테이션 수정
2.1 url 수정
@PostMapping("/AddReservationMonthInfo/{storeId}") -> @PostMapping("/month/{storeId}")
@PostMapping("/AddReservationDayInfo/{monthInfoId}") -> @PostMapping("/day/{monthInfoId}")
등 카멜케이스 적용된 url들 간략하게 수정했습니다.
2.2 어노테이션 수정
수정된 url중 @GetMapping이 적용되어야하는데 @PostMapping이 되어있는게 있어서 수정했습니다.(예약 정보 조회)
'개발일지(일간)' 카테고리의 다른 글
SpringBoot를 이용한 crawling 프로젝트 - 1 (0) | 2024.08.13 |
---|---|
04월 23일 변경사항 (0) | 2024.04.23 |
23년 03월 24일 레디스 캐싱2 (0) | 2023.03.24 |
23년 03월 23일 레디스 캐싱 (0) | 2023.03.23 |
23년 03월 20일 모의면접 (0) | 2023.03.20 |