๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Database)๊ฐ€ ์ •ํ™•ํžˆ ๋ญ˜๊นŒ?

๋‹จ์ˆœํžˆ โ€œ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณโ€์ด๋ผ๊ณ  ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ถ”์ƒ์ ์ด๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๋ฉฐ, ํ•„์š”ํ•  ๋•Œ ํšจ์œจ์ ์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ์‹œ์Šคํ…œ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” โ€œ์ €์žฅโ€์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ํšจ์œจ์ ์œผ๋กœ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”๋ชจ์žฅ์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ด๋ ‡๊ฒŒ ์ ์–ด๋‘”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์งฑ๊ตฌ, 28, ์„œ์šธ
์ฒ ์ˆ˜, 22, ๋ถ€์‚ฐ

์—ฌ๊ธฐ์„œ ํŠน์ • ์‚ฌ๋žŒ์„ ์ฐพ๊ฑฐ๋‚˜, ๋‚˜์ด๊ฐ€ 26 ์ด์ƒ์ธ ์‚ฌ๋žŒ๋งŒ ๊ณจ๋ผ๋‚ด๊ณ  ์‹ถ์œผ๋ฉด
ํ•˜๋‚˜ํ•˜๋‚˜ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊นŒ์›Œ์ง„๋‹ค.

๋ฐ˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ •ํ•œ ๊ตฌ์กฐ๋กœ ์ €์žฅํ•˜๊ณ , ์กฐ๊ฑด์— ๋งž๊ฒŒ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๊ณ , ์ˆ˜์ •, ์‚ญ์ œ๊นŒ์ง€ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค

์ฆ‰, ๋‹จ์ˆœํ•œ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‹ค์Œ ์งˆ๋ฌธ์ด ๋‚˜์˜จ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•ด์•ผ ํ• ๊นŒ?
๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋ฐฉ์‹์œผ๋กœ๋งŒ ์ €์žฅํ•˜๋Š” ๊ฒŒ ์ตœ์„ ์ผ๊นŒ?

์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€ํ‘œ์ ์ธ ๋‘ ๊ฐ€์ง€ ๋‹ต์ด ๋ฐ”๋กœ RDB์™€ NoSQL์ด๋‹ค.

RDB (๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)

RDB : ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ•ด์ง„ ๊ตฌ์กฐ(์Šคํ‚ค๋งˆ)์— ๋งž์ถฐ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

RDB๋Š” Relational Database์˜ ์•ฝ์ž๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ–‰๊ณผ ์—ด์ด ์žˆ๋Š” ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ MySQL, MariaDB, PostgreSQL, SQLite, OracleDB์ด ์žˆ๋‹ค.

์—‘์…€์„ ๋– ์˜ฌ๋ฆฌ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

id name age
1 seungje 28


์ด์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์ •ํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ €์žฅ๋œ๋‹ค.

RDB๋Š” ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์œ ํ˜•์œผ๋กœ, Schema(์Šคํ‚ค๋งˆ)๋ผ๋Š” ํ‹€์— ๋งž์ถฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์Šคํ‚ค๋งˆ๋ž€ ๋‹จ์ˆœํ•œ ํ˜•์‹์ด ์•„๋‹ˆ๋ผ โ€œ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘๋Š” ๊ทœ์น™โ€์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งฅ๋„๋‚ ๋“œ์— ๊ฐ€๋ฉด ๋ฉ”๋‰ดํŒ์ด ๋”ฑ ์ •ํ•ด์ ธ ์žˆ๋‹ค.
ํ–„๋ฒ„๊ฑฐ๋Š” ํ–„๋ฒ„๊ฑฐ, ์ฝœ๋ผ๋Š” ์ฝœ๋ผ, ๊ฐ์žํŠ€๊น€์€ ๊ฐ์žํŠ€๊น€

๊ทผ๋ฐ ๊ฐ‘์ž๊ธฐ โ€œ๋ถˆ๊ณ ๊ธฐ๋ฒ„๊ฑฐ์— ๊ฐ‘์ž๊ธฐ ๊น€์น˜ ๋„ฃ์–ด์ฃผ์„ธ์š”โ€ ์ด๋Ÿฐ ๊ฑด ์•ˆ ๋œ๋‹ค..
์ด๋ฏธ ์ •ํ•ด์ง„ ๋ ˆ์‹œํ”ผ(์Šคํ‚ค๋งˆ)๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์‹ค์ œ ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ๋” ๋ช…ํ™•ํ• ๊ฑฐ๋‹ค.

CREATE TABLE users (
user_id BIGINT NOT NULL AUTO_INCREMENT,
point BIGINT DEFAULT 0,
nickname VARCHAR(20),
information VARCHAR(100),
tags VARCHAR(255),
role ENUM(โ€˜NOT_REGISTEREDโ€™, โ€˜USERโ€™, โ€˜ADMINโ€™) NOT NULL,
PRIMARY KEY (user_id),
UNIQUE (nickname)
);

์ฒ˜์Œ ๋ณด๋ฉด ๊ต‰์žฅํžˆ ๋ณต์žกํ•ด ๋ณด์ด๋Š”๋ฐ, ์‚ฌ์‹ค ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณด๋ฉด ๋ณ„๊ฑฐ ์•„๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ํ•œ ์ค„๋กœ ์ •๋ฆฌํ•˜๋ฉด โ€œusers๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ , ์–ด๋–ค ๋ฐ์ดํ„ฐ๋งŒ ๋“ค์–ด์˜ฌ์ง€ ๋ฏธ๋ฆฌ ์ •์˜ํ•œ ๊ฒƒโ€์ด๋‹ค.

์กฐ๊ธˆ๋งŒ ๋‚˜๋ˆ ์„œ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ํ›จ์”ฌ ์‰ฝ๋‹ค.

user_id BIGINT โ†’ ์ˆซ์ž๋กœ ๋œ id๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.
NOT NULL โ†’ ๋ฐ˜๋“œ์‹œ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. (๋น„์–ด์žˆ์œผ๋ฉด ์•ˆ ๋จ)
AUTO_INCREMENT โ†’ ๊ฐ’์ด ์ž๋™์œผ๋กœ 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค. ์ฆ‰, ํšŒ์›๊ฐ€์ž…ํ•  ๋•Œ๋งˆ๋‹ค id๊ฐ€ ์ž๋™์œผ๋กœ ๋ถ™๋Š”๋‹ค.

point BIGINT DEFAULT 0 โ†’ point๋ผ๋Š” ์ˆซ์ž ํ•„๋“œ๊ฐ€ ์žˆ๊ณ , ๊ฐ’์„ ์•ˆ ๋„ฃ์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด 0์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

nickname VARCHAR(20) โ†’ ์ตœ๋Œ€ 20๊ธ€์ž์˜ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

role ENUM(โ€˜NOT_REGISTEREDโ€™, โ€˜USERโ€™, โ€˜ADMINโ€™) โ†’ ์•„๋ฌด ๊ฐ’์ด๋‚˜ ๋„ฃ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ •ํ•ด์ง„ ๊ฐ’๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ USER, ADMIN ๊ฐ™์€ ๊ฐ’๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ  โ€œSUPER_ADMINโ€ ๊ฐ™์€ ๊ฑด ์•„์˜ˆ ๋ชป ๋„ฃ๋Š”๋‹ค

๋งˆ์ง€๋ง‰์œผ๋กœ ์ œ์•ฝ ์กฐ๊ฑด
PRIMARY KEY (user_id) โ†’ ์ด ํ…Œ์ด๋ธ”์—์„œ user_id๋Š” ์œ ์ผํ•œ ๊ธฐ์ค€๊ฐ’์ด๋‹ค.

UNIQUE (nickname) โ†’ nickname์€ ์ค‘๋ณต๋˜๋ฉด ์•ˆ ๋œ๋‹ค.

์ด๊ฑธ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด โ€œusers ํ…Œ์ด๋ธ”์—๋Š” ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ , ๊ทธ ๊ทœ์น™์„ ์–ด๊ธฐ๋ฉด ์•„์˜ˆ ์ €์žฅ ์ž์ฒด๊ฐ€ ์•ˆ ๋œ๋‹คโ€

์ด๊ฒŒ ๋ฐ”๋กœ RDB์˜ ํ•ต์‹ฌ์ด๋‹ค.
๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ ์ „์— ํ˜•ํƒœ + ๊ทœ์น™ + ์ œํ•œ ์กฐ๊ฑด์„ ์ „๋ถ€ ๋ฏธ๋ฆฌ ์ •ํ•ด๋‘”๋‹ค.


RDB์˜ ๊ฐ•์ 


RDB โ€œ๋ฐ์ดํ„ฐ๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ๊ด€๋ฆฌํ•œ๋‹คโ€ ์ด ํ•œ๋งˆ๋””๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๏น– โ‡

ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž.

๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ (Data Integrity)

RDB์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค. ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด๋ž€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ญ์ƒ ์ •ํ™•ํ•˜๊ณ , ์ผ๊ด€๋˜๊ณ , ๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด โ€œ๋ฐ์ดํ„ฐ๊ฐ€ ๊นจ์ง€์ง€ ์•Š๊ฒŒ ์ง€์ผœ์ฃผ๋Š” ๊ทœ์น™โ€์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํšŒ์› ํ…Œ์ด๋ธ”์—์„œ user_id๊ฐ€ ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด?
-> ์•„๋งˆ ๊ทธ ์ˆœ๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

RDB๋Š” ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์•„์˜ˆ ์‹œ์Šคํ…œ์ ์œผ๋กœ ๋ง‰๋Š”๋‹ค.
๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

  • ๊ฐœ์ฒด ๋ฌด๊ฒฐ์„ฑ (Entity Integrity)
    • ๋ชจ๋“  ํ…Œ์ด๋ธ”์€ ๊ธฐ๋ณธํ‚ค(PK)๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค
    • PK๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†๊ณ , NULL๋„ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค
    • ๊ฐ ๋ฐ์ดํ„ฐ๋Š” ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค
  • ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ (Referential Integrity)
    • ์™ธ๋ž˜ํ‚ค(FK)๋Š” ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค
    • ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ผ์€ ์—†๋‹ค
  • ๋„๋ฉ”์ธ ๋ฌด๊ฒฐ์„ฑ (Domain Integrity)
    • ์ปฌ๋Ÿผ์— ๋“ค์–ด๊ฐˆ ๊ฐ’์˜ ํƒ€์ž…๊ณผ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•œ๋‹ค
    • ์ด ์ปฌ๋Ÿผ์—๋Š” ์ด ๊ฐ’๋งŒ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค


์ฆ‰ RDB๋Š” ์ด์ƒํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๊ฐ€๋Šฅ์„ฑ ์ž์ฒด๋ฅผ ๋ง‰๋Š”๊ฑฐ๋‹ค.

๋ช…ํ™•ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณด์žฅ

RDB๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์Šคํ‚ค๋งˆ(Schema)๋ฅผ ๋จผ์ € ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
์ด ์Šคํ‚ค๋งˆ๋Š” ๋‹จ์ˆœํ•œ ํ˜•์‹์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ํƒ€์ž…, ๊ธธ์ด, ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ชจ๋‘ ํฌํ•จํ•œ ๋ฐ์ดํ„ฐ ์„ค๊ณ„๋„๋‹ค.

์•„๊นŒ users ํ…Œ์ด๋ธ”์—์„œ ๊ทœ์น™์„ ์–ด๊ธฐ๋ฉด ์•„์˜ˆ ์ €์žฅ์ด ์•ˆ ๋œ๋‹ค๊ณ ํ–ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ RDB๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š”๋ฐ ์ด๊ฒŒ ๋ฐ”๋กœ ์•ˆ์ „์„ฑ์ด ๋†’์€ ์ด์œ ์ด๋‹ค.

ACID ํŠน์„ฑ ๋ณด์žฅ (ํŠธ๋žœ์žญ์…˜)

RDB๋Š” ํŠธ๋žœ์žญ์…˜(Transaction)์„ ํ†ตํ•ด ACID ํŠน์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค. ์ด์—๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ๊ธ€์—์„œ ์„ค๋ช…์„ ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

ํ•ต์‹ฌ๋งŒ ๋ณด๋ฉด ๋ฌด์Šจ ์ผ์ด ์žˆ์–ด๋„ ๋ฐ์ดํ„ฐ๋Š” ์ •์ƒ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค๋Š” ๊ฑฐ๋‹ค.

์ค‘๊ฐ„์— ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉด ์•„์˜ˆ ์ „๋ถ€ ์ทจ์†Œํ•˜๋Š” ๋“ฑ ์ผ๋ถ€๋งŒ ์ €์žฅ๋˜๋Š” ์ผ ์—†๊ณ , ๋™์‹œ์— ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ์™€๋„ ๋ฐ์ดํ„ฐ ๊ผฌ์ด์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด ๊ณ„์ขŒ ์ด์ฒด ์ค‘์— ์„œ๋ฒ„๊ฐ€ ๊บผ์ ธ๋„ ์•„์˜ˆ ๊ฑฐ๋ž˜ ์ž์ฒด๊ฐ€ ์—†๋˜ ์ผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์€ํ–‰์ด๋‚˜ ๊ฒฐ์ œ ์‹œ์Šคํ…œ, ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ๊ฐ™์€ ๊ณณ์—์„œ RDB๋Š” ํ•„์ˆ˜์ด๋‹ค.


RDB์˜ ํ•œ๊ณ„


๋ฐ˜๋Œ€๋กœ ์ƒ๊ฐํ•ด๋ณด์ž. ๋งฅ๋„๋‚ ๋“œ์ฒ˜๋Ÿผ ๋ฉ”๋‰ด๊ฐ€ ๋”ฑ ์ •ํ•ด์ ธ ์žˆ์œผ๋ฉด ์•ˆ์ •์ ์ด๊ธด ํ•œ๋ฐ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค.

โ€œ๋ฉ”๋‰ด๋ฅผ ๋ฐ”๊พธ๊ธฐ ํž˜๋“ค๋‹คโ€

๊ฒฝ์ง๋œ ์Šคํ‚ค๋งˆ (Schema)

RDB๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ ์ „์— ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ์žฅ์ ๋„ ์žˆ์ง€๋งŒ, ๋ฌธ์ œ๋Š” ์„œ๋น„์Šค๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์š”๊ตฌ์‚ฌํ•ญ์ด ๊ณ„์† ๋ฐ”๋€๋‹ค๋Š” ์ ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ‘์ž๊ธฐ โ€œํ”„๋กœํ•„ ์ด๋ฏธ์ง€โ€ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ โ€œ์†Œ์…œ ๋กœ๊ทธ์ธ ์ •๋ณดโ€ ์ถ”๊ฐ€ํ•˜๋Š” ์ƒํ™ฉ์ด ์˜ค๋ฉด ์ด๋Ÿด ๋•Œ๋งˆ๋‹ค ์ปฌ๋Ÿผ ์ถ”๊ฐ€ โ†’ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์•„์ง์€ ๊ดœ์ฐฎ์•„๋ณด์ด์ง€๋งŒ, ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ฒœ๋งŒ ๊ฑด์ด๋ฉด??

์ด ์ž‘์—… ์ž์ฒด๊ฐ€ ์œ„ํ—˜ํ•˜๊ณ  ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ๋œ๋‹ค..

JOIN์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ

RDB๋Š” ๋ฐ์ดํ„ฐ ์ค‘๋ณต์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ํ…Œ์ด๋ธ”์„ ๋‚˜๋ˆ ์„œ ์ €์žฅํ•œ๋‹ค. ์ด๊ฑธ ์ •๊ทœํ™”๋ผ๊ณ  ํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด users, orders, payments ์ด๋ ‡๊ฒŒ ๋‚˜๋‰˜์–ด ์žˆ๋Š”๋ฐ, ํ•œ๋ฒˆ์— ์กฐํšŒํ•˜๋ ค๋ฉด?

JOIN์„ ํ•ด์•ผํ•˜๋Š”๋ฐ, ๋ฌธ์ œ๋Š” ํ…Œ์ด๋ธ”์ด ๋งŽ์•„์ง€๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ๊ด€๊ณ„๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉด,,JOIN ๋น„์šฉ์ด ์ปค์ง€๊ณ  ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค..

Scale-out์ด ์–ด๋ ค์›€

ํŠธ๋ž˜ํ”ฝ(ํŠน์ • ์‹œ๊ฐ„ ๋™์•ˆ ๋„คํŠธ์›Œํฌ๋‚˜ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ „์ฒด ์–‘)์ด ๋งŽ์•„์ง€๋ฉด ์„œ๋ฒ„๋ฅผ ๋Š˜๋ ค์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

Scale-up โ†’ ์„œ๋ฒ„ ์„ฑ๋Šฅ์„ ์˜ฌ๋ฆผ
Scale-out โ†’ ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋‚˜๋ˆ”

RDB๋Š” ๊ตฌ์กฐ์ƒ Scale-up์—๋Š” ๊ฐ•ํ•˜์ง€๋งŒ, Scale-out์—๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋ถˆ๋ฆฌํ•˜๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ(ACID)์„ ์œ ์ง€ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ ๋ณดํ†ต ์ฝ๊ธฐ ์ „์šฉ ๋ณต์ œ DB๋ฅผ ๋‘๊ฑฐ๋‚˜, ์ผ๋ถ€ ํŠธ๋ž˜ํ”ฝ๋งŒ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๋ฐฉ์‹ ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ write๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๊ฒฐ๊ตญ ํ•œ๊ณ„๊ฐ€ ์˜จ๋‹ค.

์ฆ‰ RDB๋Š” ๋ณ€ํ™”๊ฐ€ ๋งŽ๊ณ , ๊ตฌ์กฐ๊ฐ€ ์ž์ฃผ ๋ฐ”๋€Œ๊ณ , ํ™•์žฅ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—์„œ๋Š” ํ•œ๊ณ„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ NoSQL์ด๋‹ค.

NoSQL (๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)


RDB์˜ ํ•œ๊ฒŒ๋ฅผ ๋ณด๋‹ค๋ณด๋ฉด ๊ตณ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ด์ •๋„๋กœ ๋นก์„ธ๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผํ• ๊นŒ์‹ถ์€ ์ƒ๊ฐ์ด ๋“ ๋‹ค.

์„œ๋น„์Šค๊ฐ€ ์ปค์ง€๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์–‘ํ•ด์ง€๊ณ , ๊ตฌ์กฐ๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ๋Š” ์ƒํ™ฉ์—์„œ๋Š” ์˜คํžˆ๋ ค ์ด๋Ÿฐ ๊ทœ์น™์ด ๋ฐœ๋ชฉ์„ ์žก๊ธฐ ์‹œ์ž‘ํ•˜๋Š”๋ฐ, ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ NoSQL์ด๋‹ค.

NoSQL : ๊ณ ์ •๋œ ์Šคํ‚ค๋งˆ ์—†์ด ์œ ์—ฐํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

NoSQL์€ Not Only SQL์˜ ์•ฝ์ž๋กœ ํ•˜๋‚˜์˜ ํŠน์ • DB๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Document (MongoDB), Key-Value (Redis), Graph ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

RDB๊ฐ€ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋งž์ถ”๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด
NoSQL์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๋งŒ๋“ค๊ณ , ๊ทธ์— ๋งž์ถฐ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด MongoDB ๊ฐ™์€ Document DB๋ฅผ ๋ณด๋ฉด

{
  "name": "seungje",
  "age": 28,
  "hobby": ["study", "sleep"]
}

์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์€ ๊ตฌ์กฐ์ผ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š”๊ฑฐ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด hobby๊ฐ€ ์žˆ์ง€๋Š” ์•Š์ง€ ์•Š์€๊ฐ€?

์Œ์‹์ ์œผ๋กœ ์˜ˆ์‹œ๋ฅผ ๋“ค๋ฉด RDB๋Š” ๋งฅ๋„๋‚ ๋“œ์ง€๋งŒ NoSQL์€ ์†๋‹˜์ด ์›ํ•˜๋Š” ๋Œ€๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ปค์Šคํ…€ ์Œ์‹์ ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.


NoSQL์˜ ๊ฐ•์ 

์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ (Flexible Schema)

RDB์—์„œ๋Š” ์ปฌ๋Ÿผ ์ถ”๊ฐ€ โ†’ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ โ†’ ์œ„ํ—˜ํ•œ ์ž‘์—…์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผํ–ˆ์ง€๋งŒ, NoSQL์€ ์ •ํ•ด์ง„ ์Šคํ‚ค๋งˆ๊ฐ€ ์—†๋‹ค.

๊ทธ๋ƒฅ ์ƒˆ๋กœ์šด ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค

์˜ˆ๋ฅผ๋“ค์–ด

{
  "name": "seungje",
}
{
  "name": "seungje",
  "age": 28,
  "hobby": ["study", "sleep"]
}

์ด ๋‘ ๊ฐœ๊ฐ€ ๊ฐ™์€ ์ปฌ๋ ‰์…˜์— ๋“ค์–ด๊ฐ€๋„ ์ „ํ˜€ ๋ฌธ์ œ ์—†๋‹ค. ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ๋น„์šฉ ์—†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋น ๋ฅธ ์ฝ๊ธฐ ์„ฑ๋Šฅ (Read Performance)

RDB๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ ์„œ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— JOIN์ด ํ•„์š”ํ•˜์ง€๋งŒ,
NoSQL์€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ฐ™์ด ์ €์žฅํ•œ๋‹ค (์ค‘๋ณต ํ—ˆ์šฉ)

๊ทธ๋ž˜์„œ ์กฐํšŒํ•  ์‹œ JOIN ์—†์ด ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฝ๊ธฐ ์„ฑ๋Šฅ์ด ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.

Scale-out์— ์œ ๋ฆฌ

NoSQL์€ ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ•œ๋ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ ์„œ ์ €์žฅํ•  ๋•Œ๋„ ๊ทธ๋ƒฅ ๋ฒ”์œ„๋กœ ์ž˜๋ผ์„œ ์„œ๋ฒ„์— ๋ถ„์‚ฐํ•˜๋ฉด ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๊ฐ€ 100๊ฐœ๋ผ๋ฉด

์„œ๋ฒ„1 โ†’ 1~25
์„œ๋ฒ„2 โ†’ 26~50
์„œ๋ฒ„3 โ†’ 51~75
์„œ๋ฒ„4 โ†’ 76~100

์ด๋Ÿฐ ์‹์œผ๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ถ„์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ž˜์„œ NoSQL์€ ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค, ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ์‹œ์Šคํ…œ ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.


NoSQL์˜ ํ•œ๊ณ„

ํŠธ๋žœ์žญ์…˜ ๋ถ€์กฑ (ACID ๋ฏธ๋ณด์žฅ)

RDB๋Š” ACID๋ฅผ ๋ณด์žฅํ•˜์ง€๋งŒ, NoSQL์€ ๋Œ€๋ถ€๋ถ„ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ œํ•œ์ ์ด๋‹ค.

์ฆ‰ ์ผ๋ถ€๋งŒ ์ €์žฅ๋˜๋Š” ์ƒํ™ฉ์ด๋‚˜ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ฌผ๋ก  MongoDB ๊ฐ™์€ ์ผ๋ถ€ DB๋Š” ์ง€์›ํ•˜๊ธด ํ•œ๋‹ค)

๋ฐ์ดํ„ฐ ์ค‘๋ณต์œผ๋กœ ์ธํ•œ update ๋น„์šฉ ์ฆ๊ฐ€

NoSQL์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ค‘๋ณต ์ €์žฅ์„ ํ—ˆ์šฉํ•œ๋‹ค

๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ๋‹ค ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ์— ์žˆ๋‹ค๋ฉด ์ „๋ถ€ ๋‹ค ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค..

๊ทธ๋ž˜์„œ update ๋น„์šฉ์ด ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์กฐ ๊ด€๋ฆฌ ์ฑ…์ž„์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์žˆ๋‹ค

RDB๋Š” ์Šคํ‚ค๋งˆ๊ฐ€ ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜์ง€๋งŒ, NoSQL์€ ์•„๋ฌด ์ œ์•ฝ์ด ์—†๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ• ์ง€, ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ• ์ง€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ณ ๋ฏผํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฑฐ๋‚˜, ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ ์šฐ๋ฆฌ์—๊ฒŒ ๋งŽ์€ ๋ถˆํŽธํ•จ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค..

์–ด๋–ค DB๋ฅผ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ?


NoSQL์ด RDB๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์„œ๋กœ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์„ ๋ณด์™„ํ•˜๋Š” ๊ด€๊ณ„๋‹ค.

โ€œ๋ฌด์กฐ๊ฑด ์ข‹์€ DBโ€๋Š” ์—†๊ณ  โ€œ์ƒํ™ฉ์— ๋งž๋Š” DBโ€๋งŒ ์กด์žฌํ•œ๋‹ค.

์‹ค์ œ ํ•ด์™ธ ๊ฐœ๋ฐœ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋„ โ€œ์ผ๋‹จ RDB๋ฅผ ๋จผ์ € ๊ณ ๋ คํ•˜๊ณ , ํ•„์š”ํ•˜๋ฉด NoSQL์„ ์ถ”๊ฐ€ํ•˜์žโ€๋Š” ์˜๊ฒฌ์ด ๋งŽ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„์ง€ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด

  • RDB
    • ๋ฐ์ดํ„ฐ๊ฐ€ ์ ˆ๋Œ€ ํ‹€๋ฆฌ๋ฉด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ (ex. ๊ฒฐ์ œ, ๊ณ„์ขŒ, ์ฃผ๋ฌธ ์‹œ์Šคํ…œ)
    • ๋ฐ์ดํ„ฐ ๊ฐ„ ๊ด€๊ณ„๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ (JOIN์ด ๋งŽ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ)
    • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ž์ฃผ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    • ํŠธ๋žœ์žญ์…˜์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • ์ˆ˜ํ‰ ํ™•์žฅ๋ณด๋‹ค ์•ˆ์ •์„ฑ๊ณผ ์ผ๊ด€์„ฑ์ด ๋” ์ค‘์š”ํ•œ ๊ฒฝ์šฐ
  • NoSQL
    • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ
    • ์–ด๋–ค ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
    • ๋น ๋ฅธ ๊ฐœ๋ฐœ๊ณผ ์œ ์—ฐ์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ
    • ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
    • ์ฝ๊ธฐ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค (ex. SNS, ๋กœ๊ทธ, ์ถ”์ฒœ ์‹œ์Šคํ…œ)
    • ์ˆ˜ํ‰ ํ™•์žฅ(Scale-out)์ด ํ•„์ˆ˜์ ์ธ ๊ฒฝ์šฐ


์ •๋ฆฌํ•˜๋ฉด RDB๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๊ฐ•ํ•˜๊ณ , NoSQL์€ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๊ฐ•ํ•˜๋‹ค.

๊ฒฐ๊ตญ ์ค‘์š”ํ•œ๊ฑด ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ ์ƒํ™ฉ์ด๋‹ค.

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: