ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๊ณ ๋ฏผํ ๋ด์ฉ ์ ๋ฆฌ
[ ํ๋ก์ ํธ ์ค๋ช ]
๊ณต์ ํ์ด์ง ๋ฆฌ๋ด์ผ ํ๋ก์ ํธ์ด๊ณ , ๊ณต์ ํ์ด์ง ๋ด์๋ ๋ค์ํ ๋ธ๋ก๋ค์ด ์๋ค. ๋ธ๋ก์ ์ถ๊ฐํ๊ณ ๋๋๊ทธ์ค๋๋กญ์ผ๋ก ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ๊ณต์ ํ์ด์ง ๋ด์ ๋ธ๋ก๋ค๊ณผ ๋ธ๋ก ๋ด์ ๋ฐ์ดํฐ๋ค์ ์ ์ฅ/์์ /์กฐํ ์ ํ๋์ API๋ก ์ ์ก๋๋ค. ๊ณต์ ํ์ด์ง ์์ ์ ๋ธ๋ก์ด ์ถ๊ฐ๋๊ฑฐ๋ ์ญ์ ํน์ ์์๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋ค.
๋ธ๋ก์ ์์๋ int๊ฐ์ด ์๋, Request, Response ๋ฐ์ดํฐ์ ์์๋๋ก ์ ๋ ฌ๋์ด ๋ฆฌ์คํธ๋ก ํด๋ผ์ด์ธํธ์ ํต์ ํ๋ค.
1. NoSQL vs MySQL
ํ๋ก์ ํธ ํ๋ก์ฐ์ Update๊ฐ ๋ง์ด ๋ฐ์ํ๊ณ , ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ํ์ฑ ๋ณด์ฅ์ ์ํด MySQL์ ์ ํํ์๋ค.
2. Foreign key๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋๋ค ๊ด๊ณ๋ก DB ์ค๊ณ
๊ณต์ ํ์ด์ง์ ๋ธ๋ก ๋ฐ์ดํฐ๋ค์ด ์ฐ๊ด๊ด๊ณ๊ฐ ๋งบ์ด ์๋ค๋ฉด, ๊ณต์ ํ์ด์ง ๋ด์ ์๋ ๋ธ๋ก๋ค์ด ์ ๋ฐ์ดํธ ๋ ๋๋ง๋ค ๊ณต์ ํ์ด์ง ํ ์ด๋ธ๋ ์ ๋ฐ์ดํธ๊ฐ ์งํ์ด ๋๋ค. ์ ๋ฐ์ดํธ๋ฅผ ์ต์ํํ๋ฉฐ ๋ธ๋ก๋ค์ ์์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ฒ ๋์๋ค.
3. TEXT vs JSON
๊ณต์ ํ์ด์ง ๋ด ๋ธ๋ก๋ค์ ์์ ๋ณด์ฅ์ ์ํด JSON ๋ฐ์ดํฐ๋ก id์ ์์ ๊ฐ์ ์ ์ฅํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
[MySQL์ JSON ํ์ ๋ ์๋๋ฐ, TEXT ํ์ ์ผ๋ก ์ค๊ณํ ์ด์ ]
JSON ํ์ ์ '๋ฐ์ดํฐ์ ํน์ ํ๋๋ง ์ ๊ทผ, ํน์ ํ๋๋ง ์์ฃผ ์ ๋ฐ์ดํธ, ํน์ ํ๋๋ก ์ธ๋ฑ์ค ์์ฑ' ์ ์ ๋ฆฌํ๋ค๋ ์ด์ ์ด ์์ผ๋ ์ฑ๋ฅ์ด ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์๋ค. ์ด ํ๋ก์ ํธ์์๋ ์์ ๋งํ JSON์ ์ด์ ์ด ํด๋น๋์ง ์์๊ธฐ์ ๋น ๋ฅธ ์ฑ๋ฅ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ TEXT ํ์ ์ผ๋ก ์ค๊ณํ์๋ค.
๊ณต์ ํ์ด์ง ํ ์ด๋ธ
create table space_wall {
id int auto_increment primary key,
blocks text, -- position(์์), block_type(ex: listBlock), block_id(PK), block_UUID
share_url varchar(255),
space_id int,
member_id int,
space_wall_category varchar(255),
flag varchar(50),
create_at timestamp default current_timestamp,
updated_at timestamp default current_timestamp on update current_timestamp,
deleted_at timestamp null default null,
foreign key (space_id) references space(id),
foreign key (member_id) references member(id)
};
blocks ๋ฐ์ดํฐ
[
{
"position":1,
"block_type":"WALL_INFO_BLOCK",
"block_id":33,
"block_uuid":""
},
{
"position":2,
"block_type":"SNS_BLOCK",
"block_id":33,
"block_uuid":"2222222-0106-4340-b505-280e15626ecc"
},
{
"position":2,
"block_type":"SNS_BLOCK",
"block_id":34,
"block_uuid":"2222222-0106-4340-b505-280e15626ecc"
},
{
"position":3,
"block_type":"FREE_BLOCK",
"block_id":33,
"block_uuid":"1111111-0106-4340-b505-280e15626ecc"
},
{
"position":4,
"block_type":"LIST_BLOCK",
"block_id":33,
"block_uuid":"f108fff1-0106-4340-b505-280e15626ecc"
},
{
"position":4,
"block_type":"LIST_BLOCK",
"block_id":34,
"block_uuid":"f108fff1-0106-4340-b505-280e15626ecc"
},
{
"position":5,
"block_type":"FILE_BLOCK",
"block_id":33,
"block_uuid":"f108fff1-0106-4340-b505-280e15626ecc"
},
{
"position":6,
"block_type":"LIST_BLOCK",
"block_id":35,
"block_uuid":"f108fff1-0106-4340-b505-280e15626ecc"
},
{
"position":6,
"block_type":"LIST_BLOCK",
"block_id":36,
"block_uuid":"f108fff1-0106-4340-b505-280e15626ecc"
},
{
"position":7,
"block_type":"SNS_BLOCK",
"block_id":35,
"block_uuid":"2222222-0106-4340-b505-280e15626ecc"
},
{
"position":7,
"block_type":"SNS_BLOCK",
"block_id":36,
"block_uuid":"2222222-0106-4340-b505-280e15626ecc"
},
{
"position":8,
"block_type":"TEMPLATE_BLOCK",
"block_id":33,
"block_uuid":"f108fff1-0106-4340-b505-280e15626ecc"
},
{
"position":8,
"block_type":"TEMPLATE_BLOCK",
"block_id":34,
"block_uuid":"f108fff1-0106-4340-b505-280e15626ecc"
},
{
"position":9,
"block_type":"FILE_BLOCK",
"block_id":34,
"block_uuid":"f108fff1-0106-4340-b505-280e15626ecc"
},
{
"position":10,
"block_type":"STYLE_SETTING",
"block_id":33,
"block_uuid":""
}
]
4. VARCHAR vs TEXT
JSON ๋ฐ์ดํฐ๋ฅผ TEXT ์ปฌ๋ผ์ผ๋ก ์ ์ฅํ๋ ค๊ณ ํ๋ค ๋ณด๋ ๋ฌธ์์ด์ ๊ฒฝ์ฐ VARCHAR๋ก ์ ์ฅํ ์ ๋ ์๊ธฐ ๋๋ฌธ์ VACHAR์ TEXT ๋ ๊ฐ์ง๋ฅผ ๊ณ ๋ คํด ๋ณด์๋ค.
[ TEXT ]
BLOB, TEXT์ ๊ฐ์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ปฌ๋ผ ํ์ ์ LOB(LargeObject)๋ผ๊ณ ํ๋ค.
RDBMS์์ LOB ๋ฐ์ดํฐ๋ off-page(Extenrnl off-page storage)๋ผ๊ณ ํ๋ ์ธ๋ถ ๊ณต๊ฐ์ ์ ์ฅ๋๋ค. ๋ค๋ฅธ ํ์ ์ ๋ฐ์ดํฐ๋ ํ์ B-Tree์ Inline ์ ์ฅ๋๋ค. ๊ทธ๋์ BLOB๋ TEXT ์ปฌ๋ผ์ ๋ ์ฝ๋ ์ฌ์ด์ฆ ํ๊ณ์ ๊ฑฐ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
ํ์ง๋ง MySQL InnoDB์์ง์ ๊ฒฝ์ฐ LOB ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ 767๋ฐ์ดํธ ์ด๊ณผ ์์๋ง off-page์ ์ ์ฅํ๊ณ , ๊ทธ ์ดํ์ผ ๋๋ ๋ค๋ฅธ ํ๋์ ํจ๊ป ํ์ B-Tree์ ์ ์ฅ(Inline ์ ์ฅ)ํ๋ค. ์ด๋ ๊ณต๊ฐ ํจ์จ์ฑ๊ณผ ์ฑ๋ฅ ํฅ์์ ์ํ ๊ฒ์ด๋ค. Inline์ผ๋ก ์ ์ฅ๋๋ฉด ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ๋์คํฌ I/O๊ฐ ํ์ํ์ง ์์ ๋ฐ์ดํฐ ์ก์ธ์ค๊ฐ ๋ ๋นจ๋ผ์ง ์ ์๋ค.
LOB ๋ฐ์ดํฐ๋ ๋งค๋ฒ ๋ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ธ ๋๋ง๋ค ํ์ํ ๋งํผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์ด์ผํ๋ค. ์ด๋ ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ Perfomance_Schema์ ์ํด ์ธก์ ๋์ง ์๋๋ค. ๊ทธ๋์ LOB์ฉ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํด์ ๊ฐ ์คํ๋๋์ง ์ ์ ์์ด์ ์ฑ๋ฅ ์ํฅ๋๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์๋ค.
[ VARCHAR ]
VARCHAR๋ ๊ฐ๋ณ๊ธธ์ด ๋ฌธ์์ด ํ์ ์ด๋ค. ํ๋์ ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋๋ฉด ํ์ํ ๋งํผ ๋ฒํผ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ณ , ์ต๋ ๊ธธ์ด๊น์ง ๋์ ์ผ๋ก ํ์ฅ๋ ์ ์๋ค. (์ต๋๊ธธ์ด๋ ๋ฐ์ดํฐ ํ์ ์ ์ธ ์ ๊ดํธ ์์ ์ง์ ๋ ์ซ์)
VARCHAR ํ์ ์ ์ ์ฅ๋ ๊ฐ์ด ๊ธธ์ด์ off-page๋ก ์ ์ฅ๋ ๊ฒฝ์ฐ, MySQL์๋ฒ๋ TABLE ๊ฐ์ฒด์ records[2] ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ณ ์๋กญ๊ฒ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํด์ ์ฌ์ฉํ๋ค. ๊ทธ๋์ ๋งค์ฐ ํฐ ๊ฐ์ด ๋น๋ฒํ๊ฒ ์ ์ฅ๋๋ ๊ฒฝ์ฐ์๋ ์ฃผ์๊ฐ ํ์ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก๋ ํ์ B-Tree์ ์ ์ฅ(Inline ์ ์ฅ)๋๋ค.
ํ ํ์ ์ต๋ ํฌ๊ธฐ๊ฐ 65,535๋ฐ์ดํธ์ธ๋ฐ, ํ๋์ varchar ์ปฌ๋ผ์ด ๋๋ฌด ํฐ ๊ธธ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ปฌ๋ผ๋ค์ด ์ฌ์ฉํ ์ ์๋ ์ต๋ ๊ณต๊ฐ์ ํฌ๊ธฐ๊ฐ ์ํฅ์ ๋ฐ๊ฒ ๋๋ค. MySQL ์๋ฒ์์๋ ๋ ์ฝ๋ ์ฌ์ด์ฆ ํ๊ณ๋ก ์ธํด์ varchar ํ์ ์ ์ต๋ ์ ์ฅ ๊ธธ์ด ์ค์ ์์ ๊ณต๊ฐ์ ์๊ปด์ ์ค์ ํด์ผ ํ๋ค.
์ด ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๋ธ๋ก ์์ฑ์ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ ์์ ์ ์ธ ์๋น์ค ์ ๊ณต์ ์ํ์ฌ TEXT ์ปฌ๋ผ์ ์ฌ์ฉํ๊ธฐ๋ก ํ์๋ค. ์ ํ๋๊ฒ ์ค๊ณ๋ฅผ ํ์๋ค๊ฐ ์ด๋ค ๋ฌธ์ ๋ก ์ธํ์ฌ DB ์ปค๋ฅ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋ ๊ฒฝ์ฐ, ์ ์ ์ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋๋ ๋ฑ์ ์น๋ช ์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ๋ค๋ฅธ ์ปฌ๋ผ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๊ฐ์ด ๋ค์ด์ฌ ํ๋ฅ ์ด 1%๋ผ๋ ์๋ค๋ฉด TEXT ์ปฌ๋ผ์ ์ฌ์ฉํ๋ ๊ฒ ๋ง๋ค๊ณ ์๊ฐํ์๋ค.
๐ ์ฐธ๊ณ ๋งํฌ