기존에는 Redis 를 통해 주문 정보들을 pay 계층에 넘겨주는 방식으로 구성했지만 카트(장바구니)에 담긴 주문 정보들은 일시적으로만 사용하기 때문에, 굳이 Redis가 아니더라도, HashMap 을 통한 구현이 훨씬 간단하고 효율적이라 판단했다.
우선, 다음과 같이 key 값으로 userNickName, value 로는 OrderDtoFromCart 를 넣어준다. 이로 인해, 어떤 고객이 어떤 주문 정보들을 갖고 장바구니에 담았는지 알 수 있다.
@Component
public class OrderHashMapCache {
private final Map<String, OrderDtoFromCart> cache = new ConcurrentHashMap<>();
public void putOrderDtoFromCart(OrderDtoFromCart orderDtoFromCart, String userNickname) {
cache.put(userNickname, orderDtoFromCart);
}
public OrderDtoFromCart getOrderDtoFromCart(String userNickname) {
if (userNickname != null && cache != null && cache.containsKey(userNickname)) {
return cache.get(userNickname);
} else {
throw new OrderProcessFailedException("주문 절차에서 예외가 발생했습니다.");
}
}
public void removeOrderDtoFromCart(String userNickname) {
if (userNickname != null && cache != null && cache.containsKey(userNickname)) {
cache.remove(userNickname);
} else {
throw new OrderProcessFailedException("주문 절차에서 예외가 발생했습니다.");
}
}
...
우선, OrderController 에서 주문을 생성할 때 사용한다.
이후, 고객이 주문한 내역을 확인하고 싶을 때 확인이 가능하다.
OrderDtoFromCart dto = orderHashMapCache.getOrderDtoFromCart(userNickname);
또한, CashPayController(현금결제), KakaoPayController(카카오결제) 에서 결제 완료 후 결제 완료 창을 보여주는 계층에서도 사용된다. 이 때, cache 데이터를 비워줘야 한다.