230221(ํ)
๐ ์ฑ์ฅ์ผ์ง 3.1
์ฑ
ํ๋ณตํ ์ด๊ธฐ์ฃผ์์(์จ์ธ ๋ค์ด์ด)
์ ๋ด์ฉ์ ์๊ทน๋ฐ์ ์์ํ๋ ์๋ฐํ ์ฑ์ฅ๊ธฐ๋ก
์ด์์๋ ๊ฝ๊ณผ ์ฃฝ์ ๊ฝ์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๋๊ฐ?
์ฑ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ด์ ์๋ ๊ฒ์ด๋ค.
์๋ช ์ ์ ์ผํ ์ฆ๊ฑฐ๋ ์ฑ์ฅ์ด๋ค!
๐ณ ํค์๋ (1.0)
์ต๋ํ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌ, ์ถํ์ ๋ณด๋ฉด์ ์ค์ค๋ก ์ค๋ช
๐ ๊ฒฝํ ์์ฃผ๋ก (2.0)
๋จ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ๋ณด๋ค ๋ฌด์์ ๋ฐฐ์ ๊ณ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์งง๊ณ ๊ฐ๋จํ๊ฒ ์์ฑ
โ๏ธ ์ ํด์ง ํ ํ๋ฆฟ์ ๋ง์ถฐ์ (3.0)
ํค์๋, ๊ฒฝํ ๋ชจ๋ ์ข๋ค. ๋ค๋ง ๋งค์ผ ์์ฑํ๊ธฐ๋ก ๋ง์ ๋จน์๋งํผ ํต์ฌ๋ง ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ ์ ์๊ฒ ํ ํ๋ฆฟ์ ์์ฑ (3.1) 230102๋ถํฐ ์์๋๋ ํ์ต์ ๊ดํ ๋ด์ฉ ์ถ๊ฐ
๐ ์ค๋์ ํค์๋
๋์ปค๋ก mysql ์ปจํ ์ด๋ ๋์ฐ๊ณ ts๋ก ๊ฐ๋จํ๊ฒ ์ฐ๊ฒฐํ๋ ๊ณผ์ ๋ณต๊ธฐ
- ๋จผ์ docker๋ฅผ ์น์์ ๋ค์ด๋ก๋ ๋ฐ๋๋ค.(๋ณธ์ธ์ OS์ ๋ง๊ฒ ์ ๋ฐ์์ผํ๋ค.)
-
๋์ปค ๋ฒ์ ํ์ธ
docker -v
- 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๋ก ์ค์ ํ๋ค.(ํ๊ธ ๋ฐ ์ด๋ชจ์ง ์ฌ์ฉํ๊ธฐ ์ํด)
- ์คํ ์ค์ธ ์ปจํ ์ด๋์ ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๊ฒ ํ๋ค.(bash ์ฌ์ฉ)
docker exec -it mysql-container bash
- ๋ฃจํธ ๊ถํ์ผ๋ก mysql ์๋ฒ(?) ํน์ ์ปจํ ์ด๋์ ์ ์ํ๋ค.
mysql -u root -p
- ๊ทธ๋ฌ๋ฉด ์๊น ์์์ ์ค์ ํ root์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ณ ์ํฐ๋ฅผ ์ ๋ ฅํ๋ค.
- Database๋ฅผ ์์ฑํ๋ค.
CREATE DATABASE dbname;
- ์์ฑํ Database๋ฅผ ์ ํํ๋ค.
USE dbname;
- ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ ํํ์ ํ ์ด๋ธ์ ๋ง๋ค์ด์ค๋ค.
- NOT NULL, PRIMARY KEY, FOREIGN KEY, UNIQUE ๋ฑ์ ์ ์ฝ ์กฐ๊ฑด์ ํ ๋นํด์ค ์ ์๋ค.
CREATE TABLE tablename (field1 field1-type PRIMARY KEY, field2 field2-type NOT NULL);
- root ๊ถํ์ ์์์น ๋ชปํ ์ํ์ ์ด๋ํ ์ ์์ผ๋ฏ๋ก, ์๋ก์ด User๋ฅผ ๋ง๋ค๊ณ ๊ถํ์ ํ ๋นํด์ค๋ค.
-
์์ ๋ ๋ชจ๋ ๊ถํ์ ๋๊ฒจ์ค ๊ฒ์ด๋ค.
CREATE USER 'userID'@'%' identified by 'userpassword'; FLUSH PRIVILEGES; GRANT ALL PRIVILEGES ON dbname.* to userID@'%';
- 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(๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐฉ๊ธ ํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ํ๊ฒ ๋ค๋ ๋ป)๋ฅผ ์๋์ผ๋ก ํด์ค๋ค.
์ฐธ๊ณ
- TCP School - MySQL ์๊ฐ
- DB, DBMS, SQL ๊ฐ๋
- MySQL, ๋์ปค๋ก ๋์ฐ๊ธฐ
- TCP School - MySQL ์ฟผ๋ฆฌ๋ค
- mysql ์ต๋ ์ฉ๋ ์๋ฌ ํด๊ฒฐ
๐ ์์ฝ ๋ฐ ํ๋ฃจ ๊ฐ๋จ ํ๊ณ
์ค๋์ ์ ๋ง ๋ค์ํ ์๋ฌ๋ฅผ ๋ง๋ฌ๋ค. bulk insert ์ค mysql ํจํท ์ ํ ์ค๋ฅ, primary key ์ค๋ณต ์ค๋ฅ ์ด์ธ์๋ ์ก๋คํ docker ํ๊ฒฝ๋ณ์ ์ค์ ์ค๋ฅ๊น์งโฆ
๊ทธ๋๋ ํ์คํ ์ค๋ฅ๊ฐ ๋๋๊น ๊ตฌ๊ธ๋งํ๊ธฐ๋ ์ข๊ณ ํด๊ฒฐํ๊ธฐ ๋๋ฌด ์ข๋ค. ๋ณด์๋ง์ ์คํธ๋ ์ค ๋ฐ๊ธด ํ์ง๋ง ํด๊ฒฐํ๊ณ ๋ณด๋ฉด ์ด์ ํ๊ฐ์ ๊ณ ๋ง์ด ์ญํ ์ ํ๋ค. ์ ํ ๊ฐ๋ฐ ์์
ํ
์คํธ ์ฝ๋๋ฅผ ์ ์์ฑํ๊ณ ์ error, ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋์ง ์ ๊ฒ ๊ฐ๋ค.
์ค๋์ ์ํ ์
- ๋ฏธ์ ๊ตฌํ ์๋ฃ ๋ฐ ๊ฐ๋ ์ ๋ฆฌ ์ ๋ง ์ด์ฌํ ํจ!!!
์ค๋์ ์์ฌ์ด ์
- (์ถ๊ฐ ๋ฏธ์ ) data insertํ๋ ๊ณผ์ ์ ์๊ฐ์ ์ผ๋ก progress bar ๋ง๋๋ ๋ถ๋ถโฆ
- ๋ญ๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก insertํ ๋๋ง๋ค console.log๋ก ์ ์ ๊ธธ์ด์ง๊ฒ ๋ง๋ค์ด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.(๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์์ง๋..?)
- ๊ทผ๋ฐ ์๋ง ๋ด ์ฝ๋๋ bulk insert์์ bulk ๋จ์๋ฅผ ์ปค์คํ ํ๊ฒ ๋๋์ง ์์์, ์ด ๋ถ๋ถ์ ๋ถํ ํ๊ณ
- ๊ณ์ SELECT COUNT(*) ๋ก ๊ฐฏ์ ๊ฐ์ ธ์ค๋ฉด์ ์ ์ฒด ๋ฐ์ดํฐ ์์ ๋๋นํด %๋ก log๋ฅผ ์ฐ๋ ๋ฐฉ์์ผ๋ก ํด์ผํ ๋ฏํ๋ค.
- ์! ์ถ๊ฐ๋ก TypeORM์ ์จ๋ณด๊ณ ์ถ์๋๋ฐ, ๋ค์์ ์จ๋ณด๊ธฐ๋ก ํ ์ โฆ ์์ฝ๋ค! ๋ญ๊ฐ ์ฟผ๋ฆฌ๋ฌธ์ ts ๊ฐ์ฒด๋ก ํธํ๊ฒ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฑฐ ๊ฐ์๋ฐ..!
- ๋ค์์ ๊ผญ ์จ๋ด์ผ์ง