API 성능 테스트를 위한 더미 데이터를 생성하는 과정이다.
처음에는 조회 대상인 suggestion만 10만개를 만들었는데,
10만개의 suggestion에 동일한 FK(member_key, position_id)를 넣는 실수를 했다.
그 결과 당연히 원하는 테스트 결과가 나오지 않았다.
-> 중복된 member, position을 조회하며 fetch join 적용했을 때 더 느림
실제 프로덕션 환경에서는 member, company, position, suggestion의 연결이 제각각일 것이기에
member, company, position, suggestion을 모두 10만개씩 생성하며, 생성 과정에서 FK를 랜덤으로 선택하도록 SQL을 짰다.
생성 코드
DELIMITER $$
DROP PROCEDURE IF EXISTS loopInsert$$
CREATE PROCEDURE loopInsert()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 100000 DO
-- 1. member 생성
INSERT INTO member (
created_date,
modified_date,
email,
member_key,
name,
nickname,
role,
social_type,
tid
)
VALUES (
NOW(), -- created_date
NOW(), -- modified_date
CONCAT('email', i, '@example.com'), -- email
REPLACE(UUID(), '-', ''), -- member_key
CONCAT('Member', i), -- name
CONCAT('Nick', i), -- nickname
'USER', -- role
'KAKAO', -- social_type
i -- tid
);
-- 2. company 생성
INSERT INTO company (
id,
created_date,
modified_date,
company_name,
industry_type
)
VALUES (
UNHEX(REPLACE(UUID(), '-', '')), -- id
NOW(), -- created_date
NOW(), -- modified_date
CONCAT('Company', i), -- company_name
JSON_ARRAY('Tech', 'Finance') -- industry_type (산업 분야 예시)
);
-- 3. position 생성
INSERT INTO position (
id,
created_date,
modified_date,
company_id,
position_name,
support_languages,
is_official
)
VALUES (
UNHEX(REPLACE(UUID(), '-', '')), -- id
NOW(), -- created_date
NOW(), -- modified_date
(SELECT id FROM company ORDER BY RAND() LIMIT 1), -- 랜덤 company_id
CONCAT('Position', i), -- position_name
JSON_ARRAY('Java', 'Python', 'JavaScript'), -- support_languages
TRUE -- is_official
);
-- 4. suggestion 생성
INSERT INTO suggestion (
id,
created_date,
modified_date,
suggestion_content,
suggestion_status,
position_id,
member_key
)
VALUES (
UNHEX(REPLACE(UUID(), '-', '')), -- id
NOW(), -- created_date
NOW(), -- modified_date
CONCAT('샘플 내용 ', i), -- suggestion_content
'COMPLETED', -- suggestion_status
(SELECT id FROM position ORDER BY RAND() LIMIT 1), -- 랜덤 position_id
(SELECT member_key FROM member ORDER BY RAND() LIMIT 1) -- 랜덤 member_key
);
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
-- 프로시저 호출
CALL loopInsert();
PK, FK, Not null, Unique 값들만 넣어줬는데도 복잡하긴 하다.
생성한 데이터 확인하기
SELECT COUNT(*) AS total_rows
FROM suggestion;