๐ RDB vs NoSQL
๋ฐ์ดํฐ๋ฒ ์ด์ค(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์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐ ๊ฐํ๋ค.
๊ฒฐ๊ตญ ์ค์ํ๊ฑด ๊ธฐ์ ์ด ์๋๋ผ ์ํฉ์ด๋ค.