14์ฃผ์ฐจ ์๋ฃ์ ๋ชจ๋ ํ ํฝ์ "๋ฐ์ดํฐ ํ์ โ HA/ํ์ฅ โ SQL ๊ณ ๊ธ" ํ๋ฆ์ผ๋ก ์ฌ๋ฐฐ์ดํ ํ์ต ๊ฒฝ๋ก.
13์ฃผ์ฐจ๊ฐ DB ์ด๋ก ๊ณผ ์ธ๋ฑ์ค ์๋ค๋ฉด, 14์ฃผ์ฐจ๋ DB ์ด์ ์ธก๋ฉด ์ผ๋ก ํ์ฅ.
- ๋ฐ์ดํฐ ํ์ ๊ณผ ์ธ์ฝ๋ฉ (CHAR/VARCHAR, BLOB/TEXT, Collation)
- ๊ณ ๊ฐ์ฉ์ฑ (HA) (Clustering, Replication, PXC, Backup)
- ๋ฐ์ดํฐ ๋ถํ (Sharding, Partitioning)
- SQL ๊ณ ๊ธ ๊ธฐ๋ฅ (Trigger, JOIN, VIEW, PROCEDURE)
[Phase 1] ๋ฐ์ดํฐ ํ์
๊ณผ ์ธ์ฝ๋ฉ (CHAR/VARCHAR, BLOB/TEXT, Collation)
โ
[Phase 2] DB Clustering โ ๊ณ ๊ฐ์ฉ์ฑ์ ์์
โ
[Phase 3] Replication๊ณผ ๋ฐฑ์
โ Master-Slave + PXC
โ
[Phase 4] ๋ฐ์ดํฐ ๋ถํ โ Sharding๊ณผ Partitioning
โ
[Phase 5] DELETE/TRUNCATE/DROP๊ณผ ROLLBACK ๋ฉ์ปค๋์ฆ
โ
[Phase 6] SQL ๊ณ ๊ธ ๊ธฐ๋ฅ โ Trigger, JOIN, VIEW, PROCEDURE
์ด 6 Phase ร 17 Unit โ ๋จ์ผ ์ฃผ์ฐจ๋ก ์ ์ ๋ถ๋.
| ์ฃผ์ฐจ | ์ฃผ์ | ํต์ฌ ๋ณํ |
|---|---|---|
| 1์ฃผ์ฐจ | OOPยทJVMยทGCยท์ปฌ๋ ์ ยทI/O ๊ฐ๋ก | ์๋ฐ ํฐ ๊ทธ๋ฆผ |
| 2์ฃผ์ฐจ | JVM ๋ด๋ถยท๋ฐ์ดํธ์ฝ๋ยทG1 GC | "์ด๋ป๊ฒ ๋์๊ฐ๋" |
| 3์ฃผ์ฐจ | ์ปฌ๋ ์ ยท์ ๋ค๋ฆญยทํจ์ํ | ์๋ฐ ํํ๋ ฅ |
| 4์ฃผ์ฐจ | ๋ฉํฐ์ค๋ ๋ฉยท๋์์ฑยทExecutor | ๋์์ฑ ์ ๋ณต |
| 5์ฃผ์ฐจ | Atomic + Spring IoC/DI ์ ๋ฌธ | ์๋ฐ โ Spring ๋ค๋ฆฌ |
| 6์ฃผ์ฐจ | ํ ์คํธ + ์น ์ธํ๋ผ + DB ์ ๊ทผ ์งํ | Spring ์ค์ ํ๊ฒฝ |
| 7์ฃผ์ฐจ | JPA/ORM ์ ๋ฌธ + ํธ๋์ญ์ ์ถ์ํ | DB ์ถ์ํ ์ ๋ฌธ |
| 8์ฃผ์ฐจ | ํ๋ก์์ ์งํ | AOP ๋ฉ์ปค๋์ฆ |
| 9์ฃผ์ฐจ | Spring AOP ์ค์ + ํธ๋์ญ์ ์ ํ | AOP ์ค์ ํ์ฉ |
| 10์ฃผ์ฐจ | ํธ๋์ญ์ ์ ๋ฆฌ + ๋น ๋ผ์ดํ์ฌ์ดํด + ๊ฒฉ๋ฆฌ ์์ค | ํธ๋์ญ์ ๋ง๋ฌด๋ฆฌ |
| 11์ฃผ์ฐจ | JPA์ ์ ์ฒด์ ์์์ฑ ์ปจํ ์คํธ | JPA ๋ฉ์ปค๋์ฆ ์์ ์ดํด |
| 12์ฃผ์ฐจ | ์ฐ๊ด๊ด๊ณ + N+1 ๋ฑ ์ฑ๋ฅ ์ต์ ํ | JPA ์ค์ ํ์ฉ |
| 13์ฃผ์ฐจ | DB ํ๋๋ฉํธ - ๋ชจ๋ธ๋ง๋ถํฐ ์ธ๋ฑ์ค๊น์ง | DB ๋ณธ์ฐ์ ์์ญ (์ด๋ก ) |
| 14์ฃผ์ฐจ (์ง๊ธ) | DB ์ด์ - ๋ฐ์ดํฐ ํ์ ยทHAยทํ์ฅยทSQL ๊ณ ๊ธ | DB ์ด์์ ์์ญ |
13์ฃผ์ฐจ์ 14์ฃผ์ฐจ์ ๊ด๊ณ:
| Day | Phase | ํ์ต ๋ชฉํ |
|---|---|---|
| 1์ผ์ฐจ | Phase 1 | ๋ฐ์ดํฐ ํ์ ๊ณผ Collation |
| 2์ผ์ฐจ | Phase 2 + 3 | Clustering + Replication + PXC |
| 3์ผ์ฐจ | Phase 4 | Sharding + Partitioning |
| 4์ผ์ฐจ | Phase 5 + 6 (์ ๋ฐ) | DELETE/TRUNCATE/DROP + Trigger + JOIN |
| 5์ผ์ฐจ | Phase 6 (ํ๋ฐ) + ์ข ํฉ | VIEW + PROCEDURE + ์๊ธฐ ์ ๊ฒ |
์ฌ์ ์ผ์ (7์ผ): Phase 2-3์ +1์ผ (HA๋ ๊ทธ๋ฆผ์ด ํ์ํจ). Phase 6์ ์ง์ ์ฟผ๋ฆฌ ๋๋ฆฌ๋ฉฐ ํ์ต ๊ถ์ฅ.
๋ชฉํ: SQL ์ปฌ๋ผ ์ค๊ณ์ ์ถ๋ฐ์ ์ธ ๋ฐ์ดํฐ ํ์ ์ ํ๊ณผ ๋ฌธ์์ด ๋น๊ต ๊ท์น์ ์ก๋๋ค.
์ ์ ์ง์: 6์ฃผ์ฐจ Phase 6 (DB ๊ธฐ์ด)
ํต์ฌ ๋น๊ต โญ :
| CHAR(n) | VARCHAR(n) | |
|---|---|---|
| ๊ธธ์ด | ๊ณ ์ ๊ธธ์ด | ๊ฐ๋ณ ๊ธธ์ด |
| ์งง์ ๋ฐ์ดํฐ ์ ์ฅ ์ | ๊ณต๋ฐฑ์ผ๋ก ์ฑ์ | ์ค์ ๊ธธ์ด๋ง |
| ์๋ | ๋น ๋ฆ (ํนํ ์งง์ ๋ฌธ์์ด) | ์ฝ๊ฐ ๋๋ฆผ (๊ธธ์ด ๊ณ์ฐ ํ์) |
| ๊ณต๊ฐ ํจ์จ | ๋ฎ์ | ๋์ |
์์:
-- CHAR(5)
INSERT INTO test VALUES ('Hi');
-- ์ ์ฅ: 'Hi ' (๊ณต๋ฐฑ 3๊ฐ ์ถ๊ฐ, ์ด 5๋ฐ์ดํธ)
-- VARCHAR(5)
INSERT INTO test VALUES ('Hi');
-- ์ ์ฅ: 'Hi' (์ค์ 2๋ฐ์ดํธ๋ง)
์ฌ์ฉ ๊ฐ์ด๋:
โ CHAR ์ ํฉ โ ๊ธธ์ด๊ฐ ์ผ์ ํ ๋ฐ์ดํฐ:
CHAR(2) ('US', 'KR')CHAR(1) ('M', 'F')CHAR(5)โ VARCHAR ์ ํฉ โ ๊ธธ์ด ๊ฐ๋ณ:
VARCHAR(50)VARCHAR(100)VARCHAR(255)ILIC ์ ์ฉ:
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 1.1
ํต์ฌ ๋น๊ต โญ :
| BLOB | TEXT | |
|---|---|---|
| ๋ฐ์ดํฐ ์ข ๋ฅ | ์ด์ง(Binary) | ๋ฌธ์(Text) |
| ์ฌ์ฉ ์ฌ๋ก | ์ด๋ฏธ์ง, ๋์์, ํ์ผ | ๊ธด ๊ธ, ๋๊ธ, ์ค๋ช |
| ๋์๋ฌธ์ | ๊ตฌ๋ถ(Case-Sensitive) | ๊ตฌ๋ถ ์ ํจ(๊ธฐ๋ณธ) |
| ๋น๊ต ๋ฐฉ์ | ๋ฐ์ดํธ ๋จ์ | Collation ๊ท์น |
| ์ธ์ฝ๋ฉ | ์์ (์๋ณธ ๊ทธ๋๋ก) | UTF-8/ASCII ๋ฑ |
| ๋ฌธ์์ด ํจ์ | ์ฌ์ฉ X | LIKE/CONCAT ๊ฐ๋ฅ |
์์:
BLOB:
CREATE TABLE files (
id INT,
image BLOB -- ์ด๋ฏธ์ง ๋ฐ์ด๋๋ฆฌ
);
TEXT:
CREATE TABLE posts (
id INT,
content TEXT -- ๊ฒ์๊ธ ๋ณธ๋ฌธ
);
MySQL์ BLOB/TEXT ๋ณํ:
์ค๋ฌด ๊ถ์ฅ:
ILIC ์ ์ฉ:
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 1.2
ํต์ฌ ๊ฐ๋
Collation (์ ๋ ฌ ๊ท์น):
"๋ฌธ์์ด์ ๋น๊ต/์ ๋ ฌ ํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ท์น"
MySQL Collation ๋ช ๋ช ๊ท์น:
utf8_general_ci โ UTF-8, ์ผ๋ฐ ๋น๊ต, case-insensitive (๋์๋ฌธ์ ๋ฌด์)utf8_bin โ UTF-8, ๋ฐ์ด๋๋ฆฌ ๋น๊ต (๋์๋ฌธ์ ๊ตฌ๋ถ)utf8mb4_unicode_ci โ UTF-8 4๋ฐ์ดํธ (์ด๋ชจ์ง ์ง์)TEXT์ ๊ธฐ๋ณธ ๋์:
utf8_general_ci ๋ฑ โ ๋์๋ฌธ์ ๋ฌด์์์:
SELECT * FROM users WHERE name = 'alice';
-- 'Alice', 'ALICE', 'alice' ๋ชจ๋ ๋งค์นญ (case-insensitive ๊ธฐ๋ณธ)
๋์๋ฌธ์ ๊ตฌ๋ถ์ด ํ์ํ ๋:
SELECT * FROM users WHERE name COLLATE utf8_bin = 'alice';
-- 'alice' ๋ง ์ ํํ ๋งค์นญ
๋๋ BINARY ํค์๋:
SELECT * FROM users WHERE BINARY name = 'alice';
์ปฌ๋ผ ๋จ์๋ก Collation ์ง์ :
CREATE TABLE users (
name VARCHAR(50) COLLATE utf8_bin -- ์ด ์ปฌ๋ผ์ ๋์๋ฌธ์ ๊ตฌ๋ถ
);
ILIC ํ์ฉ:
์๊ธฐ ์ ๊ฒ
๋ชฉํ: ๋จ์ผ ์๋ฒ ํ๊ณ๋ฅผ ๋๋ ์ฒซ ๋ฒ์งธ ๋๊ตฌ์ธ ํด๋ฌ์คํฐ๋ง์ ๋ณธ์ง์ ์ดํดํ๋ค.
์ ์ ์ง์: 13์ฃผ์ฐจ Phase 5 (Scale-Up vs Scale-Out)
ํต์ฌ ๋ฌธ์
๋จ์ผ ์๋ฒ์ ์ํ:
Clustering์ ํด๊ฒฐ:
"์ฌ๋ฌ ์๋ฒ๊ฐ ๋์ผํ ๋ ผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ์ฐ ์ด์"
ํต์ฌ ์๋ฏธ:
๊ตฌ์กฐ (DB ์๋ฒ 2๋ ์):
[Client]
โ
[Load Balancer]
/ \
[DB Server 1] [DB Server 2]
โ โ
[DB Storage] [DB Storage]
(physically separate)
์ด์ :
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 2.1
ํต์ฌ 2๊ฐ์ง ํจํด:
Active-Active (๋์ ์ด์):
์ฅ์ :
๋จ์ :
Active-Standby (๋๊ธฐ ๋ชจ๋):
์ฅ์ :
๋จ์ :
๋น๊ต ๋งคํธ๋ฆญ์ค:
| Active-Active | Active-Standby | |
|---|---|---|
| ์์ ์ฌ์ฉ | ๋ชจ๋ ํ์ฑ | ์ ๋ฐ๋ง ํ์ฑ |
| Failover ์๊ฐ | ๊ฑฐ์ 0 | ์ ์ด ~ ๋ถ |
| ๋น์ฉ | ๋์ | ๋ฎ์ |
| ๋ณต์ก๋ | ๋์ | ๋ฎ์ |
ILIC ์๋๋ฆฌ์ค:
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 2.2
ํต์ฌ ์๋ฆฌ
ํด๋ฌ์คํฐ ํฌํ (Quorum):
"๋ ธ๋ ์ผ๋ถ๊ฐ ๋ค์ด๋์์ ๋ ๋๋จธ์ง๊ฐ ๋ค์(majority)๋ฅผ ์ฐจ์งํ๋์ง ํ๋จ"
๊ณผ๋ฐ์ ๋ฃฐ โญ :
์ ํ์ํ๊ฐ:
์์ (3๋ ธ๋ ํด๋ฌ์คํฐ):
ํต์ฌ ํต์ฐฐ โญ :
"ํด๋ฌ์คํฐ๋ง์ ์ต์ 3๊ฐ ๋ ธ๋ ๊ถ์ฅ โ 1๊ฐ ๋ค์ด ์ 2๊ฐ๋ก ์ ์ ์ด์ ๊ฐ๋ฅ"
2๋ ธ๋์ ์ํ:
ํ์ ๋ ธ๋ ๊ถ์ฅ:
Quorum์ ์์ฉ:
ILIC ์ ์ฉ:
์๊ธฐ ์ ๊ฒ
๋ชฉํ: Master-Slave ๊ตฌ์กฐ์ ํด๋ฌ์คํฐ๋ง์ ์ฐจ์ด๋ฅผ ๋ช ํํ ์ก๊ณ , PXC์ ๋ฐฑ์ ์ ๋ต์ ๋ณธ๋ค.
์ ์ ์ง์: Phase 2, 13์ฃผ์ฐจ Phase 5
ํต์ฌ ๊ตฌ์กฐ
Replication:
"Master ์๋ฒ์ ๋ณ๊ฒฝ์ Slave ์๋ฒ๋ก ๋ณต์ "
๊ตฌ์กฐ:
[Master DB] โโ๋ณต์ โโ> [Slave DB 1]
โ โ
(Write) (Read only)
โ
[Slave DB 2]
์ญํ ๋ถ๋ฆฌ:
์ป๋ ์ด์ โญ :
์ฝ๊ธฐ ๋ถํ ๋ถ์ฐ
Master ๋ถํ โ
๋ฐฑ์ ยท๋ถ์ ๋ถํ ๊ฒฉ๋ฆฌ
๋ณต์ ๋ฐฉ์:
๋ณต์ ์ง์ฐ (Replication Lag):
Master/Slave ์ฑ๋ฅ ๊ณ ๋ ค:
ILIC ์๋๋ฆฌ์ค:
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Phase 2, Unit 3.1
ํต์ฌ ์ฐจ์ด โญ :
| Replication | Clustering | |
|---|---|---|
| ๊ตฌ์กฐ | Master โ Slave (๋จ๋ฐฉํฅ) | ๋ชจ๋ ๋ ธ๋ ๋๋ฑ |
| Write | Master๋ง | ๋ชจ๋ ๋ ธ๋ ๊ฐ๋ฅ |
| Read | Slave ๋ถ์ฐ | ๋ชจ๋ ๋ ธ๋ |
| ์ผ๊ด์ฑ | ๋น๋๊ธฐ (์ง์ฐ ๊ฐ๋ฅ) | ๋๊ธฐ ๋๋ ์ฆ์ |
| Failover | ์๋/๋ฐ์๋ | ์๋ |
| ์ฃผ ๋ชฉ์ | ์ฝ๊ธฐ ์ฑ๋ฅ + ๋ฐฑ์ | ๊ณ ๊ฐ์ฉ์ฑ + ์ฆ์ Failover |
์๊ฐ์ ๋น๊ต:
Replication:
[Master] โwirteโ> Master ์์
โ
โ ๋น๋๊ธฐ ๋ณต์
โ
[Slave 1] โread ๋งโ
[Slave 2] โread ๋งโ
Clustering (Active-Active):
[Node 1] โ [Node 2] โ [Node 3]
โ โ โ
๋ชจ๋ read/write ๊ฐ๋ฅ (๋๊ธฐ ๋๊ธฐํ)
์ ํ ๊ธฐ์ค:
Replication ์ ํฉ:
Clustering ์ ํฉ:
๋ ๋ค ์ฌ์ฉ ๊ฐ๋ฅ (์ค๋ฌด ํ์ค):
ILIC ์๋๋ฆฌ์ค:
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 3.2
Percona XtraDB Cluster (PXC) โญ :
"MySQL ํธํ Active-Active ํด๋ฌ์คํฐ๋ง ์๋ฃจ์ "
์ PXC๋ฅผ ์ ํํ๋๊ฐ:
Replication์ ํ๊ณ:
1. Slave๊ฐ Read๋ง ๋ด๋น โ ์ฑ๋ฅ ์ข์ Master ์์กด
2. Master ์ฅ์ ์ Slave ์๋ ์น๊ฒฉ X
3. Slave ์ฑ๋ฅ์ ๋ฎ๊ฒ ์ก์ผ๋ฉด Master ๋์ฒด ์ด๋ ค์
PXC์ ํด๊ฒฐ:
Galera Cluster ๊ธฐ๋ฐ:
ILIC ์ ์ฉ ๊ฐ๋ฅ์ฑ:
XtraBackup vs mysqldump (๋ฐฑ์ ๋๊ตฌ):
| XtraBackup | mysqldump | |
|---|---|---|
| ๋ฐฉ์ | Hot Backup (์๋น์ค ์ค) | Logical (SQL ์ถ์ถ) |
| ์๋ | ๋งค์ฐ ๋น ๋ฆ | ๋๋ฆผ |
| ๊ฒฐ๊ณผ๋ฌผ | ๋ฐ์ด๋๋ฆฌ ํ์ผ | SQL ํ ์คํธ |
| ๋ณต๊ตฌ | ๋น ๋ฆ | ๋๋ฆผ (์ฌ์คํ) |
| ์ด์ ์ํฅ | ์ต์ | ๋ฝ ๋ฐ์ ๊ฐ๋ฅ |
| ๋๊ตฌ | Percona ๋๊ตฌ | MySQL ๊ธฐ๋ณธ |
| ์ ํฉ | ๋์ฉ๋ ์ด์ DB | ์์ DB, ๋ง์ด๊ทธ๋ ์ด์ |
XtraBackup ๊ถ์ฅ:
mysqldump ๊ถ์ฅ:
ILIC ์๋๋ฆฌ์ค:
์๊ธฐ ์ ๊ฒ
๋ชฉํ: ํ ํ ์ด๋ธ/ํ DB๊ฐ ๋๋ฌด ์ปค์ก์ ๋์ ๋ ๊ฐ์ง ๋ถํ ์ ๋ต์ ๋น๊ตํ๋ค.
์ ์ ์ง์: 13์ฃผ์ฐจ Phase 5 (NoSQL์ Sharding)
ํต์ฌ ๊ฐ๋
Sharding:
"์ฌ๋ฌ DB ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถํ โ ๊ฐ ์๋ฒ๊ฐ ์ผ๋ถ ๋ฐ์ดํฐ๋ง ๊ฐ์ง"
๊ตฌ์กฐ:
[Shard 1: user_id 1~1000๋ง]
[Shard 2: user_id 1000๋ง~2000๋ง]
[Shard 3: user_id 2000๋ง~3000๋ง]
์ค๋ ํค (Shard Key):
์ค๋ฉ ์ ๋ต:
Range-based (๋ฒ์):
Hash-based (ํด์):
Geographic (์ง๋ฆฌ):
Sharding์ ์ด๋ ค์ โญ :
JOIN ์ด๋ ค์:
ํธ๋์ญ์ ๋ถ์ฐ:
์ฌ์ค๋ฉ ๋น์ฉ:
์ค๋ ํค ์ ํ์ ์ด๋ ค์:
NoSQL๊ณผ์ ์์ฐ์ค๋ฌ์ด ๊ถํฉ:
ILIC ์ ์ฉ ์ ๊ฒํ :
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 4.1
ํต์ฌ ์ฐจ์ด โญ :
| Partitioning | Sharding | |
|---|---|---|
| ๋ถํ ๋จ์ | ๋จ์ผ DB ๋ด ํ ์ด๋ธ | ์ฌ๋ฌ DB ์๋ฒ |
| ์์น | ํ DBMS | ๋ถ์ฐ ์์คํ |
| ๊ด๋ฆฌ | DBMS ์๋ | ์ ํ๋ฆฌ์ผ์ด์ |
| ํธ๋์ญ์ | ์ ์ | ๋ถ์ฐ ์ด๋ ค์ |
| ๋ณต์ก๋ | ๋ฎ์ | ๋์ |
Partitioning์ ๋ณธ์ง:
"ํ ํ ์ด๋ธ์ ์ฌ๋ฌ ๋ฌผ๋ฆฌ์ ์กฐ๊ฐ์ผ๋ก ๋ถํ โ DBMS๊ฐ ์๋ ๋ผ์ฐํ "
Partition ์ข ๋ฅ:
1. Range Partitioning (๋ฒ์):
CREATE TABLE sales (
sale_date DATE,
amount DECIMAL
)
PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p2025 VALUES LESS THAN (2026)
);
2. List Partitioning (๋ชฉ๋ก):
PARTITION BY LIST (region) (
PARTITION p_kr VALUES IN ('SEOUL', 'BUSAN'),
PARTITION p_us VALUES IN ('NY', 'LA')
);
3. Hash Partitioning (ํด์):
PARTITION BY HASH (user_id) PARTITIONS 4;
-- 4๊ฐ ํํฐ์
์ผ๋ก ๊ท ๋ฑ ๋ถ์ฐ
4. Key Partitioning:
Partitioning์ ํจ๊ณผ:
์ฟผ๋ฆฌ ์ฑ๋ฅ โ:
WHERE sale_date = '2024-...' โ p2024 ํํฐ์
๋ง ์กฐํ๊ด๋ฆฌ ์ฉ์ด:
์ธ๋ฑ์ค ๋ถ๋ด โ:
ILIC ์ ์ฉ ๊ฐ๋ฅ:
Partitioning ์ฐ์ , Sharding์ ๋ง์ง๋ง:
์๊ธฐ ์ ๊ฒ
๋ชฉํ: ์์ฃผ ํท๊ฐ๋ฆฌ๋ ๋ฐ์ดํฐ ์ญ์ ๋ช ๋ น์ ์ฐจ์ด์ ROLLBACK ๊ฐ๋ฅ ์ฌ๋ถ์ ๋ณธ์ง์ ์ดํดํ๋ค.
์ ์ ์ง์: 6์ฃผ์ฐจ Phase 6, 10์ฃผ์ฐจ Phase 5
ํต์ฌ ๋น๊ต โญ :
| DELETE | TRUNCATE | DROP | |
|---|---|---|---|
| ๋ถ๋ฅ | DML | DDL | DDL |
| ๋์ | ํน์ ํ | ๋ชจ๋ ํ | ํ ์ด๋ธ ์์ฒด |
| WHERE ์ | ๊ฐ๋ฅ | ๋ถ๊ฐ | ๋ถ๊ฐ |
| ์๋ | ๋๋ฆผ | ๋น ๋ฆ | ์ฆ์ |
| ROLLBACK | ๊ฐ๋ฅ โ | ๋ถ๊ฐ โ | ๋ถ๊ฐ โ |
| AUTO_INCREMENT | ์ ์ง | ์ด๊ธฐํ | (ํ ์ด๋ธ ์ฌ๋ผ์ง) |
| ์ธ๋ฑ์ค/์ ์ฝ์กฐ๊ฑด | ์ ์ง | ์ ์ง | ์ญ์ |
| ํธ๋ฆฌ๊ฑฐ ๋ฐ๋ | โ | โ | โ |
DELETE โ ์์ ํ ์ญ์ :
DELETE FROM users WHERE id = 5;
DELETE FROM users WHERE created_at < '2020-01-01';
-- ROLLBACK ๊ฐ๋ฅ
START TRANSACTION;
DELETE FROM users WHERE id = 5;
ROLLBACK; -- ๋ณต๊ตฌ๋จ
์ ๋๋ฆฐ๊ฐ:
TRUNCATE โ ๋น ๋ฅธ ์ ์ฒด ์ญ์ :
TRUNCATE TABLE users;
-- ๋ชจ๋ ํ ์ญ์ (๊ตฌ์กฐ๋ ์ ์ง)
์ ๋น ๋ฅธ๊ฐ:
์ฃผ์:
DROP โ ์์ ์ ๊ฑฐ:
DROP TABLE users;
-- ํ
์ด๋ธ + ๋ฐ์ดํฐ + ์ธ๋ฑ์ค + ์ ์ฝ์กฐ๊ฑด + ํธ๋ฆฌ๊ฑฐ ๋ชจ๋ ์ญ์
๋ณต๊ตฌ ๋ถ๊ฐ:
์ธ์ ๋ฌด์์?:
| ์ํฉ | ๋ช ๋ น |
|---|---|
| ์ผ๋ถ ๋ฐ์ดํฐ ์ญ์ | DELETE |
| ๋ชจ๋ ๋ฐ์ดํฐ ์ญ์ (ํ ์ด๋ธ ์ ์ง) | TRUNCATE |
| ํ ์ด๋ธ ์์ฒด ์ ๊ฑฐ | DROP |
| ํธ๋์ญ์ ์ผ๋ก ์์ ํ๊ฒ | DELETE |
ILIC ์๋๋ฆฌ์ค:
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 5.1, 6์ฃผ์ฐจ Phase 6 (ACID)
ํต์ฌ ๋ฉ์ปค๋์ฆ
ROLLBACK์ด ๊ฐ๋ฅํ ์ด์ :
"UNDO LOG ๋๋ถ"
UNDO LOG:
์์ ํ๋ฆ:
1. UPDATE users SET age = 30 WHERE id = 1;
(age๋ ์๋ 25์์)
2. UNDO LOG ๊ธฐ๋ก: "id=1์ age๋ฅผ 25๋ก ๋๋๋ฆด ๊ฒ"
3. ROLLBACK ํธ์ถ
โ UNDO LOG ์ ์ฉ
โ age = 25 ๋ณต๊ตฌ
InnoDB์ ๋ ๋ก๊ทธ โญ :
| UNDO LOG | REDO LOG | |
|---|---|---|
| ๋ชฉ์ | ROLLBACK ์ง์ | ๋ณต๊ตฌ (Crash Recovery) |
| ์์ | ํธ๋์ญ์ ์ค | ๋ณ๊ฒฝ ์ฆ์ |
| ๋ด์ฉ | ์ด์ ์ํ (Before) | ๋ณ๊ฒฝ ํ (After) |
| ์ฉ๋ | ๋กค๋ฐฑยทMVCC | Durability ๋ณด์ฅ |
MVCC (Multi-Version Concurrency Control):
TRUNCATE๋ ์ ROLLBACK ์ ๋๋:
DELETE์ ๋น์ฉ:
ILIC ์ ์ฉ:
์๊ธฐ ์ ๊ฒ
๋ชฉํ: TriggerยทJOINยทVIEWยทPROCEDURE ๋ฑ SQL์ ๋๊ตฌํจ์ ์ ๋ฆฌํ๋ค.
์ ์ ์ง์: Phase 5
ํต์ฌ ๊ฐ๋
Trigger:
"INSERT/UPDATE/DELETE ์ ์๋์ผ๋ก ์คํ๋๋ ์ฝ๋"
์์ โ ํ์ ์ญ์ ์ ์ด๋ ฅ ๋ณด๊ด:
CREATE TRIGGER trg_student_delete
AFTER DELETE ON students
FOR EACH ROW
BEGIN
INSERT INTO deleted_students (id, name, deleted_at)
VALUES (OLD.id, OLD.name, NOW());
END;
์๋:
DELETE FROM students WHERE id = 5;
-- โ ์๋์ผ๋ก deleted_students์ INSERT
ํธ๋ฆฌ๊ฑฐ ์ข ๋ฅ:
์์ :
BEFORE โ ์์
์ ์คํAFTER โ ์์
ํ ์คํ์ด๋ฒคํธ:
INSERT / UPDATE / DELETE๋ฒ์:
FOR EACH ROW โ ํ๋ง๋คFOR EACH STATEMENT โ ๋ช
๋ น๋ง๋ค (MySQL ๋ฏธ์ง์)ํ์ฉ ์ฌ๋ก โญ :
ILIC ํ์ฉ ๊ฐ๋ฅ์ฑ:
Trigger์ ๋จ์ โ ๏ธ :
์ค๋ฌด ๊ถ์ฅ:
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: 6์ฃผ์ฐจ Phase 6 (JOIN)
ํต์ฌ ๊ฐ๋
JOIN์ ๋ณธ์ง:
"๋ ๊ฐ ์ด์ ํ ์ด๋ธ์ ๊ฒฐํฉํ์ฌ ๋ฐ์ดํฐ ์กฐํ"
INNER JOIN โ ๋งค์นญ๋ง ํฌํจ:
SELECT u.name, o.product
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
โ users์ orders ์์ชฝ ๋ชจ๋์ ๋งค์นญ๋๋ ํ๋ง ๋ฐํ
โ ๋งค์นญ ์ ๋๋ user๋ ๊ฒฐ๊ณผ์์ ๋น ์ง
OUTER JOIN โ ๋ชจ๋ ํ ํฌํจ:
LEFT OUTER JOIN (์ผ์ชฝ ๊ธฐ์ค):
SELECT u.name, o.product
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
โ users ๋ชจ๋ ํ ํฌํจ
โ orders ์๋ user๋ NULL๋ก ์ฑ์์ง
RIGHT OUTER JOIN (์ค๋ฅธ์ชฝ ๊ธฐ์ค):
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
โ orders ๋ชจ๋ ํ ํฌํจ
FULL OUTER JOIN (์์ชฝ ๋ชจ๋):
-- MySQL์ ๊ธฐ๋ณธ ๋ฏธ์ง์, UNION์ผ๋ก ์๋ฎฌ๋ ์ด์
SELECT * FROM A LEFT JOIN B ON ...
UNION
SELECT * FROM A RIGHT JOIN B ON ...;
โ ์์ชฝ ๋ชจ๋ ํ, ๋งค์นญ ์ ๋๋ฉด NULL
์๊ฐ์ ๋น๊ต:
[INNER]
A โฉ B (๊ต์งํฉ๋ง)
[LEFT OUTER]
A ์ ์ฒด + (B์์ ๋งค์นญ๋๋ ๋ถ๋ถ)
[RIGHT OUTER]
B ์ ์ฒด + (A์์ ๋งค์นญ๋๋ ๋ถ๋ถ)
[FULL OUTER]
A โช B (ํฉ์งํฉ)
์ธ์ ๋ฌด์์?:
| ์ํฉ | JOIN ์ข ๋ฅ |
|---|---|
| ์์ชฝ ๋ชจ๋ ์๋ ํ๋ง | INNER |
| ์ผ์ชฝ ๋ชจ๋ + ๋งค์นญ | LEFT |
| ํ ์ชฝ์ด ์์ด๋ ๋ชจ๋ | OUTER |
| ๋งค์นญ ์ ๋๋ ํ ์ฐพ๊ธฐ | LEFT + WHERE B IS NULL |
ILIC ์๋๋ฆฌ์ค:
JPA์์์ JOIN:
LEFT JOIN์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 6.2
ํต์ฌ ๊ฐ๋
VIEW:
"์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์๋ ๊ฐ์ ํ ์ด๋ธ โ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์"
์์:
CREATE VIEW user_orders AS
SELECT users.id, users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;
์ฌ์ฉ:
SELECT * FROM user_orders; -- ํ
์ด๋ธ์ฒ๋ผ!
VIEW์ ํ์ฉ:
๋ณต์กํ ์ฟผ๋ฆฌ ๋จ์ํ:
-- ๋ณต์กํ JOIN์ ํ ๋ฒ ์ ์ ํ ์ฌ์ฌ์ฉ
SELECT * FROM monthly_sales_summary;
๋ณด์:
CREATE VIEW public_users AS
SELECT id, name FROM users; -- email, password ์ ์ธ
๊ถํ ๋ถ๋ฆฌ:
๋ ๊ฑฐ์ ํธํ:
VIEW์ ํ๊ณ โ ๏ธ :
Materialized View (์ฐธ๊ณ ):
ILIC ์ ์ฉ:
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 6.3
ํต์ฌ ๊ฐ๋
PROCEDURE (Stored Procedure):
"๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉํ์ฌ ์ ์ํ ์์ ์ DB์ ์ ์ฅ + ํธ์ถ"
์์:
CREATE PROCEDURE add_user(
IN p_name VARCHAR(50),
IN p_email VARCHAR(100)
)
BEGIN
INSERT INTO users (name, email)
VALUES (p_name, p_email);
END;
-- ํธ์ถ
CALL add_user('Alice', 'alice@example.com');
VIEW vs PROCEDURE โญ :
| VIEW | PROCEDURE | |
|---|---|---|
| ์ฉ๋ | ์ ์ ์กฐํ | ๋์ ์ฒ๋ฆฌ |
| ๋ฐํ | ํ ์ด๋ธ ํํ | ๊ฒฐ๊ณผ ๋๋ ์ํฅ๋ง |
| ๋งค๊ฐ๋ณ์ | X | โ |
| INSERT/UPDATE | ์ ํ์ | ์์ ๋กญ๊ฒ |
| ํธ์ถ | SELECT FROM view | CALL procedure |
ํ๋ก์์ ์ ํ์ฉ:
ํ๋์ ๊ด์ ์์์ ํ๊ฐ โ ๏ธ :
๊ณผ๊ฑฐ (1990~2000๋ ๋):
ํ์ฌ:
ํ๋ก์์ ์ ๋จ์ :
1. ํ
์คํธ ์ด๋ ค์ โ DB์ ์์กด
2. ๋ฒ์ ๊ด๋ฆฌ ์ด๋ ค์ โ Git ๋ฑ์ผ๋ก ๊ด๋ฆฌ X
3. ํฌํ
์ด๋ ค์ โ DBMS๋ง๋ค ๋ฌธ๋ฒ ๋ค๋ฆ
4. ๋๋ฒ๊น
์ด๋ ค์
5. CI/CD ์ด๋ ค์
์ค๋ฌด ๊ถ์ฅ:
"๋น์ฆ๋์ค ๋ก์ง์ ์ ํ๋ฆฌ์ผ์ด์ ์, DB๋ ๋ฐ์ดํฐ ์ ์ฅ์ ์ง์ค"
๋ค๋ง ๋ค์์ ํ๋ก์์ ์ ํฉ:
Trigger vs VIEW vs PROCEDURE ์ ๋ฆฌ โญ :
| Trigger | VIEW | PROCEDURE | |
|---|---|---|---|
| ํธ์ถ | ์๋ (์ด๋ฒคํธ) | SELECT | CALL (์๋) |
| ๋งค๊ฐ๋ณ์ | OLD/NEW | X | โ |
| ์ฉ๋ | ์๋ ๋ถ์ ์์ | ๊ฐ์ ํ ์ด๋ธ | ๋ช ์์ ์์ ๋จ์ |
ILIC ๊ถ์ฅ:
์๊ธฐ ์ ๊ฒ
โ โ โ ๋ฉด์ ยท์ค๋ฌด ๋จ๊ณจ (๋ฐ๋์):
โ โ ๋งค์ฐ ๊ถ์ฅ:
[ ] Phase 1 โ ๋ฐ์ดํฐ ํ์
๊ณผ ์ธ์ฝ๋ฉ (Unit 1.1~1.3)
[ ] Phase 2 โ DB Clustering (Unit 2.1~2.3)
[ ] Phase 3 โ Replication๊ณผ ๋ฐฑ์
(Unit 3.1~3.3)
[ ] Phase 4 โ Sharding๊ณผ Partitioning (Unit 4.1~4.2)
[ ] Phase 5 โ DELETE/TRUNCATE/DROP๊ณผ ROLLBACK (Unit 5.1~5.2)
[ ] Phase 6 โ SQL ๊ณ ๊ธ ๊ธฐ๋ฅ (Unit 6.1~6.4)
[ ] ์ข
ํฉ ์๊ธฐ ์ ๊ฒ 28๋ฌธํญ ํต๊ณผ
13์ฃผ์ฐจ (์ด๋ก ):
14์ฃผ์ฐจ (์ด์):
โ ์ด์ DB ๋ฉด์ ์์ ๋ง์ฃผ์น ๋๋ถ๋ถ์ ์ง๋ฌธ์ ๋ตํ ์ ์๋ค.
์ด๋ฒ ์ฃผ์ฐจ๋ ์ด์ ์ค๋ฌด ์์ฑ๊ฐ ๊ฐํฉ๋๋ค. ์ง์ ์์ ๋๋ฝํ์ผ ์ฒดํ๋ฉ๋๋ค:
Phase 2-3 (Clustering/Replication):
Phase 4 (Partitioning):
Phase 5 (DELETE/TRUNCATE/DROP):
Phase 6 (Trigger/VIEW/PROCEDURE):
ํนํ ILIC์ ์ฐ๊ฒฐํด์ ์๊ฐํ์ธ์: