@Cacheable(value = "bestProductList", key = "#subCateNo")
public List<ProductDTO> selectBestAllForList(int subCateNo) {
Page<Tuple> pageProduct = productRepository.selectBestAllForList(subCateNo);
return pageProduct.getContent().stream().map(tuple -> {
Product product = tuple.get(0, Product.class);
String company = tuple.get(1, String.class);
String sNameList = tuple.get(2, String.class);
ProductDTO dto = modelMapper.map(product, ProductDTO.class);
dto.setCompany(company);
dto.setSNameList(sNameList);
return dto;
}).toList();
}
기술 설명
- @Cacheable(value = "bestProductList", key = "#subCateNo")
subCateNo를 키로 Redis 캐시에 저장- 동일
subCateNo요청 시 DB가 아닌 캐시에서 즉시 반환- productRepository.selectBestAllForList(subCateNo)
- QueryDSL로 최근 3개월 판매순 Top 10 상품 조회 (Tuple 형태).
- Tuple\[0]=Product 엔티티, Tuple\[1]=회사명, Tuple\[2]=이미지 파일명 목록 문자열.
- map(tuple → ProductDTO)
- ModelMapper로 Product → ProductDTO 복사
company,sNameList값 DTO에 수동 설정- List<ProductDTO> 반환
@Cacheable(value = "sortedProductList", key = "#pageRequestDTO.toString()")
public PageResponseDTO sortedProducts(PageRequestDTO pageRequestDTO) {
Pageable pageable = pageRequestDTO.getPageable("no");
Page<Tuple> pageProduct = productRepository.sortedProducts(pageRequestDTO, pageable);
List<ProductDTO> productDTOList = pageProduct.getContent().stream().map(tuple -> {
Product product = tuple.get(0, Product.class);
String company = tuple.get(1, String.class);
String rank = tuple.get(2, String.class);
String sNameList = tuple.get(3, String.class);
ProductDTO productDTO = modelMapper.map(product, ProductDTO.class);
productDTO.setCompany(company);
productDTO.setRank(rank);
productDTO.setSNameList(sNameList);
return productDTO;
}).toList();
int total = (int) pageProduct.getTotalElements();
return PageResponseDTO.<ProductDTO>builder()
.pageRequestDTO(pageRequestDTO)
.dtoList(productDTOList)
.total(total)
.build();
}
기술 설명
- @Cacheable(value = "sortedProductList", key = "#pageRequestDTO.toString()")
pageRequestDTO.toString()을 키로 캐시 저장- 동일 파라미터 요청 시 캐시에서 즉시 반환
- pageRequestDTO.getPageable("no")
- 기본 정렬 기준 “no”(상품 번호)로
Pageable객체 생성- 페이징(페이지 번호, 사이즈)·정렬 정보 포함
- productRepository.sortedProducts(pageRequestDTO, pageable)
- QueryDSL에서 동적 정렬·페이징 적용하여 상품 조회 (Tuple 형태)
- Tuple\[0]=Product, Tuple\[1]=회사명, Tuple\[2]=랭크, Tuple\[3]=이미지 파일명
- DTO 변환
- ModelMapper로 Product → ProductDTO 변환
company,rank,sNameList수동 설정- 총 개수 계산
pageProduct.getTotalElements()로 전체 개수 조회- PageResponseDTO 반환
- 페이지 요청 정보, DTO 리스트, 총 개수 담아 반환