토이프로젝트/상품주문

[상품 주문 2편] 비즈니스 로직 API 설명

무대포 개발자 2023. 5. 8. 21:46
728x90
반응형

source 는 Github 에 있습니다.

목차는 상품 주문 에 있습니다.

[상품 주문 2편] 비즈니스 로직 API 설명

Webflux, 코틀린, Redis, 분산락 공부를 위해 작성했습니다.

비즈니스 로직 API 설명

상품 주문 API 를 호출 시, 재고 감소와 상품 주문 데이터가 생성됩니다.

상품 주문 (POST)

  • 상품을 주문하는 API 입니다.
비즈니스 로직 설명
  • 상품의 재고를 감소시킨 후에, 상품 주문 테이블에 INSERT 를 하는 로직입니다. 하나의 트랜잭션으로 처리됩니다.
  • 또한, 동시성 이슈를 해결하기 위해 메소드 시작 전에 productId 를 기준으로 redis lock 을 잡고, 메소드가 끝날 때, lock 이 release 됩니다.
  • Custom annotation (@DistributedLock) 만들어서 redis lock 을 잡도록 했습니다.
    @Transactional
    @DistributedLock(key = LOCK_KEY_PREFIX + "{createOrderRequest.productId}")
    override fun createOrder(createOrderRequest: OrderCommand.CreateOrder): Mono<String> {
        return productExecutor.reduceStock(
            ProductCommand.ReduceProduct.of(
                createOrderRequest.getProductId(),
                createOrderRequest.getQuantity()
            )
        )
            .flatMap {
                Mono.just(createOrderRequest)
                    .map { it.toEntity() }
                    .flatMap { orderStore.store(it) }
            }
            .onErrorResume { e ->
                // 예외 처리 로직
                Mono.error(Exception("createOrder 처리 중 예외 발생", e))
            }
    }
호출 예시
  • request 은 userId, productId, quantity (수량) 구성돼있습니다.
  • user1002 는 product1002 를 100개 만큼 주문합니다.
curl --location --request POST 'localhost:8080/api/v1/orders' \
--header 'Content-Type: application/json' \
--data-raw '{
    "userId" : "user1002",
    "productId" : "product1002",
    "quantity" : 100

}'

API 테스트 방법

1.docker 실행

2.CoreApplication 실행 (schema.sql DDL, DML 실행)

3.상품 주문 API 호출

4.상품 주문 조회

자세한 내용은 Github README.md 파일을 참고 하시면 됩니다.