๐ŸŽ„ ์„ฑ์žฅ์ผ์ง€ 3.1

์ฑ… ํ–‰๋ณตํ•œ ์ด๊ธฐ์ฃผ์˜์ž(์›จ์ธ ๋‹ค์ด์–ด)์˜ ๋‚ด์šฉ์— ์ž๊ทน๋ฐ›์•„ ์‹œ์ž‘ํ•˜๋Š” ์†Œ๋ฐ•ํ•œ ์„ฑ์žฅ๊ธฐ๋ก

์‚ด์•„์žˆ๋Š” ๊ฝƒ๊ณผ ์ฃฝ์€ ๊ฝƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•˜๋Š”๊ฐ€?
์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์‚ด์•„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ๋ช…์˜ ์œ ์ผํ•œ ์ฆ๊ฑฐ๋Š” ์„ฑ์žฅ์ด๋‹ค!

๐ŸŒณ ํ‚ค์›Œ๋“œ (1.0)
์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ, ์ถ”ํ›„์— ๋ณด๋ฉด์„œ ์Šค์Šค๋กœ ์„ค๋ช…
๐Ÿ‰ ๊ฒฝํ—˜ ์œ„์ฃผ๋กœ (2.0)
๋‹จ์ˆœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋ณด๋‹ค ๋ฌด์—‡์„ ๋ฐฐ์› ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์งง๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ
โ„๏ธ ์ •ํ•ด์ง„ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ์„œ (3.0)
ํ‚ค์›Œ๋“œ, ๊ฒฝํ—˜ ๋ชจ๋‘ ์ข‹๋‹ค. ๋‹ค๋งŒ ๋งค์ผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๋งˆ์Œ ๋จน์€๋งŒํผ ํ•ต์‹ฌ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑ (3.1) 230102๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ํ•™์Šต์— ๊ด€ํ•œ ๋‚ด์šฉ ์ถ”๊ฐ€

๐Ÿ”‘ ์˜ค๋Š˜์˜ ํ‚ค์›Œ๋“œ

๋„์ปค๋กœ mysql ์ปจํ…Œ์ด๋„ˆ ๋„์šฐ๊ณ  ts๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ • ๋ณต๊ธฐ

  1. ๋จผ์ € docker๋ฅผ ์›น์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š”๋‹ค.(๋ณธ์ธ์˜ OS์— ๋งž๊ฒŒ ์ž˜ ๋ฐ›์•„์•ผํ•œ๋‹ค.)
  • ๋„์ปค ๋ฒ„์ „ ํ™•์ธ

    docker -v
  1. docker๋ฅผ ํ†ตํ•ด mysql ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์šด๋‹ค. ์ด ๋•Œ, ์›ํ•˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฑด ๋ค์ด๋‹ค!
docker run -d -p 3307:3306 --platform linux/amd64 -e MYSQL_ROOT_PASSWORD=1116 --name mysql-container mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  • 3307ํฌํŠธ๋กœ root ๋น„๋ฒˆ์€ 1116์ธ mysql-container๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ 5.7 ๋ฒ„์ „์˜ mysql ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์šด๋‹ค. ์ด ๋•Œ, character-set-server์™€ collation-server์€ ๊ฐ๊ฐ utf8mb4๋กœ ์„ค์ •ํ•œ๋‹ค.(ํ•œ๊ธ€ ๋ฐ ์ด๋ชจ์ง€ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด)
  1. ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.(bash ์‚ฌ์šฉ)
docker exec -it mysql-container bash
  1. ๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ mysql ์„œ๋ฒ„(?) ํ˜น์€ ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•œ๋‹ค.
mysql -u root -p
  • ๊ทธ๋Ÿฌ๋ฉด ์•„๊นŒ ์œ„์—์„œ ์„ค์ •ํ•œ root์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
  1. Database๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
CREATE DATABASE dbname;
  1. ์ƒ์„ฑํ•œ Database๋ฅผ ์„ ํƒํ•œ๋‹ค.
USE dbname; 
  1. ์ด์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์›ํ•˜๋Š” ํ˜•ํƒœ์˜ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.
  • NOT NULL, PRIMARY KEY, FOREIGN KEY, UNIQUE ๋“ฑ์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ํ• ๋‹นํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
CREATE TABLE tablename (field1 field1-type PRIMARY KEY, field2 field2-type NOT NULL);
  1. root ๊ถŒํ•œ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ƒˆ๋กœ์šด User๋ฅผ ๋งŒ๋“ค๊ณ  ๊ถŒํ•œ์„ ํ• ๋‹นํ•ด์ค€๋‹ค.
  • ์˜ˆ์ œ๋Š” ๋ชจ๋“  ๊ถŒํ•œ์„ ๋„˜๊ฒจ์ค€ ๊ฒƒ์ด๋‹ค.

    CREATE USER 'userID'@'%' identified by 'userpassword';
    FLUSH PRIVILEGES;
    GRANT ALL PRIVILEGES ON dbname.* to userID@'%';
  1. mysql์—์„œ exitํ•˜๊ณ  ์œ„์— ์ง€์ •ํ•ด์ค€ User๋กœ ์ ‘์†ํ•œ๋‹ค.(์œ„์—์„œ ์ง€์ •ํ•œ ํŒจ์Šค์›Œ๋“œ๋กœ!)
mysql -u userID -p

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์•„์ฃผ ๊ธฐ์ดˆ์ ์ธ ๊ณผ์ •์ด๋‹ค! docker๋ฅผ ํ†ตํ•ด mysql์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์šฐ๊ณ  ๊ทธ ์•ˆ์—์„œ ๋งˆ์น˜ ๋‹ค๋ฅธ ์„œ๋ฒ„์— database๋ฅผ ๋‘๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿผ ์ด์ œ ๋กœ์ปฌ์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ js ํ˜น์€ ts ์ฝ”๋“œ๋กœ mysql ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋ฐ›์•„, ํ†ต์‹ ํ•˜๋“ฏ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(์œ„์— ํ‚ค์›Œ๋“œ ์ •๋ฆฌ ์ค‘ MySQL ํ‚ค์›Œ๋“œ์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ!)

Bulk Insert

  • db์— ๋ฐ์ดํ„ฐ๋ฅผ insertํ•  ๋•Œ, insert ์ฟผ๋ฆฌ๋ฅผ ๊ณ„์† ๋‚ ๋ฆฌ๋ฉด ์ฟผ๋ฆฌ ์˜คํ”ˆ๊ณผ ํด๋กœ์ฆˆ์—๋„ ๋˜ ์ˆ˜๋งŽ์€ ์ž‘์—…๋“ค์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • ๊ทธ๋ž˜์„œ ๊ทธ๋Ÿฐ ๊ณผ์ •์„ ์ข€ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์•„์ฃผ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋™‡ ํ•˜๊ณ  ๋„ฃ๋Š” ๊ฒŒ Bulk Insert์ด๋‹ค.

์˜ˆ์ œ) ์•„๋ž˜์™€ ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

// ์ด ๋•Œ, `dataGenerator.allData`์˜ ํƒ€์ž…์€ {nickname: string, money: number, last_visit: Date}[] ํ˜•ํƒœ์ด๋‹ค.
// ํ•ด์„œ map์œผ๋กœ ๊ฐ ์š”์†Œ๋“ค์„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๊ทธ ์š”์†Œ๋“ค์„ ๋˜ ํ•œ๋ฒˆ ๋ฐฐ์—ด์— ๊ฐ์‹ธ์„œ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค.
connection.query(
    'INSERT INTO user_log (nickname, money, last_visit) VALUES ?',
    [
      dataGenerator.allData.map((item) => [
        item.nickname,
        item.money,
        item.last_visit,
      ]),
    ],
    (err: QueryError, results: RowDataPacket) => {
      if (err) {
        console.error(err);
      } else {
        console.log('์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
      }
    },
  );

์ด ๋•Œ, ํ•œ๋ฒˆ์— ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ INSERTํ•˜๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

SQL ์˜ค๋ฅ˜(1153): Got a packet bigger than 'max_allowed_packet' bytes

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, mysql์˜ ์ „์†ก packet ์šฉ๋Ÿ‰์„ ๋Š˜๋ ค์ฃผ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์“ด๋‹ค.(๊ธฐ๋ณธ์ ์œผ๋กœ 4MB)

SET GLOBAL max_allowed_packet=1000000000;
SET GLOBAL net_buffer_length=1000000;

๋˜ํ•œ, INSERT ์‹œ ๋ฐœ์ƒํ•˜๋Š” transaction(ํŠธ๋žœ์žญ์…˜)์„ ์ƒ๋žตํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.(๊ทธ๋Ÿฌ๋ฉด ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค.)

SET autocommit = 1;

๋ง๊ทธ๋Œ€๋กœ INSERT ์‹œ์—๋„ commit(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐฉ๊ธˆ ํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ˜์˜ํ•˜๊ฒ ๋‹ค๋Š” ๋œป)๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ค€๋‹ค.

์ฐธ๊ณ 

๐Ÿ“ ์š”์•ฝ ๋ฐ ํ•˜๋ฃจ ๊ฐ„๋‹จ ํšŒ๊ณ 

์˜ค๋Š˜์€ ์ •๋ง ๋‹ค์–‘ํ•œ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚ฌ๋‹ค. bulk insert ์ค‘ mysql ํŒจํ‚ท ์ œํ•œ ์˜ค๋ฅ˜, primary key ์ค‘๋ณต ์˜ค๋ฅ˜ ์ด์™ธ์—๋„ ์žก๋‹คํ•œ docker ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ์˜ค๋ฅ˜๊นŒ์ง€โ€ฆ
๊ทธ๋ž˜๋„ ํ™•์‹คํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋‹ˆ๊นŒ ๊ตฌ๊ธ€๋งํ•˜๊ธฐ๋„ ์ข‹๊ณ  ํ•ด๊ฒฐํ•˜๊ธฐ ๋„ˆ๋ฌด ์ข‹๋‹ค. ๋ณด์ž๋งˆ์ž ์ŠคํŠธ๋ ˆ์Šค ๋ฐ›๊ธด ํ•˜์ง€๋งŒ ํ•ด๊ฒฐํ•˜๊ณ ๋ณด๋ฉด ์ด์ •ํ‘œ๊ฐ™์€ ๊ณ ๋งˆ์šด ์—ญํ• ์„ ํ•œ๋‹ค. ์ œํ’ˆ ๊ฐœ๋ฐœ ์‹œ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์™œ ์ž‘์„ฑํ•˜๊ณ  ์™œ error, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”์ง€ ์•Œ ๊ฒƒ ๊ฐ™๋‹ค.

์˜ค๋Š˜์˜ ์ž˜ํ•œ ์ 

  • ๋ฏธ์…˜ ๊ตฌํ˜„ ์™„๋ฃŒ ๋ฐ ๊ฐœ๋… ์ •๋ฆฌ ์ •๋ง ์—ด์‹ฌํžˆ ํ•จ!!!

์˜ค๋Š˜์˜ ์•„์‰ฌ์šด ์ 

  • (์ถ”๊ฐ€ ๋ฏธ์…˜) data insertํ•˜๋Š” ๊ณผ์ •์„ ์‹œ๊ฐ์ ์œผ๋กœ progress bar ๋งŒ๋“œ๋Š” ๋ถ€๋ถ„โ€ฆ
  • ๋ญ”๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ insertํ•  ๋•Œ๋งˆ๋‹ค console.log๋กœ ์ ์  ๊ธธ์–ด์ง€๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.(๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง„ ์•Š์„์ง€๋„..?)
  • ๊ทผ๋ฐ ์•„๋งˆ ๋‚ด ์ฝ”๋“œ๋Š” bulk insert์—์„œ bulk ๋‹จ์œ„๋ฅผ ์ปค์Šคํ…€ํ•˜๊ฒŒ ๋‚˜๋ˆ„์ง€ ์•Š์•„์„œ, ์ด ๋ถ€๋ถ„์„ ๋ถ„ํ• ํ•˜๊ณ 
  • ๊ณ„์† SELECT COUNT(*) ๋กœ ๊ฐฏ์ˆ˜ ๊ฐ€์ ธ์˜ค๋ฉด์„œ ์ „์ฒด ๋ฐ์ดํ„ฐ ์ˆ˜์— ๋Œ€๋น„ํ•ด %๋กœ log๋ฅผ ์ฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด์•ผํ• ๋“ฏํ•˜๋‹ค.
  • ์•„! ์ถ”๊ฐ€๋กœ TypeORM์„ ์จ๋ณด๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, ๋‹ค์Œ์— ์จ๋ณด๊ธฐ๋กœ ํ•œ ์ โ€ฆ ์•„์‰ฝ๋‹ค! ๋ญ”๊ฐ€ ์ฟผ๋ฆฌ๋ฌธ์„ ts ๊ฐ์ฒด๋กœ ํŽธํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฑฐ ๊ฐ™์€๋ฐ..!
  • ๋‹ค์Œ์— ๊ผญ ์จ๋ด์•ผ์ง€