실시간 재고 관리를 위해 Redis를 활용한 별도의 재고 관리 서비스를 구현합니다. 이 서비스는 StockController를 통해 REST API를 제공하며, StockService에서는 Redis에 재고 정보를 저장, 조회, 수정, 삭제하는 로직을 처리합니다.
StockController
StockController는 재고 관련 HTTP 요청을 처리하는 컨트롤러입니다. 이 컨트롤러는 재고 정보의 저장, 조회, 수정, 삭제 기능을 제공합니다.
@RestController
@RequestMapping("/api/stocks")
@RequiredArgsConstructor
public class StockController {
private final StockService stockService;
@PostMapping
public ResponseEntity<?> saveStock(@RequestBody StockDto stock) {
stockService.saveStock(stock);
return ResponseEntity.ok().build();
}
@GetMapping("/{itemId}")
public ResponseEntity<?> findStock(@PathVariable Long itemId) {
return stockService.findStockById(itemId)
.map(ResponseEntity::ok)
.orElseGet(() -> ResponseEntity.notFound().build());
}
@PutMapping("/{itemId}")
public ResponseEntity<?> updateStockQuantity(@PathVariable Long itemId, @RequestBody StockUpdateRequest request) {
stockService.updateStockQuantity(itemId, request.getStockQuantity());
return ResponseEntity.ok().build();
}
@DeleteMapping("/{itemId}")
public ResponseEntity<?> deleteStock(@PathVariable Long itemId) {
stockService.deleteStock(itemId);
return ResponseEntity.ok().build();
}
}
StockDto
StockDto는 재고 정보를 전달하기 위한 데이터 전송 객체(Data Transfer Object)입니다. 이 객체는 상품 ID, 상품 이름, 재고 수량 정보를 포함합니다.
@Getter
@Setter
@NoArgsConstructor
public class StockDto {
private Long itemId;
private String name;
private int stockQuantity;
}
StockUpdateRequest
StockUpdateRequest는 재고 수량 업데이트 요청 시 사용되는 객체로, 업데이트 할 재고 수량 정보를 포함합니다.
@Getter
public class StockUpdateRequest {
private int stockQuantity;
}
StockService
StockService는 Redis를 사용하여 재고 정보를 관리하는 서비스입니다. 이 서비스는 재고 정보의 저장, 조회, 수정, 삭제 기능을 담당합니다.
@Service
@RequiredArgsConstructor
public class StockService {
private final StringRedisTemplate redisTemplate;
public void saveStock(StockDto stock) {
String key = "item:" + stock.getItemId();
Map<String, String> stockMap = new HashMap<>();
stockMap.put("itemId", stock.getItemId().toString());
stockMap.put("name", stock.getName());
stockMap.put("stockQuantity", String.valueOf(stock.getStockQuantity()));
redisTemplate.opsForHash().putAll(key, stockMap);
}
public Optional<StockDto> findStockById(Long itemId) {
String key = "item:" + itemId;
if (!redisTemplate.hasKey(key)) {
return Optional.empty();
}
Map<Object, Object> entries = redisTemplate.opsForHash().entries(key);
if (entries != null && !entries.isEmpty()) {
StockDto stock = new StockDto();
stock.setItemId(itemId);
stock.setName((String) entries.get("name"));
stock.setStockQuantity(Integer.parseInt((String) entries.get("stockQuantity")));
return Optional.of(stock);
}
return Optional.empty();
}
public void updateStockQuantity(Long itemId, int newStockQuantity) {
String key = "item:" + itemId;
redisTemplate.opsForHash().put(key, "stockQuantity", String.valueOf(newStockQuantity));
}
public void deleteStock(Long itemId) {
String key = "item:" + itemId;
redisTemplate.delete(key);
}
}
- saveStock(StockDto stock): Redis에 새로운 재고 정보를 저장합니다.
- findStockById(Long itemId): 주어진 상품 ID에 해당하는 재고 정보를 Redis에서 조회합니다.
- updateStockQuantity(Long itemId, int newStockQuantity): 특정 상품의 재고 수량을 업데이트합니다.
- deleteStock(Long itemId): 특정 상품의 재고 정보를 Redis에서 삭제합니다.
결론
이 서비스를 통해 실시간으로 재고 정보를 관리할 수 있으며, Redis의 빠른 데이터 처리 능력을 활용하여 높은 퍼포먼스를 제공합니다. Redis를 사용함으로써, 재고 정보의 실시간 업데이트가 가능해져 사용자에게 정확한 재고 상태를 제공할 수 있습니다.
'프로젝트 (Java) > 예약마켓' 카테고리의 다른 글
[프로젝트] 55. 프로젝트 세부 사항 정리 및 문서화 (0) | 2024.02.20 |
---|---|
[프로젝트] 54. 실시간 재고 관리를 위해 주문 로직 리팩토링 (0) | 2024.02.20 |
[프로젝트] 52. Docker 활용 예약 시간 재고 확인 자동화 툴 구축 (0) | 2024.02.20 |
[프로젝트] 51. Docker 활용 주문 API 자동화 툴 구축 (1) | 2024.02.20 |
[프로젝트] 50. Redis를 사용하여 상품 재고 정보 저장 (0) | 2024.02.20 |