🧑🏻‍💻 Lettuce 란?

<aside> 💡 고성능, 확장 가능, 스레드 안전한 레디스 자바 클라이언트

</aside>

Lettuce 진행

Lettuce 전체 코드

  1. Redis를 위한 implementation을 추가

    //Redis
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    
  2. 부모 트랜잭션과 자식 트랜잭션을 따로 작성한다.

    //부모 트랜잭션
    @Transactional
    public void stockLock(String pgToken, Long memberId){
        String redisLockKey = orderProductWithLettuceLock(pgToken, memberId);
        redisRepository.unlock(redisLockKey);
    }
    
    //자식트랜잭션
        @Transactional(propagation = Propagation.REQUIRES_NEW)
        public String orderProductWithLettuceLock(String pgToken, Long memberId) {
    		' ' ' ' '
    
            //Lettuce Lock
            String redisLockKey = REDIS_LOCK_KEY_PREFIX + productId;
            while (!redisRepository.lock(redisLockKey)) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
    
            Product product = productRepository.findById(Long.valueOf(productId))
                .orElseThrow(() -> new ProductNotFoundException(ErrorCode.PRODUCT_NOT_FOUND));
    
            if (product.getStock() == 0) {
                throw new ProductOutOfStockException(ErrorCode.PRODUCT_OUT_OF_STOCK);
            }
    
    // 결제 승인 요청 api
    //     kaKaoPaymentService.payInfo(pgToken, memberId, Long.valueOf(productId), tid);  
            product.saleProduct();
            paymentHistoryRepository.save(paymentHistory);
            return redisLockKey;
        }
    

🚀 트러블 슈팅

1. 불필요한 로직 수행 방어

Product product = productRepository.findById(Long.valueOf(productId))
        .orElseThrow(() -> new ProductNotFoundException(ErrorCode.PRODUCT_NOT_FOUND));

    if (product.getStock() == 0) {
        throw new ProductOutOfStockException(ErrorCode.PRODUCT_OUT_OF_STOCK);
  }

2. 부모-자식 트랜잭션으로 분리