Redis 가 아닌 HashMap 을 통한 cache 데이터 관리

Ryu·2023년 3월 2일
0

기존에는 Redis 를 통해 주문 정보들을 pay 계층에 넘겨주는 방식으로 구성했지만 카트(장바구니)에 담긴 주문 정보들은 일시적으로만 사용하기 때문에, 굳이 Redis가 아니더라도, HashMap 을 통한 구현이 훨씬 간단하고 효율적이라 판단했다.

[ OrderHashMapCache ]

우선, 다음과 같이 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("주문 절차에서 예외가 발생했습니다.");
        }
    }
    ...
  • @Component 를 통해 다른 계층에서 편리하게 주입받을 수 있도록 스프링 컨테이너에 등록한다.
  • ConcurrentHashMap 을 사용함으로써, 멀티쓰레드 환경에서의 동시성 문제를 해결할 수 있다.
  • cache 데이터는 다양한 곳에서 사용하는데, 크게 주문을 생성하는 곳과 주문 내역을 확인할 때, 그리고 결제가 완료되었을 때 사용한다.

[ cache 데이터를 사용하는 위치 ]

우선, OrderController 에서 주문을 생성할 때 사용한다.
이후, 고객이 주문한 내역을 확인하고 싶을 때 확인이 가능하다.

OrderDtoFromCart dto = orderHashMapCache.getOrderDtoFromCart(userNickname);

또한, CashPayController(현금결제), KakaoPayController(카카오결제) 에서 결제 완료 후 결제 완료 창을 보여주는 계층에서도 사용된다. 이 때, cache 데이터를 비워줘야 한다.

profile
Strengthen the core.

0개의 댓글