e-commerce 대용량 서버 프로젝트에서 성능 테스트를 진행하기 전, 좀 더 유의미한 테스트를 진행하기 위한 방법이 무엇이 있는지 생각하게 되었습니다. 그 중 하나의 방법으로 가짜 데이터인 더미테이터
를 DB에 넣어보려 합니다. 특히 페이징이 필요한 상품 목록 조회
나 상품 검색하기
기능들을 테스트하기 위한 더미테이터를 넣을 생각입니다.
더미테이터는 유용한 데이터가 아니지만 데이터베이스에 공간을 차지하도록 만들어놓는 것입니다. 따라서 실제 데이터가 존재하는 것처럼 환경을 만들어 놓아 테스트를 위해 사용되기도 합니다. 모든 데이터 필드가 채워져 있다는 것을 보증할 수 있어 보다 유의미한 테스트가 가능하기 때문입니다.
더미데이터를 삽입하기 전, 현재 사용중인 DB의 용량을 확인하려 합니다. 용량을 넘어서지 않으면서 충분한 양의 데이터를 넣기 위함입니다.
mysql> SELECT SUM(data_length+index_length)/1024/1024 "used_MB", SUM(data_free)/1024/1024 "free_MB" FROM information_schema.tables;
+------------+--------------+
| used_MB | free_MB |
+------------+--------------+
| 8.21875000 | 140.00000000 |
+------------+--------------+
1 row in set (0.01 sec)
현재 DB의 남은 디스크 용량(free_MB
)과 사용중인 디스크 용량(used_MB
)을 다음 쿼리를 통해 알 수 있습니다. free_MB
에서 used_MB
을 차감하면 약 131.7MB의 용량을 사용할 수 있습니다.
mysql> SELECT table_schema "Database", ROUND(SUM(data_length+index_length)/1024/1024,1) "used_MB" FROM information_schema.TABLES GROUP BY 1;
+--------------------+---------+
| Database | used_MB |
+--------------------+---------+
| mysql | 7.8 |
| information_schema | 0.0 |
| performance_schema | 0.0 |
| sys | 0.0 |
| coupang | 0.4 |
+--------------------+---------+
5 rows in set (0.01 sec)
다음 쿼리를 입력하면 데이터베이스 별로 사용중인 DB용량을 확인할 수 있습니다. 프로젝트에 사용되는 데이터는 coupang
데이터베이스 내부에 저장되어 있으며, 현재까지는 약 0.4MB만큼 들어있습니다.
저는 상품 목록 조회
와 상품 검색
기능에 대한 성능 테스트를 진행할 것입니다. 따라서 먼저 PRODUCT
테이블과 CATEGORY
테이블에만 더미데이터를 삽입할 예정입니다.
먼저 상품 데이터 5만개를 삽입하기 전과 후로 DB사용량의 차이를 확인해볼 것입니다. 그 후에 데이터를 얼마나 넣을지 정할 생각입니다.
또한 더미데이터를 넣는 방법도 여러가지가 있는데, 이 글에서는 프로시저
와 mockaroo
를 이용한 방식에 대해 알아보려 합니다.
DELIMITER $$
DROP PROCEDURE IF EXISTS insertLoop$$
CREATE PROCEDURE insertLoop()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 50000 DO
INSERT INTO coupang.PRODUCT(category_id, name, price, main_img, detail_img, stock, score, delivery_fee, is_rocket, is_rocket_fresh, is_rocket_global)
VALUES (1, concat('product_name',i), 10000+i, concat('product_path',i), concat('product_detail_path',i), 100+i, 7, 2000+i, 1, 1, 0);
SET i = i + 1;
END WHILE;
END$$
DELIMITER $$
CALL insertLoop;
$$
mysql> SELECT table_schema "Database", SUM(data_length + index_length)/1024/1024 "usedMB" FROM information_schema.TABLES WHERE table_schema = 'coupang';
+----------+------------+
| Database | usedMB |
+----------+------------+
| coupang | 0.37500000 |
+----------+------------+
1 row in set (0.01 sec)
mysql> SELECT table_schema "Database", SUM(data_length + index_length)/1024/1024 "usedMB" FROM information_schema.TABLES WHERE table_schema = 'coupang';
+----------+-------------+
| Database | usedMB |
+----------+-------------+
| coupang | 10.87500000 |
+----------+-------------+
1 row in set (0.00 sec)
5만개의 상품 데이터를 추가한 결과, 약 10.5MB만큼의 용량이 찬 것을 확인할 수 있었습니다.
이보다 10배인 50만개의 데이터를 추가적으로 넣어보려고 합니다.
이번에는 프로시저 방식이 아닌 mockaroo
라는 사이트를 사용하여 더미데이터를 넣어보겠습니다.
해당 사이트에 접속하면 아래와 같은 화면이 보일 것입니다.
Field Name
, Type
, Option
을 수정하여 원하는 데이터들을 정제할 수 있습니다.
특히 Type
에 해당하는 요소를 누르면 아래와 같이 컬럼 타입에 맞는 데이터를 찾을 수 있습니다. 이 중에서 가장 유사한 데이터 타입을 선택하면 됩니다.
조금 더 컬럼에 적합한 데이터를 넣기 위해 Formula 기능을 사용할 수 있습니다. 우측에 사용방법이 나와있어 참고하시면 될 것 같습니다.
저는 아래 화면과 같이 데이터 타입들을 설정하였습니다.
데이터 타입 선택을 모두 완료한 후, Rows
에는 얻으려는 더미데이터의 개수를 입력하고 Format
에는 다운받을 파일 형식을 선택하시면 됩니다.
PRIVIEW
버튼을 통해 데이터들이 어떤식으로 출력되는지 미리 볼 수 있습니다. 미리보기를 통해 수정할 부분이 있는지 확인해보시는 것을 추천드립니다.
더 이상 수정할 부분이 없으신 경우, DOWNLOAD DATA
버튼을 눌러 더미데이터가 들어있는 파일을 다운받으시면 됩니다.
아쉽게도 mockaroo에서 비회원은 최대 1000개의 데이터만 다운로드가 가능하다고 합니다. 로그인을 하거나 업그레이드를 하지 않는 이상 데이터를 1000개씩 따로 삽입해야합니다.
다운받은 .sql
형식의 파일을 메모장을 통해 열고, 삽입쿼리를 mysql 터미널에 복사 붙여넣기 하시면 됩니다.
빠르게 대량의 데이터를 삽입할 수 있다.
하지만 랜덤식의 다양한 데이터를 넣기 힘들다.
다양한 종류와 범위의 데이터들이 있어 보다 현장감있는 데이터를 삽입할 수 있다.
하지만 비회원인 경우 데이터를 최대 1000개씩 다운로드가 가능해 대량의 데이터를 삽입하는 경우 번거로울 수 있다.
프로시저
와mockaroo
를 통해 더미데이터를 넣어보니 개인적으로 프로시저 방식이 더 편리했습니다. 55만개의 데이터를 넣는데mockaroo
는 시간이 오래 걸렸기 때문입니다. 하지만mockaroo
는 다양한 데이터 타입을 랜덤하게 넣을 수 있는 점이 큰 이점이라 포기하기 어려웠습니다. 특히상품 검색
기능의 성능 테스트를 위해서 시간이 오래걸리더라도mockaroo
를 통한 더미데이터 삽입이 좋을 것 같다고 판단하게 되었습니다.