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 파일을 참고 하시면 됩니다.