공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
이번 장에서는 상품 그룹과 키워드 관련 데이터를 Redis에 저장하고, 최저 가격 정보를 조회하는 REST API를 개발한다. 개발된 메서드들은 Redis의 정렬된 집합과 집합 데이터 구조를 활용하여 효율적인 데이터 관리와 빠른 조회 성능을 제공한다.
컨트롤러 메서드 추가
LowestPriceController에 다음 메서드를 추가한다.
@PutMapping("/productGroup")
public int SetNewProduct(@RequestBody ProductGrp newProductGrp) {
return mlps.SetNewProductGrp(newProductGrp);
}
@PutMapping("/productGroupToKeyword")
public int SetNewProductGrpToKeyword(String keyword, String prodGrpId, double score) {
return mlps.SetNewProductGrpToKeyword(keyword, prodGrpId, score);
}
@GetMapping("/productPrice/lowest")
public Keyword GetLowestPriceProductByKeyword(String keyword) {
return mlps.GetLowestPriceProductByKeyword(keyword);
}
- @PutMapping("/productGroup"): 새 상품 그룹을 Redis에 추가하고, 해당 그룹 내 상품의 개수를 반환한다.
- @PutMapping("/productGroupToKeyword"): 주어진 키워드에 상품 그룹 ID와 점수를 연결하여 Redis에 추가하고, 해당 그룹의 순위를 반환한다.
- @GetMapping("/productPrice/lowest"): 키워드에 따른 가장 낮은 가격의 상품 정보를 조회하여 반환한다.
서비스 인터페이스 추가
LowestPriceService에 다음 메서드를 정의한다.
int SetNewProductGrp(ProductGrp newProductGrp);
int SetNewProductGrpToKeyword(String keyword, String prodGrpId, double score);
Keyword GetLowestPriceProductByKeyword(String keyword);
- int SetNewProductGrp(ProductGrp newProductGrp)
- 새로운 상품 그룹을 Redis에 저장하고, 저장된 상품 그룹 내 상품의 개수를 반환한다.
- int SetNewProductGrpToKeyword(String keyword, String prodGrpId, double score)
- 키워드와 상품 그룹 ID에 점수를 할당하여 Redis에 저장하고, 저장된 상품 그룹의 순위를 반환한다.
- Keyword GetLowestPriceProductByKeyword(String keyword)
- 주어진 키워드를 기반으로 최저 가격의 상품 정보를 조회하여 반환한다.
서비스 구현체 메서드 추가
LowestPriceServiceImpl에서 LowestPriceService 인터페이스의 메서드를 구현한다.
@Override
public int SetNewProductGrp(ProductGrp newProductGrp) {
List<Product> product = newProductGrp.getProductList();
String productId = product.get(0).getProductId();
int price = product.get(0).getPrice();
myProdPriceRedis.opsForZSet().add(newProductGrp.getProdGrpId(), productId, price);
int productCnt = myProdPriceRedis.opsForZSet().zCard(newProductGrp.getProdGrpId()).intValue();
return productCnt;
}
public int SetNewProductGrpToKeyword(String keyword, String prodGrpId, double score) {
myProdPriceRedis.opsForSet().add(keyword, prodGrpId, score);
int rank = myProdPriceRedis.opsForZSet().rank(keyword, prodGrpId).intValue();
return rank;
}
@Override
public Keyword GetLowestPriceProductByKeyword(String keyword) {
Keyword returnInfo = new Keyword();
List<ProductGrp> tempProdGrp = new ArrayList<>();
// keyword 를 통해 ProductGroup 가져오기 (10개)
tempProdGrp = GetProdGrpUsingKeyword(keyword);
// 가져온 정보들을 Return 할 Object 에 넣기
returnInfo.setKeyword(keyword);
returnInfo.setProductGrpList(tempProdGrp);
// 해당 Object return
return returnInfo;
}
public List<ProductGrp> GetProdGrpUsingKeyword(String keyword) {
List<ProductGrp> returnInfo = new ArrayList<>();
ProductGrp tempProdGrp = new ProductGrp();
// input 받은 keyword 로 productGrpId를 조회
List<String> prodGrpIdList = new ArrayList<>();
prodGrpIdList = List.copyOf(myProdPriceRedis.opsForZSet().range(keyword, 0, 9));
for (final String prodGrpId : prodGrpIdList) {
// Loop 돌면서 ProductGroupID 로 Product:price 가져오기 (10개)
Set prodAndPriceList = new HashSet();
prodAndPriceList = myProdPriceRedis.opsForZSet().rangeWithScores(prodGrpId, 0, 9);
}
return returnInfo;
}
SetNewProductGrp 메서드
새로운 상품 그룹을 Redis에 저장하고, 해당 그룹 내 상품의 개수를 반환한다.
- 입력된 ProductGrp 객체에서 상품 리스트를 추출한다.
- 첫 번째 상품의 ID(productId)와 가격(price)을 가져온다.
- 이 상품 정보를 Redis의 정렬된 집합에 추가하면서, 상품 그룹 ID(prodGrpId)를 키로 사용한다.
- Redis의 ZCARD 명령을 사용하여 해당 상품 그룹에 저장된 총 상품 수를 계산하고, 이를 반환한다.
- 결과: 호출이 성공하면, Redis에 저장된 상품의 수를 반환하며, 이는 상품 그룹 내 상품의 개수를 나타낸다.
SetNewProductGrpToKeyword 메서드
주어진 키워드에 상품 그룹 ID와 점수를 연결하여 Redis에 저장하고, 그룹의 순위를 반환한다.
- Redis의 집합에 키워드를 사용하여 상품 그룹 ID와 점수를 추가한다. 여기서 키워드는 집합의 이름으로, 상품 그룹 ID는 요소, 점수는 요소의 점수로 사용된다.
- Redis의 ZRANK 명령을 사용하여 입력된 상품 그룹 ID의 순위를 조회한다. 이 순위는 0부터 시작하며, 점수가 낮을수록 순위가 높다.
- 결과: 호출 결과로 상품 그룹 ID의 현재 순위를 반환한다. 이 순위는 다른 상품 그룹과의 비교를 통해 얻어진다.
GetLowestPriceProductByKeyword 메서드
주어진 키워드를 기반으로 최저 가격의 상품 정보를 조회하여 반환한다.
- 키워드를 사용하여 관련 상품 그룹을 조회한다(GetProdGrpUsingKeyword 메서드 호출).
- 조회된 상품 그룹들 중에서 가장 낮은 가격을 제공하는 상품을 찾아 Keyword 객체에 정보를 채운다.
- 최종적으로 이 Keyword 객체를 반환한다. 객체에는 최저 가격의 상품과 관련 정보가 포함된다.
- 결과: 호출 결과로 최저 가격 상품의 정보를 담은 Keyword 객체가 반환된다.
GetProdGrpUsingKeyword 메서드
주어진 키워드에 연결된 상품 그룹 ID들을 조회하고, 각 상품 그룹에 속한 상품들의 정보를 가져온다.
- 먼저, Redis의 정렬된 집합에서 주어진 키워드에 해당하는 상품 그룹 ID들을 범위 조회를 통해 가져온다. 여기서 사용하는 ZRANGE 명령은 키워드를 키로 사용하며, 상위 10개의 상품 그룹 ID를 조회한다.
- 조회된 각 상품 그룹 ID에 대해, 다시 Redis의 정렬된 집합을 사용하여 해당 그룹 ID의 상품 정보를 가져온다. 여기서 사용하는 ZRANGEWITHSCORES 명령은 상품 ID와 그에 해당하는 가격(점수)을 함께 가져온다.
- 모든 조회 결과를 ProductGrp 객체 리스트에 저장한다. 각 ProductGrp 객체는 상품 그룹 ID와 그에 속한 상품 리스트(Product 객체 리스트)를 포함한다.
- 결과: 최종적으로, 키워드에 해당하는 모든 상품 그룹과 그 내부의 상품 정보가 포함된 ProductGrp 객체 리스트를 반환한다.
'BackEnd > Project' 카테고리의 다른 글
[BigData] Ch05. Redis 코드 작성 및 배포(5) (0) | 2024.09.16 |
---|---|
[BigData] Ch05. Redis 코드 작성 및 배포(4) (1) | 2024.09.16 |
[BigData] Ch05. Redis 코드 작성 및 배포(2) (0) | 2024.09.16 |
[BigData] Ch05. Redis 코드 작성 및 배포(1) (1) | 2024.09.15 |
[BigData] Ch05. Redis 샘플 데이터 생성과 입력 (0) | 2024.09.15 |