11package com .loopers .domain .product ;
22
33import com .loopers .domain .order .OrderItem ;
4+ import com .loopers .support .cache .RedisCacheHandler ;
45import com .loopers .support .error .CoreException ;
56import com .loopers .support .error .ErrorType ;
7+ import java .time .Duration ;
68import java .util .List ;
79import java .util .Map ;
810import java .util .stream .Collectors ;
@@ -18,19 +20,38 @@ public class ProductService {
1820
1921 private final ProductRepository productRepository ;
2022
23+ private final RedisCacheHandler redisCacheHandler ;
2124
2225 public Page <Product > getProducts (Pageable pageable ) {
23- return productRepository .findAll (pageable );
26+ String key = makeCacheKey ("product:list" , pageable );
27+ return redisCacheHandler .getOrLoad (
28+ key ,
29+ Duration .ofMinutes (5 ),
30+ Page .class ,
31+ () -> productRepository .findAll (pageable )
32+ );
2433 }
2534
2635 @ Transactional
2736 public Product getProduct (Long id ) {
28- return productRepository .findById (id ).orElseThrow (() -> new CoreException (ErrorType .NOT_FOUND , "상품을 찾을 수 없습니다." ));
37+ String key = "product:detail:" + id ;
38+ return redisCacheHandler .getOrLoad (
39+ key ,
40+ Duration .ofMinutes (10 ),
41+ Product .class ,
42+ () -> productRepository .findById (id )
43+ .orElseThrow (() -> new CoreException (ErrorType .NOT_FOUND , "상품을 찾을 수 없습니다." ))
44+ );
2945 }
3046
3147 public Page <Product > getProductsByBrandId (Long brandId , Pageable pageable ) {
32-
33- return productRepository .findByBrandId (brandId , pageable );
48+ String key = makeCacheKey ("product:list:brand:" + brandId , pageable );
49+ return redisCacheHandler .getOrLoad (
50+ key ,
51+ Duration .ofMinutes (5 ),
52+ Page .class ,
53+ () -> productRepository .findByBrandId (brandId , pageable )
54+ );
3455 }
3556
3657
@@ -69,4 +90,18 @@ public int decreaseLikeCount(Long productId) {
6990
7091 return product .decreaseLikeCount ();
7192 }
93+
94+ private String makeCacheKey (String prefix , Pageable pageable ) {
95+ StringBuilder sb = new StringBuilder ();
96+ sb .append (prefix );
97+ sb .append (":page:" ).append (pageable .getPageNumber ());
98+ sb .append (":size:" ).append (pageable .getPageSize ());
99+
100+ if (pageable .getSort ().isSorted ()) {
101+ pageable .getSort ().forEach (order ->
102+ sb .append (":sort:" ).append (order .getProperty ()).append ("," ).append (order .getDirection ())
103+ );
104+ }
105+ return sb .toString ();
106+ }
72107}
0 commit comments