
-- 높은 재귀(반복) 횟수를 허용하도록 설정 -- (아래에서 생성할 더미 데이터의 개수와 맞춰서 작성하면 된다.) SET SESSION cte_max_recursion_depth = 1000000; -- 더미 데이터 삽입 쿼리 INSERT INTO boards (content, title, created_at) WITH RECURSIVE cte (n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 1000000 -- 생성하고 싶은 더미 데이터의 개수 ) SELECT CONCAT('Content', LPAD(n, 7, '0')), -- 'Content' 다음에 7자리 숫자로 구성된 이름 생성 CONCAT('Title', LPAD(n, 7, '0')), -- 'Title' 다음에 7자리 숫자로 구성된 이름 생성 TIMESTAMP(DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 3650) DAY) + INTERVAL FLOOR(RAND() * 86400) SECOND) AS created_at -- 최근 10년 내의 임의의 날짜와 시간 생성 FROM cte; -- 잘 생성됐는 지 확인 SELECT COUNT(*) FROM boards;
구성한 시스템이 1초당 몇 개의 요청을 견딜 수 있는 지 알아보려면, 점진적으로 트래픽을 늘려가게끔 부하 테스트를 셋팅해야 한다.

실제 프로덕션 환경에서 발생하는 트래픽과 최대한 비슷하게 부하를 만들어서 테스트 해야한다. 실제 서비스에서 100명의 사용자 중 95명이 게시글 조회(GET /boards)를 하고, 5명이 게시글 작성(POST /boards)을 한다고 가정하자. 실제 프로덕션 환경과 유사하게 트래픽을 만들어낼 수 있게 k6 코드를 작성해보자.
import http from 'k6/http'; import { sleep } from 'k6'; export const options = { // 부하를 생성하는 단계(stages)를 설정 stages: [ // 10분에 걸쳐 vus(virtual users, 가상 유저수)가 50에 도달하도록 설정 { duration: '10m', target: 50 } ], }; export default function () { let random = Math.random(); // 100명 중 5명의 비율로 게시글을 작성 if (random < 0.05) { const data = { title: '제목', content: '내용' }; http.post('http://{ELB 주소}/boards', JSON.stringify(data), { headers: { 'Content-Type': 'application/json' }, }); // 100명 중 95명의 비율로 게시글을 조회 } else { http.get('http://{ELB 주소}/boards'); } // 1초 휴식 sleep(1); }
$ K6_WEB_DASHBOARD=true k6 run script.js
http://{k6가 실행되고 있는 EC2 IP 주소}:5665으로 접속하기


