본문 바로가기
토이프로젝트/상품주문

[상품 주문 4편] 동시성 테스트

by 무대포 개발자 2023. 5. 8.
728x90
반응형

source 는 Github 에 있습니다.

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

[상품 주문 4편] 동시성 테스트

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

테스트 데이터

  • 데이터를 아래와 같이 미리 만들었습니다. (Spring - schema.sql)
  • Application 이 실행될 때, 아래 데이터가 INSERT 됩니다.
  • id 는 productId, name 은 product_name, stock 은 재고입니다.
insert into product (id, name, stock)
values
  ('product1001', 'Product A', 1000),
  ('product1002', 'Product B', 2000),
  ('product1003', 'Product C', 3000),
  ('product1004', 'Product D', 4000),
  ('product1005', 'Product E', 5000);

K6 스크립트

  • 동시 유저 5명에 USER_ID 는 user1~5 로 설정했습니다.
  • PRODUCT_ID 는 product1001~1005 로 테스트 했습니다.
  • 한 번에 주문 개수는 10개입니다.
import http from 'k6/http';

const BASE_URL = 'http://localhost:8080';
const USER_COUNT = 5;
const PRODUCT_IDS = ['product1001', 'product1002', 'product1003', 'product1004', 'product1005'];

export const options = {
  vus: USER_COUNT,
  duration: '20s',
};

export default function () {
  const userId = 'user' + __VU;
  const productId = PRODUCT_IDS[__VU % PRODUCT_IDS.length];
  const quantity = 10;

  const payload = JSON.stringify({
    userId: userId,
    productId: productId,
    quantity: quantity,
  });

  const url = `${BASE_URL}/api/v1/orders`;

  const headers = { 'Content-Type': 'application/json' };
  const response = http.post(url, payload, { headers: headers });

  if (response.status !== 200) {
    console.error(`Error for ${userId} - ${productId}: ${response.status} - ${response.body}`);
  }
}
  • k6 스크립트를 실행하고 설치하는 방법은 내용이 길어 포함시키지 않았습니다.
  • 실행하는 방법은 k6 run xxx.js 입니다.

테스트 결과

  • PRODUCT1001 ~ PRODUCT1005 의 총재고는 15000 개 입니다. 10개씩 주문했으니 주문은 1500 개가 만들어지는게 맞습니다.
  • PRODUCT 테이블을 조회해서 재고를 확인해보니 전부 0인 것도 맞습니다.

concurrency-test-result

댓글