๐ŸŽฏ F-lab Java 13์ฃผ์ฐจ ํ•™์Šต ์ปค๋ฆฌํ˜๋Ÿผ

Psjยท6์ผ ์ „

F-lab

๋ชฉ๋ก ๋ณด๊ธฐ
15/42

๐ŸŽฏ F-lab Java 13์ฃผ์ฐจ ํ•™์Šต ์ปค๋ฆฌํ˜๋Ÿผ

13์ฃผ์ฐจ ์ž๋ฃŒ์˜ ๋ชจ๋“  ํ† ํ”ฝ์„ "DB ์ด๋ก  โ†’ SQL ์„ฑ๋Šฅ"์˜ ๋‘ ์ถ•์œผ๋กœ ์žฌ๋ฐฐ์—ดํ•œ ํ•™์Šต ๊ฒฝ๋กœ.
12์ฃผ์ฐจ๊นŒ์ง€ Java/Spring/JPA๋ฅผ ๋‹ค๋ค˜๋‹ค๋ฉด, 13์ฃผ์ฐจ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŽ€๋”๋ฉ˜ํ„ธ๋กœ ๋ฐฉํ–ฅ ์ „ํ™˜.

1) Part A โ€” DB ์ด๋ก ๊ณผ ๊ด€๋ฆฌ (๋ชจ๋ธ๋ง, ์ •๊ทœํ™”, NoSQL, ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ด๋ก , ๋ฝ)
2) Part B โ€” SQL ์„ฑ๋Šฅ ์ตœ์ ํ™” (์˜ตํ‹ฐ๋งˆ์ด์ €, ์ธ๋ฑ์Šค, B-tree, EXPLAIN)

JPA๊ฐ€ ์ถ”์ƒํ™”ํ•ด์„œ ๊ฐ€๋ ค๋†“์•˜๋˜ DB ๋ณธ์—ฐ์˜ ์˜์—ญ์„ ์ •๋ฉด์œผ๋กœ ๋ณด๋Š” ์ฃผ์ฐจ๋‹ค.


๐Ÿ“Š ํ•™์Šต ๊ฒฝ๋กœ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

[Part A โ€” DB ์ด๋ก ๊ณผ ๊ด€๋ฆฌ]
  [Phase 1] DB ํ•ต์‹ฌ ์šฉ์–ด์™€ ๋ชจ๋ธ๋ง (์—”ํ‹ฐํ‹ฐ/๋ฆด๋ ˆ์ด์…˜/์Šคํ‚ค๋งˆ)
     โ†“
  [Phase 2] ์ •๊ทœํ™” (1NF โ†’ 2NF โ†’ 3NF โ†’ BCNF)
     โ†“
  [Phase 3] ์ด์ƒ ํ˜„์ƒ๊ณผ ์ •๊ทœํ™” ํ‰๊ฐ€
     โ†“
  [Phase 4] SQL Injection ๋ณด์•ˆ
     โ†“
  [Phase 5] RDBMS์™€ NoSQL (Scale-Up vs Scale-Out)
     โ†“
  [Phase 6] ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ด๋ก  + ๋ฝ (BASE/CAP/PACELC + S/X Lock)

[Part B โ€” SQL ์„ฑ๋Šฅ ์ตœ์ ํ™”]
  [Phase 7] ์˜ตํ‹ฐ๋งˆ์ด์ € (RBO/CBO + ๋™์ž‘ 6๋‹จ๊ณ„)
     โ†“
  [Phase 8] ์ธ๋ฑ์Šค ๊ธฐ์ดˆ (๋น…์˜ค, B-tree) โ—„ ์ •์  1
     โ†“
  [Phase 9] ๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค์™€ EXPLAIN
     โ†“
  [Phase 10] ์ธ๋ฑ์Šค ์ตœ์ ํ™” ์ „๋žต (Covering Index, Full Scan ์„ ํƒ)

์ด 10 Phase ร— 31 Unit โ€” ๋‹จ์ผ ์ฃผ์ฐจ๋กœ๋Š” ํฐ ๋ถ„๋Ÿ‰ (Part A/B ๊ตฌ์กฐ).

๐Ÿ”— 1~13์ฃผ์ฐจ ํ๋ฆ„ ์ •๋ฆฌ

์ฃผ์ฐจ์ฃผ์ œํ•ต์‹ฌ ๋ณ€ํ™”
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 ๋ณธ์—ฐ์˜ ์˜์—ญ์œผ๋กœ

๐Ÿ—“๏ธ ๊ถŒ์žฅ ํ•™์Šต ์ผ์ • (์••์ถ• 7์ผ)

DayPhaseํ•™์Šต ๋ชฉํ‘œ
Part A
1์ผ์ฐจPhase 1 + 2DB ์šฉ์–ด + ์ •๊ทœํ™” (1NF~BCNF)
2์ผ์ฐจPhase 3 + 4์ด์ƒ ํ˜„์ƒ + SQL Injection
3์ผ์ฐจPhase 5RDBMS์™€ NoSQL (Scale, Redis)
4์ผ์ฐจPhase 6BASE/CAP/PACELC + ๊ณต์œ ๋ฝ/๋ฒ ํƒ€๋ฝ
Part B
5์ผ์ฐจPhase 7 + 8์˜ตํ‹ฐ๋งˆ์ด์ € + ์ธ๋ฑ์Šค ๊ธฐ์ดˆ (B-tree) โ˜…
6์ผ์ฐจPhase 9๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค + EXPLAIN
7์ผ์ฐจPhase 10 + ์ข…ํ•ฉCovering Index + ์ธ๋ฑ์Šค ์ตœ์ ํ™” + ์ž๊ธฐ ์ ๊ฒ€

์—ฌ์œ  ์ผ์ • (10์ผ): Phase 8๊ณผ Phase 9์— ๊ฐ +1์ผ. ์ธ๋ฑ์Šค๋Š” ์ง์ ‘ SQL์„ ๋Œ๋ฆฌ๋ฉฐ EXPLAIN์œผ๋กœ ํ™•์ธํ•ด์•ผ ์ฒดํ™”๋จ.


๐ŸŒฑ Part A โ€” DB ์ด๋ก ๊ณผ ๊ด€๋ฆฌ

๐Ÿ“š Phase 1 โ€” DB ํ•ต์‹ฌ ์šฉ์–ด์™€ ๋ชจ๋ธ๋ง

๋ชฉํ‘œ: JPA๊ฐ€ ๊ฐ€๋ ค๋†“์•˜๋˜ DB์˜ ๊ธฐ๋ณธ ์–ดํœ˜๋ฅผ ์ •ํ™•ํžˆ ์žก๋Š”๋‹ค.

Unit 1.1 โ€” ์—”ํ‹ฐํ‹ฐ vs ๋ฆด๋ ˆ์ด์…˜

์„ ์ˆ˜ ์ง€์‹: 6์ฃผ์ฐจ Phase 6 (DB ๊ธฐ์ดˆ), 11์ฃผ์ฐจ Phase 3

ํ•ต์‹ฌ ๊ฐœ๋…

์—”ํ‹ฐํ‹ฐ(Entity):

  • ๊ฐœ๋…์  ํ‘œํ˜„
  • ์†์„ฑ๋“ค์˜ ์ง‘ํ•ฉ โ€” ์„ค๊ณ„ ๋‹จ๊ณ„์˜ ์ถ”์ƒ
  • ์˜ˆ: ํ•™์ƒ = (ํ•™๋ฒˆ, ์ด๋ฆ„, ํ•™๋…„, ์ „๊ณต) ์˜ ์ง‘ํ•ฉ

๋ฆด๋ ˆ์ด์…˜(Relation):

  • ๋ฌผ๋ฆฌ์  ํ‘œํ˜„
  • ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ํ…Œ์ด๋ธ”
  • ์˜ˆ: students ํ…Œ์ด๋ธ”์˜ ํ–‰๊ณผ ์—ด

๋น„์œ :

"์—”ํ‹ฐํ‹ฐ๋Š” ํด๋ž˜์Šค, ๋ฆด๋ ˆ์ด์…˜์€ ์ธ์Šคํ„ด์Šค์˜ ๋ชจ์ž„(ํ…Œ์ด๋ธ”)"

ILIC ์‚ฌ๋ก€:

  • ์—”ํ‹ฐํ‹ฐ: Booking ๊ฐ์ฒด (๊ฐœ๋…)
  • ๋ฆด๋ ˆ์ด์…˜: bookings ํ…Œ์ด๋ธ” (๋ฌผ๋ฆฌ)
  • โ†’ 11์ฃผ์ฐจ Phase 3์—์„œ @Entity ๊ฐ€ ์ด ๋‘ ๊ฐœ๋…์„ ์ž‡๋Š” ๋‹ค๋ฆฌ

์ž๊ธฐ ์ ๊ฒ€

  • 7์ฃผ์ฐจ์˜ @Entity ์–ด๋…ธํ…Œ์ด์…˜์ด ๋งคํ•‘ํ•˜๋Š” ๋‘ ์„ธ๊ณ„๋Š”?
  • ์—”ํ‹ฐํ‹ฐ์™€ ๋ฆด๋ ˆ์ด์…˜์ด 1:1 ๋งคํ•‘์ด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ๋Š”? (ํžŒํŠธ: ์Šˆํผํƒ€์ž…/์„œ๋ธŒํƒ€์ž…)

Unit 1.2 โ€” ์–ดํŠธ๋ฆฌ๋ทฐํŠธยท์ฐจ์ˆ˜ยทํŠœํ”Œยท์นด๋””๋„๋ฆฌํ‹ฐยท๋„๋ฉ”์ธ

์„ ์ˆ˜ ์ง€์‹: Unit 1.1

ํ•ต์‹ฌ 5๊ฐ€์ง€ ์šฉ์–ด โญ :

์šฉ์–ด์˜๋ฏธ์˜ˆ์‹œ (๊ณ ๊ฐ ํ…Œ์ด๋ธ”)
์–ดํŠธ๋ฆฌ๋ทฐํŠธ(Attribute)์†์„ฑ = ์—ด(Column)์ด๋ฆ„, ์ „ํ™”๋ฒˆํ˜ธ, ์ฃผ์†Œ
์ฐจ์ˆ˜(Degree)์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐœ์ˆ˜4
ํŠœํ”Œ(Tuple) = ๋ ˆ์ฝ”๋“œํ–‰(Row) ํ•˜๋‚˜๊น€์ฒ ์ˆ˜, 010-..., ์„œ์šธ
์นด๋””๋„๋ฆฌํ‹ฐ(Cardinality)ํŠœํ”Œ์˜ ๊ฐœ์ˆ˜1000
๋„๋ฉ”์ธ(Domain)์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ์ง‘ํ•ฉ์•ˆ๊ฒฝ ์ฐฉ์šฉ = {์œ , ๋ฌด}

ํ•ต์‹ฌ ์ฐจ์ด:

  • ์ฐจ์ˆ˜ vs ์นด๋””๋„๋ฆฌํ‹ฐ:
    • ์ฐจ์ˆ˜ = ์—ด ์ˆ˜ (๋ณ€ํ•˜์ง€ ์•Š์Œ)
    • ์นด๋””๋„๋ฆฌํ‹ฐ = ํ–‰ ์ˆ˜ (๋ณ€ํ•จ, ๋นˆ ํ…Œ์ด๋ธ”๋„ ๊ฐ€๋Šฅ)

๋„๋ฉ”์ธ ์˜ˆ์‹œ:

CREATE TABLE customer (
    glasses VARCHAR(2) CHECK (glasses IN ('์œ ', '๋ฌด'))  -- ๋„๋ฉ”์ธ = {์œ , ๋ฌด}
);

โ†’ JPA๋กœ ํ‘œํ˜„ํ•˜๋ฉด enum ๋˜๋Š” @Check ์–ด๋…ธํ…Œ์ด์…˜

์ž๊ธฐ ์ ๊ฒ€

  • ์ฐจ์ˆ˜์˜ ์ตœ์†Œ๊ฐ’์€? (ํžŒํŠธ: 1)
  • ์นด๋””๋„๋ฆฌํ‹ฐ์˜ ์ตœ์†Œ๊ฐ’์€? (ํžŒํŠธ: 0)
  • ILIC์˜ bookings ํ…Œ์ด๋ธ”์˜ ์ฐจ์ˆ˜์™€ ์นด๋””๋„๋ฆฌํ‹ฐ๋Š”?

Unit 1.3 โ€” ์Šคํ‚ค๋งˆ 3๊ณ„์ธต (๊ฐœ๋…์ /๋…ผ๋ฆฌ์ /๋ฌผ๋ฆฌ์ )

์„ ์ˆ˜ ์ง€์‹: Unit 1.2

ํ•ต์‹ฌ ๊ฐœ๋…

์Šคํ‚ค๋งˆ:

"๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ •์˜"

3๊ณ„์ธต ๊ตฌ์กฐ โญ :

๊ณ„์ธต์ •์˜ํ‘œํ˜„ ๋ฐฉ์‹
๊ฐœ๋…์  ์Šคํ‚ค๋งˆ๋ชจ๋“  ์‚ฌ์šฉ์ž ๊ณต์œ  ๊ตฌ์กฐERD (Entity-Relationship Diagram)
๋…ผ๋ฆฌ์  ์Šคํ‚ค๋งˆํŠน์ • DB ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜SQL DDL ๊ตฌ๋ฌธ
๋ฌผ๋ฆฌ์  ์Šคํ‚ค๋งˆ๋””์Šคํฌ ์ €์žฅ ๋ฐฉ์‹์ธ๋ฑ์Šค, ํŒŒํ‹ฐ์…˜, ํด๋Ÿฌ์Šคํ„ฐ๋ง

์˜ˆ์‹œ ํ๋ฆ„:

[์„ค๊ณ„] ๊ณ ๊ฐ โ†” ์ฃผ๋ฌธ (1:N) โ€” ERD
     โ†“
[๋ณ€ํ™˜] CREATE TABLE customer (...);  -- DDL
       CREATE TABLE order (...);
     โ†“
[์ €์žฅ] B-tree ์ธ๋ฑ์Šค, ํŽ˜์ด์ง€ ํฌ๊ธฐ 16KB, ...

์Šคํ‚ค๋งˆ vs ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๊ณ„:

  • MySQL: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค = ์Šคํ‚ค๋งˆ (1:1)
  • PostgreSQL/Oracle: 1 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค โ†’ N ์Šคํ‚ค๋งˆ

์ž๊ธฐ ์ ๊ฒ€

  • ILIC์˜ ERD๋Š” ์–ด๋А ๊ณ„์ธต์ธ๊ฐ€?
  • "๋ฌผ๋ฆฌ์  ์Šคํ‚ค๋งˆ๊ฐ€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค€๋‹ค"์˜ ์˜๋ฏธ๋Š”? (ํžŒํŠธ: ์ธ๋ฑ์Šค, ํŒŒํ‹ฐ์…”๋‹)

๐Ÿ“š Phase 2 โ€” ์ •๊ทœํ™” (1NF โ†’ BCNF)

๋ชฉํ‘œ: ๋ฐ์ดํ„ฐ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์ด์ƒ ํ˜„์ƒ์„ ์ œ๊ฑฐํ•˜๋Š” ๋‹จ๊ณ„์  ๋ถ„ํ•ด ๊ธฐ๋ฒ•์„ ๋งˆ์Šคํ„ฐํ•œ๋‹ค. ๋ฉด์ ‘ ๋‹จ๊ณจ.

Unit 2.1 โ€” ์ •๊ทœํ™”์˜ ์ •์˜์™€ ๋ชฉ์ 

์„ ์ˆ˜ ์ง€์‹: Phase 1

ํ•ต์‹ฌ ๊ฐœ๋…

์ •๊ทœํ™”(Normalization):

"์†์„ฑ ๊ฐ„ ์ข…์† ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ฆด๋ ˆ์ด์…˜์œผ๋กœ ๋ถ„ํ•ด ํ•˜๋Š” ๊ณผ์ •"

๋ชฉ์ :

  • ์ค‘๋ณต ์ œ๊ฑฐ
  • ์ด์ƒ ํ˜„์ƒ(Anomaly) ๋ฐฉ์ง€ (Phase 3์—์„œ)
  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ

๋‹จ๊ณ„์  ๋ถ„ํ•ด โญ :

์›๋ณธ โ†’ 1NF โ†’ 2NF โ†’ 3NF โ†’ BCNF โ†’ ... (4NF, 5NF๋Š” ๊ฑฐ์˜ ์•ˆ ์”€)

์‹ค๋ฌด ๊ถŒ์žฅ:

  • 3NF ๋˜๋Š” BCNF ๊นŒ์ง€ ๊ฐ€ ์ผ๋ฐ˜์ 
  • ๋„ˆ๋ฌด ์—„๊ฒฉํ•˜๋ฉด JOIN ํญ์ฆ โ†’ ๋ฐ˜์ •๊ทœํ™” ๊ฒ€ํ† 

์ž๊ธฐ ์ ๊ฒ€

  • "์ •๊ทœํ™”๋Š” ์ข‹๋‹ค, ๊ทธ๋Ÿฐ๋ฐ ํ•ญ์ƒ ์ข‹์€๊ฐ€?"์˜ ๋‹ต์€? (ํžŒํŠธ: ํŠธ๋ ˆ์ด๋“œ์˜คํ”„)
  • 11์ฃผ์ฐจ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…๊ณผ ์ •๊ทœํ™”์˜ ๊ด€๊ณ„๋Š”? (ํžŒํŠธ: ์ž„๋ฒ ๋””๋“œ๋Š” ๋น„์ •๊ทœํ™” ํ˜•ํƒœ)

Unit 2.2 โ€” ์ œ1์ •๊ทœํ˜• (1NF) โ€” ์›์ž๊ฐ’

์„ ์ˆ˜ ์ง€์‹: Unit 2.1

ํ•ต์‹ฌ ๊ทœ์น™:

"ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์ด ์›์ž๊ฐ’(Atomic Value) ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค"

์œ„๋ฐ˜ ์‚ฌ๋ก€:

์ด๋ฆ„์ทจ๋ฏธ
๊น€์—ฐ์•„์ธํ„ฐ๋„ท
์ถ”์‹ ์ˆ˜์˜ํ™”, ์Œ์•… โ† ์›์ž๊ฐ’ X!
๋ฐ•์„ธ๋ฆฌ์Œ์•…, ์‡ผํ•‘

1NF ์ ์šฉ ํ›„:

์ด๋ฆ„์ทจ๋ฏธ
๊น€์—ฐ์•„์ธํ„ฐ๋„ท
์ถ”์‹ ์ˆ˜์˜ํ™”
์ถ”์‹ ์ˆ˜์Œ์•…
๋ฐ•์„ธ๋ฆฌ์Œ์•…
๋ฐ•์„ธ๋ฆฌ์‡ผํ•‘

๋ชจ๋ฒ” ์‚ฌ๋ก€:

  • ํ•œ ์ปฌ๋Ÿผ์— ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ฝค๋งˆ๋กœ ์ €์žฅ X
  • ๋ฐฐ์—ด/๋ฆฌ์ŠคํŠธ๋Š” ๋ณ„๋„ ํ…Œ์ด๋ธ”๋กœ

ํ˜„๋Œ€ DB์˜ ์˜ˆ์™ธ (์ฐธ๊ณ ):

  • PostgreSQL ARRAY ํƒ€์ž…
  • MySQL JSON ์ปฌ๋Ÿผ
  • โ†’ 1NF์˜ ์—„๊ฒฉํ•œ ์ •์˜๋Š” ํ๋ ค์ง€๋Š” ์ถ”์„ธ, ๊ทธ๋Ÿฌ๋‚˜ ์ •๊ทœํ™” ์ •์‹ ์€ ์œ ํšจ

์ž๊ธฐ ์ ๊ฒ€

  • ILIC์—์„œ 1NF๋ฅผ ์œ„๋ฐ˜ํ•  ๋งŒํ•œ ์‚ฌ๋ก€๋Š”? (ํžŒํŠธ: ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„๋œ ์ฝ”๋“œ ๋ชฉ๋ก)
  • JSON ์ปฌ๋Ÿผ์€ 1NF ์œ„๋ฐ˜์ธ๊ฐ€?

Unit 2.3 โ€” ์ œ2์ •๊ทœํ˜• (2NF) โ€” ๋ถ€๋ถ„ ํ•จ์ˆ˜ ์ข…์† ์ œ๊ฑฐ

์„ ์ˆ˜ ์ง€์‹: Unit 2.2

ํ•ต์‹ฌ ๊ทœ์น™:

"1NF + ๊ธฐ๋ณธ ํ‚ค์˜ ์ผ๋ถ€์—๋งŒ ์ข…์†๋œ ์†์„ฑ์„ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๋กœ ๋ถ„๋ฆฌ"

์ „์ œ: ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ๋ณตํ•ฉ ํ‚ค(composite key)์ผ ๋•Œ ์˜๋ฏธ๊ฐ€ ์žˆ์Œ

์œ„๋ฐ˜ ์‚ฌ๋ก€:

๊ธฐ๋ณธ ํ‚ค = (ํ•™์ƒID, ๊ฐ•์˜๋ช…)

ํ•™์ƒID๊ฐ•์˜๋ช…ํ•™์ƒ๋ช…๊ต์ˆ˜๋ช…
101๋ฐ์ดํ„ฐ๋ฒ ์ด์ŠคAlice๊น€๊ต์ˆ˜
101์šด์˜์ฒด์ œAlice๋ฐ•๊ต์ˆ˜

์ข…์† ๋ถ„์„:

  • ํ•™์ƒ๋ช…์€ ํ•™์ƒID ๋งŒ์œผ๋กœ ๊ฒฐ์ • โ† ๋ถ€๋ถ„ ํ•จ์ˆ˜ ์ข…์†
  • ๊ต์ˆ˜๋ช…์€ ๊ฐ•์˜๋ช… ๋งŒ์œผ๋กœ ๊ฒฐ์ • โ† ๋ถ€๋ถ„ ํ•จ์ˆ˜ ์ข…์†

2NF ์ ์šฉ โ€” 3๊ฐœ ํ…Œ์ด๋ธ”๋กœ ๋ถ„๋ฆฌ:

[ํ•™์ƒ ํ…Œ์ด๋ธ”] (ํ•™์ƒID ๊ธฐ๋ณธ ํ‚ค)
| ํ•™์ƒID | ํ•™์ƒ๋ช… |
|---|---|
| 101 | Alice |

[๊ฐ•์˜ ํ…Œ์ด๋ธ”] (๊ฐ•์˜๋ช… ๊ธฐ๋ณธ ํ‚ค)
| ๊ฐ•์˜๋ช… | ๊ต์ˆ˜๋ช… |
|---|---|
| ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค | ๊น€๊ต์ˆ˜ |

[์ˆ˜๊ฐ• ํ…Œ์ด๋ธ”] (ํ•™์ƒID, ๊ฐ•์˜๋ช… ๋ณตํ•ฉ ํ‚ค)
| ํ•™์ƒID | ๊ฐ•์˜๋ช… |
|---|---|
| 101 | ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค |
| 101 | ์šด์˜์ฒด์ œ |

ํ•ต์‹ฌ ํ†ต์ฐฐ:

"๋ถ€๋ถ„ ํ•จ์ˆ˜ ์ข…์† = ๋ณตํ•ฉ ํ‚ค์˜ ์ผ๋ถ€๋ถ„์—๋งŒ ์˜์กดํ•˜๋Š” ์†์„ฑ"

์ž๊ธฐ ์ ๊ฒ€

  • ๋‹จ์ผ ํ‚ค ํ…Œ์ด๋ธ”์€ ์ž๋™์œผ๋กœ 2NF์ธ๊ฐ€? (ํžŒํŠธ: YES, ๋ถ€๋ถ„ ์ข…์† ์ •์˜ ์ž์ฒด๊ฐ€ ์•ˆ ๋จ)
  • ILIC์˜ ์šด์ž„ ํ•ญ๋ชฉ ํ…Œ์ด๋ธ” (์šด์ž„ID + ํ•ญ๋ชฉ์ฝ”๋“œ ๋ณตํ•ฉ ํ‚ค) ์—์„œ ๋ถ€๋ถ„ ์ข…์†์ด ์žˆ๋Š”์ง€ ๊ฒ€ํ† 

Unit 2.4 โ€” ์ œ3์ •๊ทœํ˜• (3NF) + BCNF

์„ ์ˆ˜ ์ง€์‹: Unit 2.3

ํ•ต์‹ฌ ๊ทœ์น™ (3NF):

"2NF + ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ์•„๋‹Œ ์†์„ฑ์ด ์ดํ–‰ ํ•จ์ˆ˜ ์ข…์†(Transitive Dependency) ๋˜์ง€ ์•Š์Œ"

์ดํ–‰ ํ•จ์ˆ˜ ์ข…์†:

"A โ†’ B ์ด๊ณ  B โ†’ C ์ผ ๋•Œ A โ†’ C ์ธ ๊ด€๊ณ„"

์œ„๋ฐ˜ ์‚ฌ๋ก€ (๊ธฐ๋ณธ ํ‚ค = ์ด๋ฆ„):

์ด๋ฆ„ํ•™๊ณผ๋“ฑ๋ก๊ธˆ
์ฒ ์ˆ˜๊ธฐ๊ณ„๊ณตํ•™350
์˜ํฌ์ˆ˜ํ•™250
๋ฏผ์ˆ˜ํ™”ํ•™๊ณตํ•™300

์ข…์† ๋ถ„์„:

  • ์ด๋ฆ„ โ†’ ํ•™๊ณผ
  • ํ•™๊ณผ โ†’ ๋“ฑ๋ก๊ธˆ
  • โ†’ ์ด๋ฆ„ โ†’ ๋“ฑ๋ก๊ธˆ (์ดํ–‰์ !)

๋ฌธ์ œ:

  • ์ฒ ์ˆ˜๊ฐ€ ๊ธฐ๊ณ„๊ณตํ•™ โ†’ ์ˆ˜ํ•™ ์œผ๋กœ ๋ณ€๊ฒฝ ์‹œ โ†’ ๋“ฑ๋ก๊ธˆ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ ํ•„์š”
  • ๋ฐ์ดํ„ฐ ๊ฐฑ์‹  ์ผ๊ด€์„ฑ ๊นจ์ง

3NF ์ ์šฉ:

[ํ•™์ƒ ํ…Œ์ด๋ธ”]
| ์ด๋ฆ„ | ํ•™๊ณผ |
|---|---|
| ์ฒ ์ˆ˜ | ๊ธฐ๊ณ„๊ณตํ•™ |

[ํ•™๊ณผ ํ…Œ์ด๋ธ”]
| ํ•™๊ณผ | ๋“ฑ๋ก๊ธˆ |
|---|---|
| ๊ธฐ๊ณ„๊ณตํ•™ | 350 |


BCNF (Boyce-Codd Normal Form):

"3NF + ๋ชจ๋“  ๊ฒฐ์ •์ž๊ฐ€ ํ›„๋ณด ํ‚ค์—ฌ์•ผ ํ•จ"

์šฉ์–ด:

  • ๊ฒฐ์ •์ž(Determinant): ๋‹ค๋ฅธ ์†์„ฑ์„ ์œ ์ผํ•˜๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ
  • ํ›„๋ณด ํ‚ค(Candidate Key): ๊ฐ ํ–‰์„ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ ๊ฐ€๋Šฅํ•œ ์†์„ฑ(์กฐํ•ฉ)

์œ„๋ฐ˜ ์‚ฌ๋ก€:

ํ•™์ƒ๋ฒˆํ˜ธ๊ณผ๋ชฉ์ง€๋„๊ต์ˆ˜

ํ›„๋ณด ํ‚ค: (ํ•™์ƒ๋ฒˆํ˜ธ, ๊ณผ๋ชฉ) โ†’ ์ง€๋„๊ต์ˆ˜ ๊ฒฐ์ • ๊ฐ€๋Šฅ
ํ•˜์ง€๋งŒ: ์ง€๋„๊ต์ˆ˜ โ†’ ๊ณผ๋ชฉ ๋„ ๊ฒฐ์ • ๊ฐ€๋Šฅ

  • ๊ทธ๋Ÿฐ๋ฐ ์ง€๋„๊ต์ˆ˜๋Š” ํ›„๋ณด ํ‚ค๊ฐ€ ์•„๋‹˜!

โ†’ BCNF ์œ„๋ฐ˜

BCNF ์ ์šฉ:

  • ์ง€๋„๊ต์ˆ˜ โ†” ๊ณผ๋ชฉ ๋ณ„๋„ ํ…Œ์ด๋ธ”
  • ํ•™์ƒ-์ง€๋„๊ต์ˆ˜ ๋ณ„๋„ ํ…Œ์ด๋ธ”

์‹ค๋ฌด ๊ฒฐ๋ก :

"๋ณดํ†ต 3NF๊นŒ์ง€ ์ •๊ทœํ™”. BCNF๋Š” ํŠน์ˆ˜ ์ƒํ™ฉ"

์ž๊ธฐ ์ ๊ฒ€

  • 1NF/2NF/3NF/BCNF์˜ ์ฐจ์ด๋ฅผ ํ•œ ์ค„์”ฉ์œผ๋กœ ์š”์•ฝํ•˜๋ผ
  • 3NF์™€ BCNF๊ฐ€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋Š” ์‚ฌ๋ก€๊ฐ€ ํ”ํ•œ๊ฐ€? (ํžŒํŠธ: ๋“œ๋ฌผ์ง€๋งŒ ์กด์žฌ)

๐Ÿ“š Phase 3 โ€” ์ด์ƒ ํ˜„์ƒ๊ณผ ์ •๊ทœํ™” ํ‰๊ฐ€

๋ชฉํ‘œ: ์ •๊ทœํ™”์˜ ๋™๊ธฐ(์™œ ํ•„์š”ํ•œ๊ฐ€)์™€ ํ•œ๊ณ„(์–ธ์ œ ์•ˆ ์ข‹์€๊ฐ€)๋ฅผ ๋ชจ๋‘ ๋ณธ๋‹ค.

Unit 3.1 โ€” 3๊ฐ€์ง€ ์ด์ƒ ํ˜„์ƒ (์‚ฝ์ž…/๊ฐฑ์‹ /์‚ญ์ œ)

์„ ์ˆ˜ ์ง€์‹: Phase 2

ํ•ต์‹ฌ 3๊ฐ€์ง€ โญ :

์‚ฝ์ž… ์ด์ƒ(Insertion Anomaly):

"ํŠน์ • ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ์‹œ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๊นŒ์ง€ ํ•จ๊ป˜ ์ž…๋ ฅํ•ด์•ผ ํ•จ"

์˜ˆ: "์•Œ๊ณ ๋ฆฌ์ฆ˜" ์‹ ๊ทœ ๊ณผ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋Š”๋ฐ ํ•™์ƒ์ด ์—†์œผ๋ฉด NULL์„ ๋„ฃ๊ฑฐ๋‚˜ ๋”๋ฏธ ํ•™์ƒ ์ •๋ณด ํ•„์š”

๊ฐฑ์‹  ์ด์ƒ(Update Anomaly):

"๋ฐ์ดํ„ฐ ์ˆ˜์ • ์‹œ ์—ฌ๋Ÿฌ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•จ โ€” ์ผ๋ถ€๋งŒ ์ˆ˜์ • ์‹œ ๋ถˆ์ผ์น˜"

์˜ˆ: ๊น€๊ต์ˆ˜์˜ ์—ฐ๋ฝ์ฒ˜ ๋ณ€๊ฒฝ ์‹œ ๊น€๊ต์ˆ˜๊ฐ€ ๊ฐ€๋ฅด์น˜๋Š” ๋ชจ๋“  ๊ฐ•์˜ ๋ ˆ์ฝ”๋“œ ๊ฐฑ์‹  ํ•„์š”

UPDATE ๊ฐ•์˜์ •๋ณด SET ๊ต์ˆ˜์—ฐ๋ฝ์ฒ˜ = '...' WHERE ๊ต์ˆ˜ID = 1;
-- 5๊ฐœ ๋ ˆ์ฝ”๋“œ ๋ชจ๋‘ ๊ฐฑ์‹  โ€” ์ผ๋ถ€ ๋ˆ„๋ฝ ์‹œ ๋ถˆ์ผ์น˜

์‚ญ์ œ ์ด์ƒ(Deletion Anomaly):

"ํŠน์ • ๋ฐ์ดํ„ฐ ์‚ญ์ œ ์‹œ ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ๊นŒ์ง€ ํ•จ๊ป˜ ์‚ญ์ œ๋จ"

์˜ˆ: ํ•™์ƒ์ด ์ˆ˜๊ฐ• ์ทจ์†Œ โ†’ ๊ทธ ํ•™์ƒ์ด ๋งˆ์ง€๋ง‰ ์ˆ˜๊ฐ•์ž์˜€๋‹ค๋ฉด โ†’ ๊ณผ๋ชฉ ์ •๋ณด๊นŒ์ง€ ์‚ฌ๋ผ์ง

3๊ฐ€์ง€๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ทผ๋ณธ ์›์ธ:

"์„œ๋กœ ๋‹ค๋ฅธ ์˜๋ฏธ์˜ ์ •๋ณด๊ฐ€ ํ•œ ํ…Œ์ด๋ธ”์— ๋ฌถ์—ฌ ์žˆ์Œ"

โ†’ ์ •๊ทœํ™” ๊ฐ€ ํ•ด๊ฒฐ โญ

ILIC ๊ด€์  ์ ๊ฒ€:

  • ์šด์ž„ + ์šด์ž„ ํ•ญ๋ชฉ์ด ํ•œ ํ…Œ์ด๋ธ”์— ์žˆ๋‹ค๋ฉด? โ†’ ์‚ฝ์ž…/๊ฐฑ์‹ /์‚ญ์ œ ์ด์ƒ ๊ฐ€๋Šฅ
  • 11์ฃผ์ฐจ์—์„œ ์ด๋ฏธ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ (์ •๊ทœํ™”๋œ ์„ค๊ณ„)

์ž๊ธฐ ์ ๊ฒ€

  • 3๊ฐ€์ง€ ์ด์ƒ ํ˜„์ƒ์ด ๋ชจ๋‘ ๊ฐ™์€ ์›์ธ์—์„œ ๋น„๋กฏ๋˜๋Š” ์ด์œ ๋Š”?
  • ์ด์ƒ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ด๋„ ์ข‹์€ ์ผ€์ด์Šค๊ฐ€ ์žˆ์„๊นŒ? (ํžŒํŠธ: ๋ถ„์„์šฉ ๋งˆํŠธ, ๋น„์ •๊ทœํ™” ์˜๋„์ )

Unit 3.2 โ€” ์ •๊ทœํ™” ์žฅ๋‹จ์  + ๋ฐ˜์ •๊ทœํ™”

์„ ์ˆ˜ ์ง€์‹: Unit 3.1

ํ•ต์‹ฌ ํ‰๊ฐ€

์žฅ์ :

  • ์ด์ƒ ํ˜„์ƒ ์ œ๊ฑฐ
  • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ
  • ํ™•์žฅ ์‹œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์ตœ์†Œํ™”
  • ํ•œ ํ…Œ์ด๋ธ”์˜ ์šฉ๋Ÿ‰ ์ตœ์†Œํ™” โ†’ ์บ์‹œ ํšจ์œจ

๋‹จ์ :

  • JOIN ์ฆ๊ฐ€ โ†’ ์‘๋‹ต ์‹œ๊ฐ„ โ†‘
  • ๋ณต์žกํ•œ ํ†ต๊ณ„ ์ฟผ๋ฆฌ ์–ด๋ ค์›€
  • ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ ์••์ถ• ํšจ๊ณผ๋กœ ์‘๋‹ต ๋นจ๋ผ์งˆ ์ˆ˜๋„ (์–‘๋ฉด)

๋ฐ˜์ •๊ทœํ™”(Denormalization):

"์„ฑ๋Šฅ์„ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ ์ค‘๋ณต ํ—ˆ์šฉ"

์–ธ์ œ ๋ฐ˜์ •๊ทœํ™”?:
1. ์ž์ฃผ ํ•จ๊ป˜ ์กฐํšŒ๋˜๋Š” ๋ฐ์ดํ„ฐ โ†’ JOIN ๋น„์šฉ ์ ˆ๊ฐ
2. ํ†ต๊ณ„ ๋งˆํŠธ, ๋ณด๊ณ ์„œ์šฉ ํ…Œ์ด๋ธ”
3. ์ฝ๊ธฐ ๋น„์œจ์ด ์••๋„์ ์œผ๋กœ ๋†’์€ ํ…Œ์ด๋ธ”

ILIC ์‚ฌ๋ก€:

  • ์šด์ž„ + ์šด์ž„ ํ†ตํ™”/๊ธˆ์•ก โ†’ ์šด์ž„ ํ…Œ์ด๋ธ”์— ์ง์ ‘ ์ €์žฅ (์ž„๋ฒ ๋””๋“œ ํƒ€์ž…)
  • ๊ฒ€์ƒ‰์šฉ ๋งˆํŠธ ํ…Œ์ด๋ธ” ๋ณ„๋„ ์ƒ์„ฑ ๊ฐ€๋Šฅ

์›์น™:

"์ •๊ทœํ™” ํ›„ ๋ฐ˜์ •๊ทœํ™” โ€” ์ ˆ๋Œ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋น„์ •๊ทœํ™”๋กœ ์‹œ์ž‘ํ•˜์ง€ ๋ง ๊ฒƒ"

์ž๊ธฐ ์ ๊ฒ€

  • 11์ฃผ์ฐจ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… (@Embeddable)์ด ๋ฐ˜์ •๊ทœํ™” ์‚ฌ๋ก€์ธ๊ฐ€? (ํžŒํŠธ: ์ผ์ข…์˜ ๊ทธ๋ ‡๋‹ค)
  • ๋ฐ˜์ •๊ทœํ™”์˜ ๊ฐ€์žฅ ํฐ ์œ„ํ—˜์€? (ํžŒํŠธ: ๊ฐฑ์‹  ์ด์ƒ)

๐Ÿ“š Phase 4 โ€” SQL Injection ๋ณด์•ˆ

๋ชฉํ‘œ: ๊ฐ€์žฅ ํ”ํ•œ ์›น ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์ดํ•ดํ•˜๊ณ  ํ‘œ์ค€ ๋ฐฉ์–ด๋ฒ•์„ ์ตํžŒ๋‹ค.

Unit 4.1 โ€” SQL Injection ๊ณต๊ฒฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜

์„ ์ˆ˜ ์ง€์‹: 6์ฃผ์ฐจ Phase 7 (JdbcTemplate)

ํ•ต์‹ฌ ๊ฐœ๋…

SQL Injection:

"์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ์•…์˜์ ์ธ SQL ์ฝ”๋“œ๋ฅผ ์ฃผ์ž… ํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ณต๊ฒฉ"

์ทจ์•ฝ ์ฝ”๋“œ:

String username = request.getParameter("username");
String query = "SELECT * FROM users WHERE username = '" + username + "'";
//                                                    โ†‘ ์ง์ ‘ ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ (์œ„ํ—˜!)

Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);

๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค:

  • ๊ณต๊ฒฉ์ž๊ฐ€ username ํ•„๋“œ์— ' OR '1'='1 ์ž…๋ ฅ
  • ์ฟผ๋ฆฌ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜:
SELECT * FROM users WHERE username = '' OR '1'='1'
--                              โ†‘ ํ•ญ์ƒ ์ฐธ โ†’ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์กฐํšŒ!

๋‹ค๋ฅธ ๊ณต๊ฒฉ ํŒจํ„ด:

  • '; DROP TABLE users; -- โ†’ ํ…Œ์ด๋ธ” ์‚ญ์ œ
  • ' UNION SELECT password FROM admins -- โ†’ ๊ถŒํ•œ ์šฐํšŒ

ํ”ผํ•ด:

  • ๋ฐ์ดํ„ฐ ํƒˆ์ทจ (๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ฐœ์ธ์ •๋ณด)
  • ๋ฐ์ดํ„ฐ ๋ณ€์กฐ/์‚ญ์ œ
  • ์‹œ์Šคํ…œ ๊ถŒํ•œ ํƒˆ์ทจ

์ž๊ธฐ ์ ๊ฒ€

  • ์™œ ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ์ด SQL Injection์„ ์ผ์œผํ‚ค๋Š”๊ฐ€?
  • ILIC์˜ ์–ด๋–ค ์ž…๋ ฅ ํ•„๋“œ๊ฐ€ ์ž ์žฌ์  ๊ณต๊ฒฉ ์ง€์ ์ธ๊ฐ€? (ํžŒํŠธ: ๊ฒ€์ƒ‰ ์กฐ๊ฑด)

Unit 4.2 โ€” Prepared Statement + ๋‹ค์ธต ๋ฐฉ์–ด

์„ ์ˆ˜ ์ง€์‹: Unit 4.1

ํ•ต์‹ฌ ๋ฐฉ์–ด โ€” Prepared Statement โญ :

String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, username);  // ์ž…๋ ฅ๊ฐ’์ด SQL์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋กœ ์ธ์‹
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();

์™œ ์•ˆ์ „ํ•œ๊ฐ€:

  • SQL ์ฟผ๋ฆฌ๊ฐ€ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ ๋จ
  • ์ดํ›„ ์ž…๋ ฅ๊ฐ’์€ ๋ฐ์ดํ„ฐ๋กœ๋งŒ ์ฒ˜๋ฆฌ (SQL ํ‚ค์›Œ๋“œ X)
  • ', ;, -- ๋“ฑ์ด ์ž๋™ ์ด์Šค์ผ€์ดํ”„

JPA์˜ ์ž๋™ ์ ์šฉ:

  • JPQL์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ (:userName)
  • โ†’ JPA๋ฅผ ์“ฐ๋ฉด ์ž๋™์œผ๋กœ Prepared Statement ์‚ฌ์šฉ
  • โ†’ JPA๊ฐ€ SQL Injection ์œ„ํ—˜์„ ์ค„์—ฌ์ฃผ๋Š” ๋ถ€์ˆ˜ ํšจ๊ณผ

๋‹ค์ธต ๋ฐฉ์–ด (Defense in Depth):

  1. Prepared Statement (๊ฐ€์žฅ ์ค‘์š”) โญ
  2. ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ/ํ•„ํ„ฐ๋ง:
public static String sanitizeInput(String input) {
    return input.replaceAll("[^a-zA-Z0-9]", "");  // ์˜์ˆซ์ž๋งŒ
}
  1. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ˆจ๊ธฐ๊ธฐ: ์šด์˜ ํ™˜๊ฒฝ์—์„œ SQL ์—๋Ÿฌ ๋…ธ์ถœ X
  2. ์ตœ์†Œ ๊ถŒํ•œ ์›์น™: DB ๊ณ„์ •์— ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ
  3. WAF (Web Application Firewall)

Spring Security์˜ ๋„์›€:

  • ์ž…๋ ฅ ๊ฒ€์ฆ ์–ด๋…ธํ…Œ์ด์…˜ (@Valid, @Pattern)
  • CSRF/XSS ๊ฐ™์ด ๋‹ค๋ฅธ ๋ณด์•ˆ ์œ„ํ˜‘๋„ ํ•จ๊ป˜ ๋ฐฉ์–ด

์ž๊ธฐ ์ ๊ฒ€

  • PreparedStatement๋ฅผ ์“ฐ๋ฉด ์ •๋ง 100% ์•ˆ์ „ํ•œ๊ฐ€? (ํžŒํŠธ: ๋™์  ํ…Œ์ด๋ธ”๋ช…/์ปฌ๋Ÿผ๋ช…์€ ์—ฌ์ „ํžˆ ์œ„ํ—˜)
  • ILIC์—์„œ ๋ชจ๋“  SQL์€ Prepared Statement๋ฅผ ์“ฐ๊ณ  ์žˆ๋Š”๊ฐ€? (JPA ์‚ฌ์šฉ ์‹œ YES)

๐Ÿ“š Phase 5 โ€” RDBMS์™€ NoSQL

๋ชฉํ‘œ: ๋ฐ์ดํ„ฐ ์ €์žฅ์˜ ๋‘ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋น„๊ตํ•˜๊ณ , ILIC๊ฐ€ ์™œ RDBMS์ธ์ง€ ์ดํ•ดํ•œ๋‹ค.

Unit 5.1 โ€” RDBMS ํŠน์ง•๊ณผ 4๊ฐ€์ง€ ์ œ์•ฝ์กฐ๊ฑด

์„ ์ˆ˜ ์ง€์‹: 6์ฃผ์ฐจ Phase 6, 10์ฃผ์ฐจ Phase 5

ํ•ต์‹ฌ ์ •์˜

RDBMS (Relational Database Management System):

"๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜์—ฌ ๊ด€๋ฆฌ"

4๊ฐ€์ง€ ํ•ต์‹ฌ ํŠน์ง•:

  1. ํ…Œ์ด๋ธ” ๊ตฌ์กฐ: ํ–‰(Row) + ์—ด(Column)
  2. ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ โ€” 5๊ฐ€์ง€ ์ œ์•ฝ์กฐ๊ฑด:
์ œ์•ฝ์˜๋ฏธ
PRIMARY KEYํ–‰ ์‹๋ณ„, ์ค‘๋ณต/NULL ๋ถˆ๊ฐ€
FOREIGN KEY๋‹ค๋ฅธ ํ…Œ์ด๋ธ” ์ฐธ์กฐ
UNIQUE์ค‘๋ณต ๋ฐฉ์ง€
NOT NULLํ•„์ˆ˜ ์ž…๋ ฅ
CHECK๊ฐ’ ๋ฒ”์œ„/์กฐ๊ฑด ๊ฒ€์ฆ
  1. SQL ์ง€์›: ํ‘œ์ค€ ์ฟผ๋ฆฌ ์–ธ์–ด
  2. ACID ํŠธ๋žœ์žญ์…˜ (6์ฃผ์ฐจ + 10์ฃผ์ฐจ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€):
    • Atomicity (์›์ž์„ฑ)
    • Consistency (์ผ๊ด€์„ฑ)
    • Isolation (๊ฒฉ๋ฆฌ์„ฑ)
    • Durability (์ง€์†์„ฑ)

๋Œ€ํ‘œ RDBMS:

  • MySQL โญ (ILIC ์‚ฌ์šฉ ์ถ”์ •)
  • PostgreSQL
  • Oracle
  • SQL Server
  • MariaDB

์ž๊ธฐ ์ ๊ฒ€

  • ACID์˜ 'C'์™€ ์ •๊ทœํ™”์˜ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ์€ ์–ด๋–ค ๊ด€๊ณ„์ธ๊ฐ€?
  • ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ์กฐ๊ฑด์„ ๋„๋ฉด ์–ด๋–ค ์‚ฌ๊ณ ๊ฐ€? (ํžŒํŠธ: ๊ณ ์•„ ํ–‰)

Unit 5.2 โ€” Scale-Up vs Scale-Out โญ

์„ ์ˆ˜ ์ง€์‹: Unit 5.1

ํ•ต์‹ฌ ๋น„๊ต:

Scale-Up (์ˆ˜์ง ํ™•์žฅ)Scale-Out (์ˆ˜ํ‰ ํ™•์žฅ)
๋ฐฉ์‹๋‹จ์ผ ์„œ๋ฒ„ ์„ฑ๋Šฅ ์—…๊ทธ๋ ˆ์ด๋“œ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ์ถ”๊ฐ€
๋น„์œ ๋” ํฐ ์ปดํ“จํ„ฐ์ปดํ“จํ„ฐ ์—ฌ๋Ÿฌ ๋Œ€
์ ํ•ฉRDBMSNoSQL
ํ•œ๊ณ„ํ•˜๋“œ์›จ์–ด ํ•œ๊ณ„, ๋น„์šฉ โ†‘๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ, ๋„คํŠธ์›Œํฌ ๋น„์šฉ
์˜ˆCPU/RAM/SSD ๊ฐ•ํ™”Sharding, Replication

RDBMS๊ฐ€ Scale-Up ์„ ํ˜ธํ•˜๋Š” ์ด์œ :

  • ACID ์ผ๊ด€์„ฑ ๊ฐ•๋ ฅ ๋ณด์žฅ ํ•„์š”
  • JOIN๊ณผ ํŠธ๋žœ์žญ์…˜ ์œ ์ง€ ์–ด๋ ค์›€ (๋ถ„์‚ฐ ํ™˜๊ฒฝ)
  • ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ JOIN ์‹œ ๋„คํŠธ์›Œํฌ ๋น„์šฉ ํญ์ฆ

NoSQL์ด Scale-Out ์„ ํ˜ธํ•˜๋Š” ์ด์œ :

  • Sharding(์ƒค๋”ฉ) ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ถ„ํ•  ์‰ฌ์›€
  • BASE ๋ชจ๋ธ (์ผ๊ด€์„ฑ ์ผ๋ถ€ ํฌ๊ธฐ)
  • JOIN ํšŒํ”ผ โ†’ ์ฝ๊ธฐ ์„ฑ๋Šฅ ์šฐ์„ 

Replication (๋ณต์ œ):

  • Master(์“ฐ๊ธฐ) + Slave(์ฝ๊ธฐ ์ „์šฉ) ๊ตฌ์กฐ
  • ๋Œ€๋Ÿ‰ ์ฝ๊ธฐ ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ
  • ๊ทธ๋Ÿฌ๋‚˜ ์“ฐ๊ธฐ ํŠธ๋ž˜ํ”ฝ ์€ ์—ฌ์ „ํžˆ ๋‹จ์ผ ์„œ๋ฒ„ ๋ถ€๋‹ด

ILIC์˜ ํ˜„์‹ค:

  • MySQL ๋‹จ์ผ ์„œ๋ฒ„ (Scale-Up ๊ฐ€๋Šฅ)
  • ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ ์‹œ โ†’ Read Replica ์ถ”๊ฐ€ (read-only)
  • ๋” ๋Š˜๋ฉด โ†’ Sharding ๊ฒ€ํ† 

์ž๊ธฐ ์ ๊ฒ€

  • ILIC์˜ 102๊ฐœ ํ…Œ์ด๋ธ”์ด ๊ฐ‘์ž๊ธฐ 5๋ฐฐ ์ปค์ง€๋ฉด? (ํžŒํŠธ: Scale-Up ์šฐ์„ , ๋‚˜์ค‘ Replication)
  • ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ Scale-Up์ด ๋” ์‰ฌ์›Œ์ง„ ์ด์œ ๋Š”? (ํžŒํŠธ: ์ธ์Šคํ„ด์Šค ํƒ€์ž… ๋ณ€๊ฒฝ)

Unit 5.3 โ€” NoSQL ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ๊ณผ 4๊ฐ€์ง€ ์œ ํ˜•

์„ ์ˆ˜ ์ง€์‹: Unit 5.2

RDB์˜ ํ•œ๊ณ„ (NoSQL ๋“ฑ์žฅ ๋™๊ธฐ):
1. ์œ ์—ฐํ•œ ํ™•์žฅ์„ฑ ๋ถ€์กฑ (์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ๋น„์šฉ)
2. ๋ฐ์ดํ„ฐ ์ค‘๋ณต ๋น„ํ—ˆ์šฉ โ†’ ๋ณต์žกํ•œ JOIN
3. ๋‹จ์ผ ์„œ๋ฒ„ ํŠธ๋ž˜ํ”ฝ ํ•œ๊ณ„
4. ACID ๋ณด์žฅ์˜ ์„ฑ๋Šฅ ๋น„์šฉ

NoSQL = "Not Only SQL":

  • ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ (์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ)
  • ๋Œ€๋Ÿ‰ ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ์— ํŠนํ™”
  • ์Šคํ‚ค๋งˆ ์—†์Œ ๋˜๋Š” ๋А์Šจํ•œ ์Šคํ‚ค๋งˆ

NoSQL 5๊ฐ€์ง€ ํŠน์ง•:
1. ์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ โ€” ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ์„ ์•ฑ์—์„œ ์ฑ…์ž„
2. ๋†’์€ ํ™•์žฅ์„ฑ โ€” Scale-Out ์นœํ™”
3. ๋น ๋ฅธ ์ฒ˜๋ฆฌ ์†๋„ โ€” JOIN ํšŒํ”ผ, ์ค‘์ฒฉ ์ €์žฅ
4. ๋‹ค์–‘ํ•œ ์ €์žฅ ๋ฐฉ์‹ โ€” JSON, Key-Value, Graph ๋“ฑ
5. BASE ๋ชจ๋ธ โ€” ACID ๋Œ€์‹ 

4๊ฐ€์ง€ NoSQL ์œ ํ˜• โญ :

์œ ํ˜•์ €์žฅ ๋ฐฉ์‹๋Œ€ํ‘œ ์ œํ’ˆ์‚ฌ์šฉ ์‚ฌ๋ก€
Key-Valueํ‚ค-๊ฐ’ ๋‹จ์ˆœ ์ €์žฅRedis, DynamoDB์บ์‹œ, ์„ธ์…˜
DocumentJSON/BSON ๋ฌธ์„œMongoDB, CouchDB๋‹ค์–‘ํ•œ ๊ตฌ์กฐ ๋ฐ์ดํ„ฐ
Column-Family์—ด ๊ธฐ๋ฐ˜ ์ €์žฅCassandra, HBase๋Œ€๋Ÿ‰ ์‹œ๊ณ„์—ด, ๋ถ„์„
Graph๋…ธ๋“œ + ์—ฃ์ง€Neo4j, Amazon Neptune๊ด€๊ณ„ ๋ถ„์„, ์ถ”์ฒœ

Document Store ํ•ต์‹ฌ โ€” ์ปฌ๋ ‰์…˜(Collection):

  • RDBMS์˜ ํ…Œ์ด๋ธ”๊ณผ ์œ ์‚ฌ
  • ๊ทธ๋Ÿฌ๋‚˜ ๊ณ ์ • ์Šคํ‚ค๋งˆ X โ€” ๊ฐ™์€ ์ปฌ๋ ‰์…˜ ๋‚ด ๋‹ค๋ฅธ ๊ตฌ์กฐ ๋ฌธ์„œ ์ €์žฅ ๊ฐ€๋Šฅ
// ๊ฐ™์€ users ์ปฌ๋ ‰์…˜ ์•ˆ์— ๋‘ ๋‹ค๋ฅธ ๊ตฌ์กฐ OK
{ "name": "Alice", "age": 25 }
{ "name": "Bob", "skills": ["Java", "Python"] }

Graph DB์˜ ๊ฐ•๋ ฅํ•จ:

  • JOIN ์—†์ด ์—ฃ์ง€๋กœ ์ง์ ‘ ๊ด€๊ณ„ ํƒ์ƒ‰
  • ์นœ๊ตฌ์˜ ์นœ๊ตฌ์˜ ์นœ๊ตฌ โ€” RDBMS๋Š” 3 JOIN, Graph๋Š” ์ง๊ด€์ 

๊ธˆ์œต/๊ฒฐ์ œ/์˜ˆ์•ฝ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์ค‘์š” ์˜์—ญ์€ NoSQL ์‚ฌ์šฉ ์กฐ์‹ฌ.

์ž๊ธฐ ์ ๊ฒ€

  • ILIC์˜ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ NoSQL๋กœ ์˜ฎ๊ธฐ๋ฉด ์ข‹์„๊นŒ? (ํžŒํŠธ: ๋กœ๊ทธ, ์•Œ๋ฆผ)
  • ํ•œ ์‹œ์Šคํ…œ์— RDBMS์™€ NoSQL์„ ํ•จ๊ป˜ ์“ฐ๋Š” ์‚ฌ๋ก€๋Š”? (ํžŒํŠธ: ํด๋ฆฌ๊ธ€๋ž ์˜์†์„ฑ)

Unit 5.4 โ€” Redis

์„ ์ˆ˜ ์ง€์‹: Unit 5.3, 4์ฃผ์ฐจ Phase 5

ํ•ต์‹ฌ ๊ฐœ๋…

Redis (Remote Dictionary Server):

  • Key-Value Store NoSQL์˜ ๋Œ€ํ‘œ์ฃผ์ž
  • ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ โ€” ๋งค์šฐ ๋น ๋ฆ„
  • ๋‹ค์–‘ํ•œ ํƒ€์ž… ์ง€์› (String, List, Set, Hash, Sorted Set, Stream)

ํ™œ์šฉ ์˜์—ญ โญ :

  1. ์บ์‹ฑ (๊ฐ€์žฅ ํ”ํ•œ ์‚ฌ์šฉ):
[Client] โ†’ [App] โ†’ [Redis] (์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜)
                      โ†“ (์—†์œผ๋ฉด)
                   [DB]  โ†’ [Redis ์ €์žฅ] โ†’ [Client]
  1. ์„ธ์…˜ ์ €์žฅ:
  • ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ์„ธ์…˜ ๊ณต์œ 
  • ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๊ฐ™์€ Redis ์ฐธ์กฐ
  1. ๋ฉ”์‹œ์ง€ ํ (Pub/Sub)

  2. ๋ถ„์‚ฐ ๋ฝ:

  • SETNX ๋ช…๋ น์œผ๋กœ ๋‹จ์ผ ๋ฝ ๊ตฌํ˜„
  1. ์นด์šดํ„ฐยท๋žญํ‚น:
  • Sorted Set์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๋žญํ‚น

์œ ํŠœ๋ธŒ ์บ์‹ฑ ์˜ˆ์‹œ:
1. ์‚ฌ์šฉ์ž๊ฐ€ ๋™์˜์ƒ ์š”์ฒญ
2. Backend โ†’ Redis ์กฐํšŒ (TTL 60์ดˆ ์„ค์ •)
3. ์žˆ์œผ๋ฉด โ†’ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ (DB ์•ˆ ๊ฑฐ์นจ)
4. ์—†์œผ๋ฉด โ†’ DB ์กฐํšŒ โ†’ Redis ์ €์žฅ โ†’ ๋ฐ˜ํ™˜

๊ณ ๊ฐ€์šฉ์„ฑ (High Availability):

  • Replication
  • Sentinel (๊ฐ์‹œ์ž) โ€” ์ž๋™ failover
  • Cluster โ€” Sharding

ILIC ์ ์šฉ ๊ฐ€๋Šฅ:

  • ์šด์ž„ ์ฝ”๋“œ ๋งˆ์Šคํ„ฐ ๋ฐ์ดํ„ฐ ์บ์‹ฑ
  • ์‚ฌ์šฉ์ž ์„ธ์…˜
  • API ์š”์ฒญ ์ œํ•œ (Rate Limiting)

์ž๊ธฐ ์ ๊ฒ€

  • Redis๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์ธ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์˜์†ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? (ํžŒํŠธ: RDB/AOF)
  • ILIC์— Redis๋ฅผ ๋„์ž…ํ•œ๋‹ค๋ฉด ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ? (ํžŒํŠธ: ์ž์ฃผ ์ฝ๊ณ  ๋ณ€๊ฒฝ ์ ์€ ๋งˆ์Šคํ„ฐ ๋ฐ์ดํ„ฐ)

๐Ÿ“š Phase 6 โ€” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ด๋ก ๊ณผ ๋ฝ

๋ชฉํ‘œ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ผ๊ด€์„ฑยท๊ฐ€์šฉ์„ฑ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์ด๋ก ๊ณผ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์ดํ•ดํ•œ๋‹ค.

Unit 6.1 โ€” BASE ๋ชจ๋ธ

์„ ์ˆ˜ ์ง€์‹: Phase 5, 6์ฃผ์ฐจ ACID

ํ•ต์‹ฌ ๊ฐœ๋…

BASE = ACID์˜ ๋ฐ˜๋Œ€ ์ฒ ํ•™ โญ :

  • Basically Available
  • Soft state
  • Eventually consistent

3๊ฐ€์ง€ ํ’€์–ด๋ณด๊ธฐ:

1. Basically Available (๊ธฐ๋ณธ์  ๊ฐ€์šฉ์„ฑ):

  • ์ •ํ™•ํ•œ ๊ฐ’์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•ด๋„ ์‘๋‹ต ์ œ๊ณต
  • ๊ฐ€์šฉ์„ฑ ์šฐ์„ 

2. Soft State (๋ถ€๋“œ๋Ÿฌ์šด ์ƒํƒœ):

  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ค‘ ์ผ์‹œ์  ๋ถˆ์ผ์น˜ ํ—ˆ์šฉ
  • ์ผ์ • ์‹œ๊ฐ„ ํ›„ ์ž๋™ ์ผ๊ด€์„ฑ

3. Eventually Consistent (์ตœ์ข…์  ์ผ๊ด€์„ฑ):

  • ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ํ•ญ์ƒ ๋™๊ธฐํ™” X
  • ์–ธ์  ๊ฐ€๋Š” ์ผ๊ด€์„ฑ ์œ ์ง€

์˜ˆ์‹œ โ€” ๋ถ„์‚ฐ ํ™˜๊ฒฝ ๊ฒŒ์‹œ๋ฌผ ์—…๋กœ๋“œ:
1. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์‹œ๋ฌผ ์—…๋กœ๋“œ
2. ์ผ๋ถ€ ์„œ๋ฒ„: ์ฆ‰์‹œ ๋ฐ˜์˜
3. ์ผ๋ถ€ ์„œ๋ฒ„: ์ž ์‹œ ๋™์•ˆ ๋ณด์ด์ง€ ์•Š์Œ
4. ๋ช‡ ์ดˆ~๋ช‡ ๋ถ„ ํ›„: ๋ชจ๋“  ์„œ๋ฒ„ ๋™๊ธฐํ™” ์™„๋ฃŒ

ACID vs BASE:

์ธก๋ฉดACIDBASE
์ผ๊ด€์„ฑ์ฆ‰์‹œ ๊ฐ•ํ•œ ์ผ๊ด€์„ฑ์ตœ์ข…์  ์ผ๊ด€์„ฑ
๊ฐ€์šฉ์„ฑ์ผ๊ด€์„ฑ ์œ„ํ•ด ์–‘๋ณด์šฐ์„  ๋ณด์žฅ
ํŠธ๋žœ์žญ์…˜๊ฐ•๋ ฅ๋А์Šจ
์ ํ•ฉ ์˜์—ญ๊ธˆ์œตยท๊ฒฐ์ œSNSยท๋กœ๊ทธยท๊ฒ€์ƒ‰

์ž๊ธฐ ์ ๊ฒ€

  • ILIC๊ฐ€ ACID๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š”? (ํžŒํŠธ: ์šด์ž„/์˜ˆ์•ฝ ์ •ํ™•์„ฑ ํ•„์ˆ˜)
  • BASE๋ฅผ ์ฑ„ํƒํ•ด๋„ ๋˜๋Š” ILIC ์˜์—ญ์€? (ํžŒํŠธ: ๋กœ๊ทธ ์ˆ˜์ง‘, ์•Œ๋ฆผ)

Unit 6.2 โ€” CAP ์ด๋ก  (CA/CP/AP) โญ

์„ ์ˆ˜ ์ง€์‹: Unit 6.1

ํ•ต์‹ฌ ์ด๋ก 

CAP ์ด๋ก :

"๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ Consistency, Availability, Partition Tolerance ์ค‘ 2๊ฐ€์ง€๋งŒ ๋งŒ์กฑ ๊ฐ€๋Šฅ"

3๊ฐ€์ง€ ์†์„ฑ:

์ •์˜
C Consistency (์ผ๊ด€์„ฑ)๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๊ฐ™์€ ๊ฐ’
A Availability (๊ฐ€์šฉ์„ฑ)๋ชจ๋“  ์š”์ฒญ์— ์‘๋‹ต
P Partition Tolerance (๋ถ„ํ•  ํ—ˆ์šฉ์„ฑ)๋„คํŠธ์›Œํฌ ๋‹จ์ ˆ ์‹œ์—๋„ ๋™์ž‘

3๊ฐ€์ง€ ์กฐํ•ฉ:

CP (์ผ๊ด€์„ฑ + ๋ถ„ํ•  ํ—ˆ์šฉ์„ฑ) โ€” NoSQL:

  • ๋„คํŠธ์›Œํฌ ์žฅ์•  ์‹œ ์‘๋‹ต ์ง€์—ฐ ๊ฐ์ˆ˜
  • ๋ชจ๋“  ๋…ธ๋“œ ๋™๊ธฐํ™”๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  • ์˜ˆ: MongoDB, HBase

AP (๊ฐ€์šฉ์„ฑ + ๋ถ„ํ•  ํ—ˆ์šฉ์„ฑ) โ€” NoSQL:

  • ๋„คํŠธ์›Œํฌ ์žฅ์•  ์‹œ ์ผ๊ด€์„ฑ ์–‘๋ณด
  • ์ผ๋ถ€ ๋…ธ๋“œ ์ตœ์‹  ์•„๋‹ˆ์–ด๋„ ์ฆ‰์‹œ ์‘๋‹ต
  • ์˜ˆ: Cassandra, DynamoDB

CA (์ผ๊ด€์„ฑ + ๊ฐ€์šฉ์„ฑ) โ€” RDBMS:

  • ๋„คํŠธ์›Œํฌ ์žฅ์•  ๋ฌด์‹œ (๋‹จ์ผ ์„œ๋ฒ„)
  • ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋Š” ์œ ์ง€ ๋ถˆ๊ฐ€
  • ์˜ˆ: MySQL, PostgreSQL (๋‹จ์ผ ์„œ๋ฒ„)

์ค‘์š”ํ•œ ํ†ต์ฐฐ:

"ํ˜„์‹ค ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ๋Š” P(Partition)๋Š” ํ•„์ˆ˜"

๋”ฐ๋ผ์„œ ์ง„์งœ ์„ ํƒ์€ CP vs AP

ILIC ๊ด€์ :

  • ๋‹จ์ผ MySQL โ†’ CA
  • Replica ์ถ”๊ฐ€ โ†’ ์ผ๋ถ€ P ๊ณ ๋ ค, ๋ณดํ†ต CP
  • ์šด์ž„ ์ •ํ™•์„ฑ ์šฐ์„  โ†’ ์ผ๊ด€์„ฑ โ†‘

์ž๊ธฐ ์ ๊ฒ€

  • "CA๋งŒ ๋งŒ์กฑํ•˜๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€?"์˜ ๋‹ต์€? (ํžŒํŠธ: NO, ์ด๋ก ์ ์œผ๋กœ ๋‹จ์ผ ์„œ๋ฒ„๋งŒ)
  • SNS ์„œ๋น„์Šค์˜ ์ข‹์•„์š” ์ˆ˜์— ์ ํ•ฉํ•œ ์กฐํ•ฉ์€? (ํžŒํŠธ: AP)

Unit 6.3 โ€” PACELC ์ด๋ก  (CAP์˜ ํ™•์žฅ)

์„ ์ˆ˜ ์ง€์‹: Unit 6.2

ํ•ต์‹ฌ ๊ฐœ๋…

CAP์˜ ํ•œ๊ณ„:

  • ๋„คํŠธ์›Œํฌ ์žฅ์•  ์‹œ๋งŒ ๋‹ค๋ฃธ
  • ์ •์ƒ ์ƒํ™ฉ์—์„œ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š”?

PACELC:

"Partition ๋ฐœ์ƒ ์‹œ Availability vs Consistency, Else ์ •์ƒ ์‹œ Latency vs Consistency"

๋‘ ๊ฐ€์ง€ ๋ถ„๊ธฐ:

PA/PC: ๋„คํŠธ์›Œํฌ ์žฅ์•  ์‹œ (CAP๊ณผ ๋™์ผ)

  • PA: ๊ฐ€์šฉ์„ฑ ์šฐ์„ 
  • PC: ์ผ๊ด€์„ฑ ์šฐ์„ 

EL/EC: ์ •์ƒ ์‹œ

  • EL: ์ง€์—ฐ ์‹œ๊ฐ„(์„ฑ๋Šฅ) ์šฐ์„  โ†’ ์ผ๊ด€์„ฑ ์–‘๋ณด ๊ฐ€๋Šฅ
  • EC: ์ผ๊ด€์„ฑ ์šฐ์„  โ†’ ์‘๋‹ต ์‹œ๊ฐ„ ์–‘๋ณด

๋Œ€ํ‘œ ์‹œ์Šคํ…œ ๋ถ„๋ฅ˜:

์‹œ์Šคํ…œ๋ถ„๋ฅ˜ํŠน์ง•
MongoDBPA + EC์žฅ์•  ์‹œ ๊ฐ€์šฉ์„ฑ, ์ •์ƒ ์‹œ ์ผ๊ด€์„ฑ
CassandraPA + EL์žฅ์•  ์‹œ ๊ฐ€์šฉ์„ฑ, ์ •์ƒ ์‹œ ์ง€์—ฐ ์šฐ์„ 
HBase, SpannerPC + EC์žฅ์•  ์‹œยท์ •์ƒ ์‹œ ๋ชจ๋‘ ์ผ๊ด€์„ฑ ์šฐ์„ 
DynamoDBPA + ELCassandra ์œ ์‚ฌ
MySQL (๋‹จ์ผ)(CA), EC์žฅ์•  ๊ฐ€์ • X, ์ผ๊ด€์„ฑ

ํ•ต์‹ฌ ํ†ต์ฐฐ:

"CAP๋Š” ์žฅ์•  ์‹œ๋งŒ ๋‹ค๋ฃฌ๋‹ค. PACELC๋Š” ํ‰์ƒ์‹œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๋„ ๋ณธ๋‹ค"

ILIC ๊ด€์ :

  • MySQL: EC (์ผ๊ด€์„ฑ ์šฐ์„ ) ์ž์—ฐ์Šค๋Ÿฌ์›€
  • Redis ๋„์ž… ์‹œ: ์บ์‹œ๋Š” EL (์ง€์—ฐ ์‹œ๊ฐ„ ์šฐ์„ )

์ž๊ธฐ ์ ๊ฒ€

  • ๊ฐ™์€ NoSQL์ด๋ผ๋„ PACELC ๋ถ„๋ฅ˜๊ฐ€ ๋‹ค๋ฅธ ์ด์œ ๋Š”?
  • ์ผ๊ด€์„ฑ ์šฐ์„  ์‹œ ์‘๋‹ต ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚˜๋Š” ์ด์œ ๋Š”? (ํžŒํŠธ: ๋‹ค์ค‘ ๋…ธ๋“œ ํ•ฉ์˜)

Unit 6.4 โ€” ๊ณต์œ ๋ฝ(S Lock)๊ณผ ๋ฒ ํƒ€๋ฝ(X Lock)

์„ ์ˆ˜ ์ง€์‹: 4์ฃผ์ฐจ Phase 4 (synchronized), 10์ฃผ์ฐจ Phase 5

ํ•ต์‹ฌ ๊ฐœ๋…

์™œ ๋ฝ์ด ํ•„์š”ํ•œ๊ฐ€:

  • ๋ฉ€ํ‹ฐ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ
  • โ†’ Race Condition
  • โ†’ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์นจํ•ด

2๊ฐ€์ง€ ๋ฝ ์ข…๋ฅ˜ โญ :

๊ณต์œ  ๋ฝ (Shared Lock, S Lock):

"์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ฝ๊ธฐ OK, ์“ฐ๊ธฐ๋Š” ์ฐจ๋‹จ"

  • ์ฝ๊ธฐ-์ฝ๊ธฐ ํ˜ธํ™˜
  • ์ฝ๊ธฐ-์“ฐ๊ธฐ ์ถฉ๋Œ
  • ์˜ˆ: SELECT ... LOCK IN SHARE MODE

๋ฒ ํƒ€ ๋ฝ (Exclusive Lock, X Lock):

"ํ•œ ํŠธ๋žœ์žญ์…˜๋งŒ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ์ฝ๊ธฐ์กฐ์ฐจ ์ฐจ๋‹จ"

  • ๋ชจ๋“  ์ž‘์—…๊ณผ ์ถฉ๋Œ
  • ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋ฝ
  • ์˜ˆ: SELECT ... FOR UPDATE

ํ˜ธํ™˜์„ฑ ๋งคํŠธ๋ฆญ์Šค:

S Lock ์š”์ฒญX Lock ์š”์ฒญ
S Lock ๋ณด์œ  ์ค‘โœ… ํ˜ธํ™˜โŒ ๋Œ€๊ธฐ
X Lock ๋ณด์œ  ์ค‘โŒ ๋Œ€๊ธฐโŒ ๋Œ€๊ธฐ

JPA์—์„œ์˜ ํ™œ์šฉ (์ฐธ๊ณ ):

@Lock(LockModeType.PESSIMISTIC_READ)  // S Lock
@Lock(LockModeType.PESSIMISTIC_WRITE) // X Lock

๊ฒฉ๋ฆฌ ์ˆ˜์ค€๊ณผ์˜ ๊ด€๊ณ„ (10์ฃผ์ฐจ Phase 5):

  • READ COMMITTED: ์งง์€ S Lock
  • REPEATABLE READ: ๊ธด S Lock ๋˜๋Š” MVCC
  • SERIALIZABLE: ๋งค์šฐ ์—„๊ฒฉํ•œ ๋ฝ

ILIC ์‹œ๋‚˜๋ฆฌ์˜ค:

  • ์šด์ž„ ๊ฒฌ์  ๋™์‹œ ์ˆ˜์ • ๋ฐฉ์ง€ โ†’ X Lock
  • ํ†ต๊ณ„ ๋ณด๊ณ  ์ค‘ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋ฐฉ์ง€ โ†’ S Lock

์ž๊ธฐ ์ ๊ฒ€

  • ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋Š”? (ํžŒํŠธ: ๋‘ ํŠธ๋žœ์žญ์…˜์ด ์„œ๋กœ์˜ ๋ฝ ๋Œ€๊ธฐ)
  • ๋น„๊ด€์  ๋ฝ vs ๋‚™๊ด€์  ๋ฝ์˜ ์ฐจ์ด๋Š”? (ํžŒํŠธ: ๋ฝ ์‹œ์ )

โšก Part B โ€” SQL ์„ฑ๋Šฅ ์ตœ์ ํ™”

๐Ÿ“š Phase 7 โ€” ์˜ตํ‹ฐ๋งˆ์ด์ €

๋ชฉํ‘œ: SQL์ด ์–ด๋–ป๊ฒŒ ์‹คํ–‰ ๊ณ„ํš์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š”์ง€ โ€” DB์˜ ๋‘๋‡Œ๋ฅผ ์ดํ•ดํ•œ๋‹ค.

Unit 7.1 โ€” ์˜ตํ‹ฐ๋งˆ์ด์ € ๊ฐœ๋… + RBO vs CBO

์„ ์ˆ˜ ์ง€์‹: Unit 5.1

ํ•ต์‹ฌ ์ •์˜

์˜ตํ‹ฐ๋งˆ์ด์ €(Optimizer):

"SQL์˜ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•˜๋Š” DBMS์˜ ํ•ต์‹ฌ ์—”์ง„"

๋น„์œ :

"CPU๊ฐ€ ์ปดํ“จํ„ฐ์˜ ๋‘๋‡Œ๋ผ๋ฉด, ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” DB์˜ ๋‘๋‡Œ"

๋™์ž‘ ํ๋ฆ„:
1. ๊ฐœ๋ฐœ์ž๊ฐ€ SQL ์ž‘์„ฑ
2. ์˜ตํ‹ฐ๋งˆ์ด์ €: "์ด ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ• ๊นŒ?"
3. ์—ฌ๋Ÿฌ ์‹คํ–‰ ๊ณ„ํš ์ƒ์„ฑ
4. ๊ฐ ๊ณ„ํš์˜ ๋น„์šฉ ์‚ฐ์ •
5. ์ตœ์ € ๋น„์šฉ ๊ณ„ํš ์„ ํƒ
6. SQL ์—”์ง„์ด ์‹ค์ œ ์‹คํ–‰


2๊ฐ€์ง€ ์˜ตํ‹ฐ๋งˆ์ด์ € ์ข…๋ฅ˜:

RBO (Rule-Based Optimizer) โ€” ๊ทœ์น™ ๊ธฐ๋ฐ˜:

  • ์‚ฌ์ „ ์ •์˜๋œ ๊ทœ์น™์˜ ์šฐ์„ ์ˆœ์œ„๋กœ ๊ฒฐ์ •
  • ํ†ต๊ณ„ ์ •๋ณด ์‚ฌ์šฉ ์•ˆ ํ•จ
  • Oracle 8 ์ด์ „ ๊ธฐ๋ณธ
  • ์žฅ์ : ๊ฒฐ๊ณผ ์˜ˆ์ธก ์‰ฌ์›€
  • ๋‹จ์ : ๋ฐ์ดํ„ฐ ๋ถ„ํฌ ๋ฌด์‹œ โ†’ ๋น„ํšจ์œจ ๊ฐ€๋Šฅ

CBO (Cost-Based Optimizer) โ€” ๋น„์šฉ ๊ธฐ๋ฐ˜ โญ :

  • ํ…Œ์ด๋ธ”/์ธ๋ฑ์Šค/์ปฌ๋Ÿผ ํ†ต๊ณ„ ํ™œ์šฉ
  • ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด ์ตœ์ € ์„ ํƒ
  • ํ˜„๋Œ€ DBMS์˜ ํ‘œ์ค€ (MySQL, PostgreSQL, Oracle)
  • ์žฅ์ : ๋ฐ์ดํ„ฐ ๋ถ„ํฌ ๊ณ ๋ ค
  • ๋‹จ์ : ํ†ต๊ณ„ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋˜๋ฉด ์ž˜๋ชป๋œ ์„ ํƒ

์ž๊ธฐ ์ ๊ฒ€

  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํ•ญ์ƒ ์ตœ์ ์„ ์„ ํƒํ•˜๋Š”๊ฐ€? (ํžŒํŠธ: NO โ€” ํ†ต๊ณ„ ๋ถ€์ •ํ™• ์‹œ)
  • RBO์—์„œ ์ธ๋ฑ์Šค๋ฅผ ๊ฑฐ๋Š” ๋™๊ธฐ๋Š”? (ํžŒํŠธ: ์šฐ์„ ์ˆœ์œ„์— ์ธ๋ฑ์Šค ์‚ฌ์šฉ์ด ๋†’์Œ)

Unit 7.2 โ€” ์˜ตํ‹ฐ๋งˆ์ด์ € ๋™์ž‘ 6๋‹จ๊ณ„ + ํ†ต๊ณ„์ •๋ณด

์„ ์ˆ˜ ์ง€์‹: Unit 7.1

ํ•ต์‹ฌ 6๋‹จ๊ณ„ โญ :

[SQL ์ž…๋ ฅ]
    โ†“
1. Parser           โ€” SQL ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ + ํŒŒ์‹ฑ ํŠธ๋ฆฌ ์ƒ์„ฑ
    โ†“
2. Query Transformer โ€” ์„œ๋ธŒ์ฟผ๋ฆฌ โ†’ JOIN, ๋ถˆํ•„์š” ์กฐ๊ฑด ์ œ๊ฑฐ
    โ†“
3. Estimator        โ€” ์‹คํ–‰ ๋น„์šฉ ๊ณ„์‚ฐ (ํ†ต๊ณ„ ๊ธฐ๋ฐ˜)
    โ†“
4. Plan Generator   โ€” ์‹คํ–‰ ๊ณ„ํš ํ›„๋ณด ์ƒ์„ฑ + ์ตœ์  ์„ ํƒ
    โ†“
5. Row-Source Generator โ€” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜
    โ†“
6. SQL Engine       โ€” ์‹ค์ œ ์‹คํ–‰
    โ†“
[๊ฒฐ๊ณผ ๋ฐ˜ํ™˜]

Step 2 ์˜ˆ์‹œ โ€” ์ฟผ๋ฆฌ ๋ณ€ํ™˜:

-- ์ž…๋ ฅ
SELECT name FROM employees 
WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'Seoul');

-- ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๋ณ€ํ™˜
SELECT e.name FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.location = 'Seoul';

Step 3 โ€” Estimator์˜ ๊ณ ๋ ค ์š”์†Œ:
1. ์ธ๋ฑ์Šค ์กด์žฌ ์—ฌ๋ถ€
2. ํ…Œ์ด๋ธ” ํฌ๊ธฐ
3. ์กฐ์ธ ๋ฐฉ์‹ (Nested Loop, Hash Join, Merge Join)
4. ์ •๋ ฌ ๋น„์šฉ


ํ†ต๊ณ„ ์ •๋ณด(Statistics):

  • ์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ํ•ต์‹ฌ ์ž…๋ ฅ
  • ์˜ˆ: ํ…Œ์ด๋ธ” ํ–‰ ์ˆ˜, ์ปฌ๋Ÿผ ๋ถ„ํฌ, ์ธ๋ฑ์Šค ์นด๋””๋„๋ฆฌํ‹ฐ

๊ฐฑ์‹  ๋ฐฉ๋ฒ•:
1. ์ž๋™ ๊ฐฑ์‹ : DBMS ์Šค์ผ€์ค„๋Ÿฌ
2. ์ˆ˜๋™ ๊ฐฑ์‹ : ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ํ›„ ์ฆ‰์‹œ

ANALYZE TABLE employees;

ํ†ต๊ณ„๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒฝ์šฐ:

  • ์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ์ž˜๋ชป๋œ ์„ ํƒ
  • ์ธ๋ฑ์Šค ๋ฌด์‹œ, Full Scan ๋“ฑ
  • โ†’ ์ˆ˜๋™ ANALYZE ๋ช…๋ น ํ•„์š”

์ž๊ธฐ ์ ๊ฒ€

  • ILIC๊ฐ€ 1์–ต ๊ฑด INSERT ํ›„ ์‹คํ–‰ ๊ณ„ํš์ด ์ด์ƒํ•˜๋‹ค๋ฉด? (ํžŒํŠธ: ANALYZE TABLE)
  • ์ธ๋ฑ์Šค ํ†ต๊ณ„๊ฐ€ ์ž˜๋ชป๋˜๋ฉด ์–ด๋–ค ์‚ฌ๊ณ ? (ํžŒํŠธ: ์ข‹์€ ์ธ๋ฑ์Šค ๋‘๊ณ  Full Scan)

Unit 7.3 โ€” ์˜ตํ‹ฐ๋งˆ์ด์ € ํžŒํŠธ + ์˜ตํ‹ฐ๋งˆ์ด์ € ๋ชจ๋“œ

์„ ์ˆ˜ ์ง€์‹: Unit 7.2

์˜ตํ‹ฐ๋งˆ์ด์ € ํžŒํŠธ:

"SQL ์•ˆ์— ์ฃผ์„ ํ˜•ํƒœ๋กœ ์˜ตํ‹ฐ๋งˆ์ด์ € ๋™์ž‘ ๊ฐ•์ œ"

๋ฌธ๋ฒ• (Oracle/MySQL ์ฐจ์ด ์žˆ์Œ):

SELECT /*+ HINT_NAME(table_name) */ * FROM table_name;

์ฃผ์š” ํžŒํŠธ โญ :

ํžŒํŠธ์˜๋ฏธ
/*+ FULL(t) */Full Table Scan ๊ฐ•์ œ
/*+ INDEX(t idx) */ํŠน์ • ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๊ฐ•์ œ
/*+ ORDERED */FROM ์ ˆ ์ˆœ์„œ๋Œ€๋กœ ์กฐ์ธ
/*+ USE_HASH(t) */Hash Join ์‚ฌ์šฉ
/*+ PARALLEL(t, 4) */๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

์˜ˆ์‹œ:

SELECT /*+ INDEX(emp idx_emp_name) */ *
FROM employees emp
WHERE name = 'John';

์˜ตํ‹ฐ๋งˆ์ด์ € ๋ชจ๋“œ:

"์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ๊ธฐ๋ณธ ์ •์ฑ… ์„ค์ • โ€” ์ „์ฒด ๋˜๋Š” ์„ธ์…˜ ๋‹จ์œ„"

๋ชจ๋“œ ์ข…๋ฅ˜:

๋ชจ๋“œ์˜๋ฏธ
CHOOSEํ†ต๊ณ„ ์žˆ์œผ๋ฉด CBO, ์—†์œผ๋ฉด RBO (๊ตฌ์‹)
FIRST_ROWS์ฒซ ๊ฒฐ๊ณผ ๋น ๋ฅด๊ฒŒ (์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ UI)
FIRST_ROWS(n)์ฒ˜์Œ n๊ฐœ ํ–‰ ๋น ๋ฅด๊ฒŒ
ALL_ROWS์ „์ฒด ๊ฒฐ๊ณผ ๋น ๋ฅด๊ฒŒ (๋ฐฐ์น˜ ์ฒ˜๋ฆฌ, Oracle 10g+ ๊ธฐ๋ณธ)

ํžŒํŠธ vs ๋ชจ๋“œ:

  • ํžŒํŠธ: ํŠน์ • SQL ๋‚ด์—์„œ
  • ๋ชจ๋“œ: ์„ธ์…˜/์‹œ์Šคํ…œ ์ „์ฒด

ILIC ์ ์šฉ ๊ฐ€๋Šฅ:

  • ์šด์ž„ ๊ฒ€์ƒ‰ ์ฒซ ํŽ˜์ด์ง€: FIRST_ROWS
  • ์ผ๋ณ„ ํ†ต๊ณ„ ๋ฐฐ์น˜: ALL_ROWS
  • ํŠน์ • ์ฟผ๋ฆฌ๋งŒ ์ธ๋ฑ์Šค ๊ฐ•์ œ: ํžŒํŠธ

์ž๊ธฐ ์ ๊ฒ€

  • ์˜ตํ‹ฐ๋งˆ์ด์ € ํžŒํŠธ๋ฅผ ๋‚จ์šฉํ•˜๋ฉด ์–ด๋–ค ๋ฌธ์ œ? (ํžŒํŠธ: ๋ฐ์ดํ„ฐ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ๋น„ํšจ์œจ)
  • ILIC ์šด์ž„ ๋ชฉ๋ก ํŽ˜์ด์ง•์— ์–ด๋–ค ๋ชจ๋“œ๊ฐ€ ์ ํ•ฉ? (ํžŒํŠธ: FIRST_ROWS)

๐Ÿ“š Phase 8 โ€” ์ธ๋ฑ์Šค ๊ธฐ์ดˆ (โ˜… ์ •์ )

๋ชฉํ‘œ: DB ์„ฑ๋Šฅ์˜ ํ•ต์‹ฌ์ธ ์ธ๋ฑ์Šค๋ฅผ ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•๋ถ€ํ„ฐ B-tree ๊ตฌ์กฐ๊นŒ์ง€ ๊นŠ์ด ์ดํ•ดํ•œ๋‹ค.

Unit 8.1 โ€” ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•๊ณผ logN

์„ ์ˆ˜ ์ง€์‹: ์ž๋ฃŒ๊ตฌ์กฐ ์ผ๋ฐ˜ ์ง€์‹

ํ•ต์‹ฌ ๊ฐœ๋…

๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•:

"์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ โ€” ์ž…๋ ฅ ํฌ๊ธฐ N์— ๋”ฐ๋ฅธ ์—ฐ์‚ฐ ํšŸ์ˆ˜"

์ฃผ์š” ๋ณต์žก๋„:

ํ‘œ๊ธฐ์˜๋ฏธ์˜ˆ
O(1)์ƒ์ˆ˜ โ€” ์ž…๋ ฅ ๋ฌด๊ด€HashMap.get()
O(logN)๋กœ๊ทธ โ€” ์ ˆ๋ฐ˜์”ฉ ์ค„์ž„์ด์ง„ ํƒ์ƒ‰, B-tree
O(N)์„ ํ˜• โ€” ๋น„๋ก€Full Scan
O(Nยฒ)์ œ๊ณฑ โ€” ์ค‘์ฒฉ ๋ฐ˜๋ณตNested Loop

logN์˜ ์ง๊ด€:

  • "N์„ ๋ช‡ ๋ฒˆ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์—ฌ์•ผ 1์ด ๋˜๋Š”๊ฐ€"

์ˆซ์ž ๋น„๊ต (N = 100):

  • O(N) = 100
  • O(logN) = logโ‚‚100 โ‰ˆ 6.64 (2โถ = 64, 2โท = 128)
  • โ†’ ์•ฝ 15๋ฐฐ ๋น ๋ฆ„

N = 1,000,000 (๋ฐฑ๋งŒ):

  • O(N) = 1,000,000
  • O(logN) โ‰ˆ 20
  • โ†’ 5๋งŒ ๋ฐฐ ๋น ๋ฆ„ โญ

ํ•ต์‹ฌ ํ†ต์ฐฐ:

"ํฐ N์ผ์ˆ˜๋ก logN์˜ ์œ„๋ ฅ์ด ํญ๋ฐœ์ "

โ†’ ์ธ๋ฑ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๋•Œ ๋” ํšจ๊ณผ์ ์ธ ์ด์œ .

์ž๊ธฐ ์ ๊ฒ€

  • O(NlogN)์€ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ž์ฃผ ๋“ฑ์žฅ? (ํžŒํŠธ: ์ •๋ ฌ)
  • ILIC์˜ 1๋งŒ ๊ฑด vs 100๋งŒ ๊ฑด ํ…Œ์ด๋ธ”์—์„œ ์ธ๋ฑ์Šค ํšจ๊ณผ ์ฐจ์ด๋Š”?

Unit 8.2 โ€” ์ธ๋ฑ์Šค ์ •์˜์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์„ ์ˆ˜ ์ง€์‹: Unit 8.1

ํ•ต์‹ฌ ๊ฐœ๋…

์ธ๋ฑ์Šค(Index):

"๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์„ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ โ€” ์ฑ…์˜ ๋ชฉ์ฐจ ๊ฐ™์€ ์—ญํ• "

Full Scan vs Index:

  • Full Scan: O(N) โ€” 100๋งŒ ๊ฑด์ด๋ฉด 100๋งŒ ๋ฒˆ ๋น„๊ต
  • B-tree Index: O(logN) โ€” 100๋งŒ ๊ฑด๋„ ์•ฝ 20๋ฒˆ ๋น„๊ต

์ธ๋ฑ์Šค๊ฐ€ ์—†์„ ๋•Œ:

SELECT * FROM users WHERE first_name = 'Minsoo';
-- โ†’ 100๋งŒ ํ–‰ ์ „์ฒด ๋น„๊ต (Full Scan)

์ธ๋ฑ์Šค๊ฐ€ ์žˆ์„ ๋•Œ:

CREATE INDEX idx_first_name ON users(first_name);
-- โ†’ ์ธ๋ฑ์Šค ํŠธ๋ฆฌ์—์„œ ์•ฝ 20๋ฒˆ ๋น„๊ต โ†’ ์‹ค์ œ ํ–‰ ์œ„์น˜ ํ™•์ธ

์™œ ์ธ๋ฑ์Šค๋ฅผ ์“ฐ๋Š”๊ฐ€ (2๊ฐ€์ง€ ์ด์œ ):
1. WHERE ์กฐ๊ฑด ๋น ๋ฅธ ๊ฒ€์ƒ‰
2. ์ •๋ ฌ(ORDER BY)/๊ทธ๋ฃนํ•‘(GROUP BY) ๊ฐ€์†

์ธ๋ฑ์Šค ์ƒ์„ฑ ๋ฌธ๋ฒ•:

์ผ๋ฐ˜ ์ธ๋ฑ์Šค:

CREATE INDEX player_name_idx ON player(name);
--           โ†‘ ์ธ๋ฑ์Šค ์ด๋ฆ„           โ†‘ ์ปฌ๋Ÿผ

์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค (๋ฉ€ํ‹ฐ ์ปฌ๋Ÿผ = ๋ณตํ•ฉ ์ธ๋ฑ์Šค):

CREATE UNIQUE INDEX team_id_backnumber_idx 
ON player (team_id, backnumber);

ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ:

CREATE TABLE player (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    INDEX idx_name (name)
);

Primary Key๋Š” ์ž๋™ ์ธ๋ฑ์Šค.

์ธ๋ฑ์Šค ์ •๋ณด ํ™•์ธ:

SHOW INDEX FROM player;

Seq_in_index ์ปฌ๋Ÿผ:

  • 1, 2 โ†’ ๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค์˜ ์ปฌ๋Ÿผ ์ˆœ์„œ

์ž๊ธฐ ์ ๊ฒ€

  • ILIC์˜ ์–ด๋–ค ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ• ๊นŒ? (ํžŒํŠธ: WHERE/JOIN/ORDER BY ์ž์ฃผ ์‚ฌ์šฉ)
  • ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ๊ฒ€์ƒ‰์ด 1์ดˆ โ†’ ์ธ๋ฑ์Šค ์ถ”๊ฐ€ ํ›„ ์–ด๋–ป๊ฒŒ ๋ณ€ํ• ๊นŒ?

Unit 8.3 โ€” B-tree ์ธ๋ฑ์Šค ๋™์ž‘ ๋ฐฉ์‹ โญโญโญ

์„ ์ˆ˜ ์ง€์‹: Unit 8.2

ํ•ต์‹ฌ ๊ฐœ๋…

B-tree ์ธ๋ฑ์Šค์˜ ๋ณธ์งˆ:

"์ •๋ ฌ๋œ ๋ณ„๋„ ํ…Œ์ด๋ธ” + ํฌ์ธํ„ฐ โ€” ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ O(logN)"

๊ตฌ์กฐ ์‹œ๊ฐํ™”:

[์›๋ณธ ํ…Œ์ด๋ธ”]                      [์ธ๋ฑ์Šค ํ…Œ์ด๋ธ” (์ •๋ ฌ๋จ)]
+----+----+----+                   +----+----------+
| id | a  | b  |                   | a  | pointer  |
+----+----+----+                   +----+----------+
| 1  | 5  | 80 |                   | 1  | โ†’ row 7  |
| 2  | 3  | 60 |                   | 2  | โ†’ row 9  |
| 3  | 8  | 95 |        โ†CREATEโ†’   | 3  | โ†’ row 2  |
| 4  | 1  | 30 |        INDEX(a)   | 5  | โ†’ row 1  |
| 5  | 9  | 70 |                   | 6  | โ†’ row 8  |
| 6  | 2  | 40 |                   | 8  | โ†’ row 3  |
| 7  | 1  | 20 |                   | 9  | โ†’ row 5  |
+----+----+----+                   +----+----------+

์กฐํšŒ ํ๋ฆ„ (WHERE a = 9):
1. ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์—์„œ ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ a=9 ์ฐพ๊ธฐ (O(logN))
2. ํฌ์ธํ„ฐ ๋”ฐ๋ผ ์›๋ณธ ํ…Œ์ด๋ธ” row 5 ์ ‘๊ทผ
3. โ†’ ํ•ด๋‹น ํ–‰ ๋ฐ˜ํ™˜


๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค (Multi-column Index) โญ :

CREATE INDEX idx_a_b ON table(a, b);

์ •๋ ฌ ๊ธฐ์ค€:
1. a ์ปฌ๋Ÿผ ์˜ค๋ฆ„์ฐจ์ˆœ
2. a ๊ฐ™์€ ๊ฐ’๋“ค ์•ˆ์—์„œ b ์˜ค๋ฆ„์ฐจ์ˆœ

์˜ˆ์‹œ:

a | b
--+----
1 | 20    โ† a ์ •๋ ฌ ํ›„
1 | 95
3 | 60
5 | 80
7 | 80
7 | 95   โ† ๊ฐ™์€ a=7 ์•ˆ์—์„œ b๋กœ ์ •๋ ฌ
8 | 95
9 | 70

ํšจ์œจ์  ์‚ฌ์šฉ โ€” WHERE a=7 AND b=95:
1. ์ธ๋ฑ์Šค์—์„œ a=7 ์˜์—ญ ํƒ์ƒ‰ (์ด์ง„)
2. ๊ทธ ์•ˆ์—์„œ b=95 ํƒ์ƒ‰ (์ด์ง„ โ€” ์ด๋ฏธ ์ •๋ ฌ๋จ)
3. โ†’ ์™„์ „ํžˆ ํšจ์œจ์ ! โœ…

๋น„ํšจ์œจ ์‚ฌ์šฉ โ€” WHERE b=95:

  • ์ธ๋ฑ์Šค๊ฐ€ a๋กœ ๋จผ์ € ์ •๋ ฌ๋จ
  • b๋งŒ์œผ๋กœ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋ถ„์‚ฐ๋จ
  • โ†’ Full Scan๊ณผ ๋‹ค๋ฅผ ๋ฐ” ์—†์Œ โŒ

๋น„ํšจ์œจ ์‚ฌ์šฉ โ€” WHERE a=7 OR c=400:

  • a ์ธ๋ฑ์Šค ํ™œ์šฉ OK
  • c๋Š” ์ธ๋ฑ์Šค ์—†์Œ
  • โ†’ c ๋ถ€๋ถ„์—์„œ Full Scan โŒ

ํ•ต์‹ฌ ์›์น™ โญ :

"์™ผ์ชฝ ์ปฌ๋Ÿผ ์šฐ์„  โ€” ๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค๋Š” ์™ผ์ชฝ๋ถ€ํ„ฐ ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ์ฟผ๋ฆฌ์—๋งŒ ํšจ๊ณผ"

ILIC ์ ์šฉ:

  • WHERE booking_date AND status ์ž์ฃผ โ†’ INDEX(booking_date, status)
  • ๊ทธ๋Ÿฌ๋‚˜ WHERE status ๋งŒ ์ž์ฃผ โ†’ INDEX(status) ๋ณ„๋„ ํ•„์š”

์ž๊ธฐ ์ ๊ฒ€

  • (a, b) ์ธ๋ฑ์Šค๋กœ WHERE a > 5 ๋Š” ํšจ๊ณผ์ ์ธ๊ฐ€? (ํžŒํŠธ: YES)
  • (a, b) ์ธ๋ฑ์Šค๋กœ WHERE a > 5 AND b = 80 ๋Š”? (ํžŒํŠธ: a๊นŒ์ง€๋งŒ โ€” b๋Š” ์ •๋ ฌ ์•ˆ ๋จ)
  • ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋‚ฎ์€ ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๊ฐ€ ๋ฌด์˜๋ฏธํ•œ ์ด์œ ๋Š”? (ํžŒํŠธ: ๋ถ„๊ธฐ์ ์ด ์ ์Œ)

๐Ÿ“š Phase 9 โ€” ๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค์™€ EXPLAIN

๋ชฉํ‘œ: ์‹คํ–‰ ๊ณ„ํš์„ ์ง์ ‘ ๋ถ„์„ํ•˜๊ณ  ์ธ๋ฑ์Šค ์„ ํƒ์„ ์ œ์–ดํ•œ๋‹ค.

Unit 9.1 โ€” ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค ์ค‘ ์–ด๋–ค ๊ฒƒ์ด ์‚ฌ์šฉ๋˜๋Š”๊ฐ€

์„ ์ˆ˜ ์ง€์‹: Phase 8

ํ•ต์‹ฌ ์‹œ๋‚˜๋ฆฌ์˜ค

ILIC player ํ…Œ์ด๋ธ”์— ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค ์กด์žฌ:

  • (id) โ€” Primary Key ์ž๋™
  • (name)
  • (team_id, backnumber)
  • (backnumber)

์ฟผ๋ฆฌ:

SELECT * FROM player WHERE backnumber = 7;

์˜๋ฌธ:

  • (team_id, backnumber) ์™€ (backnumber) ์ค‘ ์–ด๋–ค ์ธ๋ฑ์Šค ์‚ฌ์šฉ?

๋‹ต: ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๊ฒฐ์ • โญ

์ผ๋ฐ˜์  ์„ ํƒ:

  • ๋‹จ๋… ์ปฌ๋Ÿผ ๊ฒ€์ƒ‰ โ†’ ๋‹จ์ผ ์ธ๋ฑ์Šค (backnumber) ์„ ํ˜ธ
  • ๊ทธ๋Ÿฌ๋‚˜ ํ†ต๊ณ„์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜๋„

ํ™•์ธ ๋ฐฉ๋ฒ•:

EXPLAIN SELECT * FROM player WHERE backnumber = 7;

โ†’ key ์ปฌ๋Ÿผ์— ์‚ฌ์šฉ๋œ ์ธ๋ฑ์Šค ํ‘œ์‹œ

์ž๊ธฐ ์ ๊ฒ€

  • ๊ฐ™์€ ์ปฌ๋Ÿผ์— ๋‘ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒŒ ์ข‹์€ ์„ค๊ณ„์ธ๊ฐ€? (ํžŒํŠธ: ๋ณดํ†ต NO โ€” ์ค‘๋ณต)
  • (team_id, backnumber) ๊ฐ€ ์žˆ๋Š”๋ฐ (backnumber) ๊ฐ€ ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ์ด์œ ๋Š”?

Unit 9.2 โ€” EXPLAIN์œผ๋กœ ์‹คํ–‰ ๊ณ„ํš ๋ถ„์„ โญ

์„ ์ˆ˜ ์ง€์‹: Unit 9.1

ํ•ต์‹ฌ ๊ฐœ๋…

EXPLAIN:

"SQL์˜ ์‹คํ–‰ ๊ณ„ํš์„ ๋ฏธ๋ฆฌ ๋ณด์—ฌ์ฃผ๋Š” ๋ช…๋ น"

MySQL ์ถœ๋ ฅ ์ฃผ์š” ์ปฌ๋Ÿผ:

์ปฌ๋Ÿผ์˜๋ฏธ
idSELECT ์‹คํ–‰ ์ˆœ์„œ
select_typeSIMPLE, SUBQUERY, UNION ๋“ฑ
table๋Œ€์ƒ ํ…Œ์ด๋ธ”
type์ ‘๊ทผ ๋ฐฉ์‹ (๊ฐ€์žฅ ์ค‘์š”!)
possible_keys์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค๋“ค
key์‹ค์ œ ์‚ฌ์šฉ๋œ ์ธ๋ฑ์Šค
key_len์ธ๋ฑ์Šค ์‚ฌ์šฉ ๊ธธ์ด
ref๋น„๊ต ๋Œ€์ƒ
rows๊ฒ€์‚ฌ ์˜ˆ์ƒ ํ–‰ ์ˆ˜
Extra์ถ”๊ฐ€ ์ •๋ณด (Using index, filesort ๋“ฑ)

type ์ปฌ๋Ÿผ โ€” ๊ฐ€์žฅ ์ค‘์š” โญ :

์ข‹์€ ์ˆœ โ†’ ๋‚˜์œ ์ˆœ:

type์˜๋ฏธํ‰๊ฐ€
constPK/UNIQUE๋กœ 1ํ–‰โญโญโญ
eq_refUNIQUE JOINโญโญโญ
ref์ธ๋ฑ์Šค ๋น„์œ ๋‹ˆํฌ ์ผ์น˜โญโญ
range์ธ๋ฑ์Šค ๋ฒ”์œ„ ๊ฒ€์ƒ‰โญโญ
index์ธ๋ฑ์Šค ํ’€ ์Šค์บ”โญ
ALLํ…Œ์ด๋ธ” ํ’€ ์Šค์บ” โŒ์œ„ํ—˜

Extra ์ปฌ๋Ÿผ ์ฃผ์š” ๊ฐ’:

  • Using index โ€” Covering Index (Phase 10)
  • Using where โ€” WHERE ์กฐ๊ฑด ์ ์šฉ
  • Using filesort โ€” ๋ณ„๋„ ์ •๋ ฌ (์„ฑ๋Šฅ โ†“)
  • Using temporary โ€” ์ž„์‹œ ํ…Œ์ด๋ธ” (์„ฑ๋Šฅ โ†“)

ILIC ํ™œ์šฉ:

EXPLAIN SELECT * FROM bookings WHERE customer_id = ?;
-- type = ref โ†’ ์ธ๋ฑ์Šค ์‚ฌ์šฉ โœ…
-- type = ALL โ†’ Full Scan โŒ โ†’ ์ธ๋ฑ์Šค ์ถ”๊ฐ€ ๊ฒ€ํ† 

์ž๊ธฐ ์ ๊ฒ€

  • Using filesort๊ฐ€ ๋ณด์ด๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ? (ํžŒํŠธ: ORDER BY ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค)
  • type = ALL ์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์–ด ๋น ๋ฅธ ๊ฒฝ์šฐ๋Š”? (ํžŒํŠธ: ์นด๋””๋„๋ฆฌํ‹ฐ ๋‚ฎ์Œ)

Unit 9.3 โ€” ์ธ๋ฑ์Šค ํžŒํŠธ (USE/FORCE/IGNORE)

์„ ์ˆ˜ ์ง€์‹: Unit 9.2, 7.3

ํ•ต์‹ฌ ๊ฐœ๋…

์™œ ์ธ๋ฑ์Šค ํžŒํŠธ?:

  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค ์„ ํƒ ์‹œ
  • ํ†ต๊ณ„ ์ •๋ณด๊ฐ€ ๋ถ€์ •ํ™•ํ•  ๋•Œ
  • ํŠน์ • ์ฟผ๋ฆฌ๋งŒ ๊ฐ•์ œํ•  ๋•Œ

3๊ฐ€์ง€ ํžŒํŠธ โญ :

1. USE INDEX โ€” ์‚ฌ์šฉ ์œ ๋„ (๋А์Šจ):

SELECT * FROM player USE INDEX (backnumber_idx) 
WHERE backnumber = 7;
  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์šฐ์„  ๊ฒ€ํ† ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ X

2. FORCE INDEX โ€” ๊ฐ•์ œ ์‚ฌ์šฉ (๊ฐ•ํ•จ) โญ :

SELECT * FROM player FORCE INDEX (backnumber_idx) 
WHERE backnumber = 7;
  • ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ
  • USE INDEX๋ณด๋‹ค ๊ฐ•ํ•œ ์ œ์•ฝ

3. IGNORE INDEX โ€” ๋ฌด์‹œ ๊ฐ•์ œ:

SELECT * FROM employees IGNORE INDEX (idx_emp_name) 
WHERE name = 'John';
  • ํ•ด๋‹น ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์•ˆ ํ•จ
  • ๋‹ค๋ฅธ ์ธ๋ฑ์Šค ๋˜๋Š” Full Scan

์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€:

  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค ์„ ํƒ (๋“œ๋ฌผ์ง€๋งŒ)
  • ํ†ต๊ณ„ ์ •๋ณด ๊ฐฑ์‹  ์งํ›„ ๊ฒ€์ฆ
  • A/B ํ…Œ์ŠคํŠธ๋กœ ์„ฑ๋Šฅ ๋น„๊ต

โš ๏ธ ๋‚จ์šฉ ์ฃผ์˜:

  • ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๊ฐ€ ๋ณ€ํ•˜๋ฉด ์ž˜๋ชป๋œ ๊ฐ•์ œ โ†’ ์„ฑ๋Šฅ โ†“
  • ์šฐ์„  ANALYZE TABLE ๋กœ ํ†ต๊ณ„ ๊ฐฑ์‹  ์‹œ๋„

์˜ตํ‹ฐ๋งˆ์ด์ € ํžŒํŠธ vs ์ธ๋ฑ์Šค ํžŒํŠธ (๋น„๊ต):

์˜ตํ‹ฐ๋งˆ์ด์ € ํžŒํŠธ์ธ๋ฑ์Šค ํžŒํŠธ
๋ฒ”์œ„์‹คํ–‰ ๊ณ„ํš ์ „์ฒด์ธ๋ฑ์Šค ์‚ฌ์šฉ๋งŒ
์˜ˆ/*+ ORDERED */FORCE INDEX (...)
๊ฐ•์ œ๋ ฅ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๋ฌด์‹œ ๊ฐ€๋ŠฅFORCE๋Š” ๊ฐ•์ œ
ํ‘œ๊ธฐ์ฃผ์„ (/*+ ... */)ํ‚ค์›Œ๋“œ (USE/FORCE/IGNORE)

ILIC ํ™œ์šฉ:

  • ์šด์ž„ ๊ฒ€์ƒ‰ ํ†ต๊ณ„๊ฐ€ ์–ด์ฉŒ๋‹ค ์ž˜๋ชป๋˜์–ด๋„ ์ •์ƒ ์šด์˜ ๋ณด์žฅ โ†’ ํ•ต์‹ฌ ์ฟผ๋ฆฌ์— FORCE INDEX

์ž๊ธฐ ์ ๊ฒ€

  • ์ธ๋ฑ์Šค ํžŒํŠธ๊ฐ€ ํ‘œ์ค€ SQL์ธ๊ฐ€? (ํžŒํŠธ: NO โ€” DBMS๋งˆ๋‹ค ๋‹ค๋ฆ„)
  • ์ธ๋ฑ์Šค ํžŒํŠธ๋ฅผ ์šด์˜ ์ฝ”๋“œ์— ๋‘˜ ๋•Œ ์œ„ํ—˜์€? (ํžŒํŠธ: ๋ฐ์ดํ„ฐ ๋ณ€ํ™” ์ถ”์  ์–ด๋ ค์›€)

๐Ÿ“š Phase 10 โ€” ์ธ๋ฑ์Šค ์ตœ์ ํ™” ์ „๋žต

๋ชฉํ‘œ: ์‹ค๋ฌด ์ธ๋ฑ์Šค ์„ค๊ณ„์˜ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค โ€” ๋ฌด์—‡์„ ํ• ๊นŒ, ๋ฌด์—‡์„ ํ”ผํ• ๊นŒ.

Unit 10.1 โ€” Covering Index โญ

์„ ์ˆ˜ ์ง€์‹: Phase 9

ํ•ต์‹ฌ ๊ฐœ๋…

Covering Index:

"์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์ธ๋ฑ์Šค๊ฐ€ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ"

์˜ˆ์‹œ:

์ธ๋ฑ์Šค: (team_id, backnumber)

SELECT team_id, backnumber FROM player WHERE team_id = 1;

โ†’ ์กฐํšŒ ์ปฌ๋Ÿผ(team_id, backnumber) ๋ชจ๋‘ ์ธ๋ฑ์Šค์— ํฌํ•จ
โ†’ ์‹ค์ œ ํ…Œ์ด๋ธ” ์ ‘๊ทผ ๋ถˆํ•„์š” โญ
โ†’ ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ = Covering Index

์žฅ์ :

  • ๋””์Šคํฌ I/O ์ ˆ๊ฐ (ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ์•ˆ ์ฝ์Œ)
  • ๋งค์šฐ ๋น ๋ฅธ ์กฐํšŒ

EXPLAIN ๊ฒฐ๊ณผ:

  • Extra ์ปฌ๋Ÿผ์— Using index ํ‘œ์‹œ

Non-Covering ์‚ฌ๋ก€:

SELECT * FROM player WHERE team_id = 1;
-- '*' = ๋ชจ๋“  ์ปฌ๋Ÿผ โ†’ ์ธ๋ฑ์Šค ์™ธ ์ปฌ๋Ÿผ๋„ ํ•„์š” โ†’ ํ…Œ์ด๋ธ” ์ ‘๊ทผ

Covering ๋งŒ๋“ค๊ธฐ โ€” ์ธ๋ฑ์Šค ํ™•์žฅ:

-- ์ž์ฃผ SELECT name๋„ ํ•œ๋‹ค๋ฉด
CREATE INDEX idx_team_back_name ON player(team_id, backnumber, name);

ILIC ํ™œ์šฉ:

  • ์šด์ž„ ๋ชฉ๋ก ํŽ˜์ด์ง€: (status, created_date, fare_id) ์ธ๋ฑ์Šค
  • ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ์ปฌ๋Ÿผ๋“ค์„ ํ•จ๊ป˜ ๋ฌถ๊ธฐ

โš ๏ธ ์ฃผ์˜:

  • ์ธ๋ฑ์Šค๊ฐ€ ๋„ˆ๋ฌด ๊ธธ๋ฉด ์ €์žฅ/์œ ์ง€ ๋น„์šฉ โ†‘
  • ์ ์ ˆํ•œ ๊ท ํ˜• ํ•„์š”

์ž๊ธฐ ์ ๊ฒ€

  • SELECT * ๊ฐ€ Covering Index๋ฅผ ๊นจ๋Š” ์ด์œ ๋Š”?
  • ILIC์˜ ์–ด๋–ค ๋นˆ๋ฒˆ ์ฟผ๋ฆฌ๋ฅผ Covering Index๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

Unit 10.2 โ€” ์ธ๋ฑ์Šค vs Full Scan ์„ ํƒ + ์ฃผ์˜์‚ฌํ•ญ

์„ ์ˆ˜ ์ง€์‹: Unit 10.1

ํ•ต์‹ฌ ๊ฐœ๋…

Full Scan์ด ๋” ์ข‹์€ ๊ฒฝ์šฐ:

  1. ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์€ ํ…Œ์ด๋ธ” (๋ช‡์‹ญ~๋ช‡๋ฐฑ ๊ฑด)

    • ์ธ๋ฑ์Šค ํŠธ๋ฆฌ ํƒ์ƒ‰ + ํ…Œ์ด๋ธ” ์ ‘๊ทผ ๋น„์šฉ
    • vs ์ง์ ‘ ๋ชจ๋“  ํ–‰ ์ฝ๊ธฐ
    • โ†’ ์ฐจ์ด ๋ฏธ๋ฏธ
  2. ์กฐํšŒ ๋ฐ์ดํ„ฐ๊ฐ€ ํ…Œ์ด๋ธ”์˜ ํฐ ๋น„์œจ (์˜ˆ: 30% ์ด์ƒ)

    • ์–ด์ฐจํ”ผ ๋Œ€๋ถ€๋ถ„ ํ–‰ ์ ‘๊ทผ
    • ์ธ๋ฑ์Šค๋กœ ์šฐํšŒํ•˜๋ฉด ์ด์ค‘ ๋น„์šฉ
    • โ†’ Full Scan์ด ๋น ๋ฆ„
  3. ์นด๋””๋„๋ฆฌํ‹ฐ ๋งค์šฐ ๋‚ฎ์Œ

    • ์˜ˆ: status ์ปฌ๋Ÿผ (active/inactive 2๊ฐœ ๊ฐ’)
    • ์ธ๋ฑ์Šค ๋ถ„๊ธฐ ํšจ๊ณผ ๊ฑฐ์˜ ์—†์Œ

์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ํŒ๋‹จ:

  • ํ†ต๊ณ„ ์ •๋ณด ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ๊ฒฐ์ •
  • 30% ์ด์ƒ โ†’ Full Scan ์„ ํ˜ธ (๋Œ€๋žต)

์ธ๋ฑ์Šค์˜ ๋น„์šฉ โญ :

1. WRITE ์‹œ ๋ชจ๋“  ์ธ๋ฑ์Šค ๊ฐฑ์‹ :

  • INSERT/UPDATE/DELETE ์‹œ ์ธ๋ฑ์Šค๋„ ๊ฐฑ์‹ 
  • ์ธ๋ฑ์Šค N๊ฐœ = N๋ฒˆ ๊ฐฑ์‹ 
  • โ†’ ๋ถˆํ•„์š”ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์œผ๋ฉด ์“ฐ๊ธฐ ์„ฑ๋Šฅ ์ €ํ•˜

2. ์ถ”๊ฐ€ ์ €์žฅ ๊ณต๊ฐ„:

  • ์ธ๋ฑ์Šค = ๋ณ„๋„ ํ…Œ์ด๋ธ”
  • ๋ฐ์ดํ„ฐ์˜ 10~30% ์ถ”๊ฐ€ ๊ณต๊ฐ„

3. ์ธ๋ฑ์Šค ์ •๋ ฌ ๋น„์šฉ:

  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ ํŠธ๋ฆฌ ์žฌ์ •๋ ฌ
  • B-tree ๊ท ํ˜• ์œ ์ง€ ๋น„์šฉ

์›์น™ โญ :

"ํ•„์š”ํ•œ ๋งŒํผ๋งŒ, ์ตœ์†Œํ•œ์˜ ์ธ๋ฑ์Šค"

์ค‘๋ณต ์ธ๋ฑ์Šค ํ”ผํ•˜๊ธฐ:

  • (team_id, backnumber) ์žˆ์œผ๋ฉด (team_id) ๋ถˆํ•„์š”
  • ๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ์ด ๋‹จ์ผ ์ปฌ๋Ÿผ์„ ํฌํ•จ

๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ” ์ธ๋ฑ์Šค ์ถ”๊ฐ€ ์ฃผ์˜ โญ :

  • ์ˆ˜๋ฐฑ๋งŒ ๊ฑด ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค ์ถ”๊ฐ€ ์‹œ ์ˆ˜ ๋ถ„ ~ ์ˆ˜ ์‹œ๊ฐ„
  • ๊ทธ๋™์•ˆ DB ์„ฑ๋Šฅ ์ €ํ•˜
  • โ†’ ํŠธ๋ž˜ํ”ฝ ์ ์€ ์‹œ๊ฐ„ ์— ์ ์šฉ
  • โ†’ ์˜จ๋ผ์ธ DDL ์‚ฌ์šฉ (ALGORITHM=INPLACE MySQL 5.6+)

ILIC ์‹œ๋‚˜๋ฆฌ์˜ค:

  • ์šด์˜ ์ค‘ ์ธ๋ฑ์Šค ์ถ”๊ฐ€ โ†’ ์ƒˆ๋ฒฝ ์‹œ๊ฐ„
  • ๋˜๋Š” Replica์—์„œ ๋จผ์ € ์ถ”๊ฐ€ ํ›„ Master ๊ต์ฒด (๋กค๋ง)

์ž๊ธฐ ์ ๊ฒ€

  • ILIC์˜ ์ผ๋ณ„ ํ†ต๊ณ„ ํ…Œ์ด๋ธ”์— ๋ชจ๋“  ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ๊ฑฐ๋Š” ๊ฒŒ ์ข‹์€๊ฐ€? (ํžŒํŠธ: NO โ€” ์“ฐ๊ธฐ ๋น„์šฉ)
  • ์ธ๋ฑ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€? (ํžŒํŠธ: ์ƒˆ๋ฒฝ + ALGORITHM=INPLACE)

Unit 10.3 โ€” ์˜ตํ‹ฐ๋งˆ์ด์ € ํžŒํŠธ vs ์ธ๋ฑ์Šค ํžŒํŠธ ์ •๋ฆฌ

์„ ์ˆ˜ ์ง€์‹: Phase 9, 10

์ตœ์ข… ๋น„๊ต ๋งคํŠธ๋ฆญ์Šค โญ :

์ธก๋ฉด์˜ตํ‹ฐ๋งˆ์ด์ € ํžŒํŠธ์ธ๋ฑ์Šค ํžŒํŠธ
๋ฒ”์œ„์ „์ฒด ์‹คํ–‰ ๊ณ„ํš (์กฐ์ธ ์ˆœ์„œ, ๋ณ‘๋ ฌ ๋“ฑ)์ธ๋ฑ์Šค ์‚ฌ์šฉ๋งŒ
ํ‘œ๊ธฐ/*+ ORDERED */ (์ฃผ์„)FORCE INDEX (idx) (ํ‚ค์›Œ๋“œ)
๊ฐ•์ œ๋ ฅ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๋ฌด์‹œ ๊ฐ€๋ŠฅFORCE๋Š” ๊ฑฐ์˜ ์ ˆ๋Œ€
ํ‘œ์ค€ํ™”DBMS๋งˆ๋‹ค ๋‹ค๋ฆ„DBMS๋งˆ๋‹ค ๋‹ค๋ฆ„
Oracle๋งค์šฐ ๋‹ค์–‘์ ์Œ
MySQL์ ์Œํ’๋ถ€ (USE/FORCE/IGNORE)

ํžŒํŠธ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ๋ผ์ธ:

  1. ์šฐ์„  ANALYZE TABLE ๋กœ ํ†ต๊ณ„ ๊ฐฑ์‹  ์‹œ๋„
  2. EXPLAIN ์œผ๋กœ ์‹คํ–‰ ๊ณ„ํš ํ™•์ธ
  3. ๋ฌธ์ œ ์ง€์† ์‹œ โ†’ ํžŒํŠธ ๊ฒ€ํ† 
  4. ์šด์˜ ์ฝ”๋“œ์—๋Š” ์ตœ์†Œํ•œ โ€” ๋ฐ์ดํ„ฐ ๋ถ„ํฌ ๋ณ€ํ™” ์ถ”์  ์–ด๋ ค์›€
  5. ํžŒํŠธ ์‚ฌ์šฉ ์‹œ ์ด์œ ๋ฅผ ์ฃผ์„์œผ๋กœ ๋ช…์‹œ

์‹ค๋ฌด ๊ถŒ์žฅ ํ๋ฆ„:

[์„ฑ๋Šฅ ์ด์Šˆ] โ†’ ANALYZE TABLE โ†’ EXPLAIN โ†’ ์ธ๋ฑ์Šค ์ถ”๊ฐ€ โ†’ ํžŒํŠธ
              (1์ˆœ์œ„)         (๋ถ„์„)     (2์ˆœ์œ„)      (๋งˆ์ง€๋ง‰)

ILIC ์ ์šฉ:

  • ์ผ๋ฐ˜ ์ฟผ๋ฆฌ: ์˜ตํ‹ฐ๋งˆ์ด์ € ์‹ ๋ขฐ
  • ํ•ต์‹ฌ ์šด์˜ ์ฟผ๋ฆฌ: EXPLAIN ์ •๊ธฐ ์ ๊ฒ€
  • ํ†ต๊ณ„ ์˜์กด ์šฐ๋ ค ์ฟผ๋ฆฌ: ํžŒํŠธ + ์ฃผ์„์œผ๋กœ ์ด์œ  ๊ธฐ๋ก

์ž๊ธฐ ์ ๊ฒ€

  • "ํžŒํŠธ๋Š” ๋งˆ์ง€๋ง‰ ์ˆ˜๋‹จ"์ธ ์ด์œ ๋Š”?
  • ILIC์—์„œ ์ธ๋ฑ์Šค๊ฐ€ 50๊ฐœ๋ผ๋ฉด ๊ฒ€ํ† ํ•  ๊ฒƒ๋“ค์€? (ํžŒํŠธ: ์ค‘๋ณต, ์‚ฌ์šฉ ๋นˆ๋„, ์นด๋””๋„๋ฆฌํ‹ฐ)

๐ŸŽ“ ์ข…ํ•ฉ ์ž๊ธฐ ์ ๊ฒ€ (13์ฃผ์ฐจ ์กธ์—… ์‹œํ—˜)

Part A: DB ์ด๋ก ๊ณผ ๊ด€๋ฆฌ

DB ์šฉ์–ด์™€ ๋ชจ๋ธ๋ง

  1. ์—”ํ‹ฐํ‹ฐ์™€ ๋ฆด๋ ˆ์ด์…˜์˜ ์ฐจ์ด๋ฅผ ํ•œ ๋ฌธ์žฅ์”ฉ์œผ๋กœ?
  2. ์ฐจ์ˆ˜์™€ ์นด๋””๋„๋ฆฌํ‹ฐ์˜ ์ฐจ์ด๋Š”?
  3. ๋„๋ฉ”์ธ์˜ ์ •์˜์™€ ์‚ฌ๋ก€๋Š”?
  4. ์Šคํ‚ค๋งˆ 3๊ณ„์ธต(๊ฐœ๋…์ /๋…ผ๋ฆฌ์ /๋ฌผ๋ฆฌ์ )์˜ ์ฐจ์ด๋Š”?

์ •๊ทœํ™”

  1. 1NF, 2NF, 3NF, BCNF์˜ ํ•ต์‹ฌ ์ฐจ์ด๋ฅผ ํ•œ ์ค„์”ฉ์œผ๋กœ?
  2. ๋ถ€๋ถ„ ํ•จ์ˆ˜ ์ข…์†๊ณผ ์ดํ–‰ ํ•จ์ˆ˜ ์ข…์†์˜ ์ฐจ์ด๋Š”?
  3. BCNF๊ฐ€ 3NF๋ณด๋‹ค ๋” ์—„๊ฒฉํ•œ ์ด์œ ๋Š”?
  4. ์ •๊ทœํ™”์˜ ๋‹จ์ ๊ณผ ๋ฐ˜์ •๊ทœํ™”์˜ ๋™๊ธฐ๋Š”?

์ด์ƒ ํ˜„์ƒ

  1. ์‚ฝ์ž…/๊ฐฑ์‹ /์‚ญ์ œ ์ด์ƒ ํ˜„์ƒ์„ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ๊ฐ๊ฐ ์„ค๋ช…ํ•˜๋ผ
  2. 3๊ฐ€์ง€ ์ด์ƒ ํ˜„์ƒ์ด ๋ชจ๋‘ ๊ฐ™์€ ์›์ธ์—์„œ ๋น„๋กฏ๋˜๋Š” ์ด์œ ๋Š”?

SQL Injection

  1. SQL Injection์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋Š”?
  2. Prepared Statement๊ฐ€ ์•ˆ์ „ํ•œ ์ด์œ ๋Š”?
  3. ๋‹ค์ธต ๋ฐฉ์–ด 5๊ฐ€์ง€๋ฅผ ๋‚˜์—ดํ•˜๋ผ

RDBMS์™€ NoSQL

  1. RDBMS์˜ 4๊ฐ€์ง€ ํ•ต์‹ฌ ์ œ์•ฝ์กฐ๊ฑด์€?
  2. Scale-Up๊ณผ Scale-Out์˜ ์ฐจ์ด์™€ ๊ฐ์ž์˜ ์ ํ•ฉ ์˜์—ญ์€?
  3. NoSQL ๋“ฑ์žฅ์˜ 4๊ฐ€์ง€ ๋™๊ธฐ๋Š”?
  4. NoSQL 4๊ฐ€์ง€ ์œ ํ˜•์„ ๋Œ€ํ‘œ ์ œํ’ˆ๊ณผ ํ•จ๊ป˜ ์„ค๋ช…ํ•˜๋ผ
  5. Redis์˜ 5๊ฐ€์ง€ ํ™œ์šฉ ์˜์—ญ์€?

๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ด๋ก 

  1. ACID์™€ BASE์˜ ์ฒ ํ•™์  ์ฐจ์ด๋Š”?
  2. CAP ์ด๋ก ์˜ 3๊ฐ€์ง€ ์†์„ฑ๊ณผ 3๊ฐ€์ง€ ์กฐํ•ฉ์€?
  3. CAP ์ด๋ก ์—์„œ "P๋Š” ์‚ฌ์‹ค์ƒ ํ•„์ˆ˜"์ธ ์ด์œ ๋Š”?
  4. PACELC๊ฐ€ CAP์„ ์–ด๋–ป๊ฒŒ ํ™•์žฅํ•˜๋Š”๊ฐ€?
  5. ๊ณต์œ ๋ฝ(S)๊ณผ ๋ฒ ํƒ€๋ฝ(X)์˜ ํ˜ธํ™˜์„ฑ ๋งคํŠธ๋ฆญ์Šค๋Š”?

Part B: SQL ์„ฑ๋Šฅ ์ตœ์ ํ™”

์˜ตํ‹ฐ๋งˆ์ด์ €

  1. RBO์™€ CBO์˜ ์ฐจ์ด๋Š”?
  2. ์˜ตํ‹ฐ๋งˆ์ด์ € ๋™์ž‘ 6๋‹จ๊ณ„๋Š”?
  3. ํ†ต๊ณ„ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋˜๋ฉด ์–ด๋–ค ์‚ฌ๊ณ ๊ฐ€?
  4. FIRST_ROWS์™€ ALL_ROWS ๋ชจ๋“œ์˜ ์ฐจ์ด๋Š”?

์ธ๋ฑ์Šค ๊ธฐ์ดˆ (โ˜…)

  1. logN์ด N๋ณด๋‹ค ์••๋„์ ์œผ๋กœ ๋น ๋ฅธ ์ด์œ ๋ฅผ N=๋ฐฑ๋งŒ ์‚ฌ๋ก€๋กœ ์„ค๋ช…ํ•˜๋ผ
  2. B-tree ์ธ๋ฑ์Šค๊ฐ€ ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ” + ํฌ์ธํ„ฐ๋กœ ๋™์ž‘ํ•˜๋Š” ํ๋ฆ„์€?
  3. ๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค (a, b)์—์„œ WHERE b=... ๊ฐ€ ๋น„ํšจ์œจ์ ์ธ ์ด์œ ๋Š”?
  4. ๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค์˜ "์™ผ์ชฝ ์ปฌ๋Ÿผ ์šฐ์„ " ์›์น™์„ ์„ค๋ช…ํ•˜๋ผ

EXPLAIN๊ณผ ํžŒํŠธ

  1. EXPLAIN์˜ type ์ปฌ๋Ÿผ์—์„œ ์ข‹์€ ๊ฐ’๊ณผ ๋‚˜์œ ๊ฐ’์€?
  2. Extra ์ปฌ๋Ÿผ์˜ Using filesort ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์™€ ํ•ด๊ฒฐ์ฑ…์€?
  3. USE INDEX, FORCE INDEX, IGNORE INDEX์˜ ์ฐจ์ด๋Š”?

์ธ๋ฑ์Šค ์ตœ์ ํ™”

  1. Covering Index์˜ ์ •์˜์™€ EXPLAIN ํ‘œ์‹œ๋Š”?
  2. Full Scan์ด ์ธ๋ฑ์Šค๋ณด๋‹ค ์ข‹์€ 3๊ฐ€์ง€ ๊ฒฝ์šฐ๋Š”?
  3. ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์ข‹์ง€ ์•Š์€ 3๊ฐ€์ง€ ์ด์œ ๋Š”?
  4. ์šด์˜ ์ค‘ ๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

๐Ÿ“Œ ํ•™์Šต ์šด์˜ ํŒ

9-์„น์…˜ ๋งˆ์Šคํ„ฐ ํ”„๋กฌํ”„ํŠธ๋กœ ๊นŠ์ด ํŒŒ์•ผ ํ•  Unit

โ˜…โ˜…โ˜… ๋ฉด์ ‘ยท์‹ค๋ฌด ๋‹จ๊ณจ (๋ฐ˜๋“œ์‹œ):

  • Unit 2.2~2.4 โ€” 1NF/2NF/3NF/BCNF
  • Unit 6.2 โ€” CAP ์ด๋ก 
  • Unit 8.3 โ€” B-tree ์ธ๋ฑ์Šค ๋™์ž‘ + ๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค
  • Unit 9.2 โ€” EXPLAIN ๋ถ„์„
  • Unit 10.1 โ€” Covering Index

โ˜…โ˜… ๋งค์šฐ ๊ถŒ์žฅ:

  • Unit 3.1 โ€” 3๊ฐ€์ง€ ์ด์ƒ ํ˜„์ƒ
  • Unit 5.3 โ€” NoSQL 4๊ฐ€์ง€ ์œ ํ˜•
  • Unit 6.4 โ€” ๊ณต์œ ๋ฝ/๋ฒ ํƒ€๋ฝ
  • Unit 7.2 โ€” ์˜ตํ‹ฐ๋งˆ์ด์ € 6๋‹จ๊ณ„
  • Unit 10.2 โ€” ์ธ๋ฑ์Šค vs Full Scan ์„ ํƒ

Phase๋ณ„ ์ง„๋„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

[ Part A โ€” DB ์ด๋ก ๊ณผ ๊ด€๋ฆฌ ]
[ ] Phase 1 โ€” DB ํ•ต์‹ฌ ์šฉ์–ด์™€ ๋ชจ๋ธ๋ง (Unit 1.1~1.3)
[ ] Phase 2 โ€” ์ •๊ทœํ™” (Unit 2.1~2.4)
[ ] Phase 3 โ€” ์ด์ƒ ํ˜„์ƒ๊ณผ ์ •๊ทœํ™” ํ‰๊ฐ€ (Unit 3.1~3.2)
[ ] Phase 4 โ€” SQL Injection ๋ณด์•ˆ (Unit 4.1~4.2)
[ ] Phase 5 โ€” RDBMS์™€ NoSQL (Unit 5.1~5.4)
[ ] Phase 6 โ€” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ด๋ก  + ๋ฝ (Unit 6.1~6.4)

[ Part B โ€” SQL ์„ฑ๋Šฅ ์ตœ์ ํ™” ]
[ ] Phase 7 โ€” ์˜ตํ‹ฐ๋งˆ์ด์ € (Unit 7.1~7.3)
[ ] Phase 8 โ€” ์ธ๋ฑ์Šค ๊ธฐ์ดˆ (Unit 8.1~8.3)  โ˜… ์ •์ 
[ ] Phase 9 โ€” ๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค์™€ EXPLAIN (Unit 9.1~9.3)
[ ] Phase 10 โ€” ์ธ๋ฑ์Šค ์ตœ์ ํ™” ์ „๋žต (Unit 10.1~10.3)

[ ] ์ข…ํ•ฉ ์ž๊ธฐ ์ ๊ฒ€ 38๋ฌธํ•ญ ํ†ต๊ณผ

13์ฃผ์ฐจ์˜ ์ •์  โ€” Phase 8 (์ธ๋ฑ์Šค ๊ธฐ์ดˆ)

์™œ ์ •์ ์ธ๊ฐ€:

  • DB ์„ฑ๋Šฅ์˜ 90%๋ฅผ ์ขŒ์šฐํ•˜๋Š” ์˜์—ญ
  • ๋ฉด์ ‘์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๋“ฑ์žฅ (B-tree, ๋ฉ€ํ‹ฐ์ปฌ๋Ÿผ)
  • 12์ฃผ์ฐจ N+1 ๋ฌธ์ œ์™€๋„ ์ง๊ฒฐ (fetch join ์ตœ์ ํ™”์˜ ๊ธฐ๋ฐ˜)

ํ•™์Šต ์‹œ ๊ฐ•์กฐ์ :

  • B-tree์˜ ์ •๋ ฌ + ํฌ์ธํ„ฐ ๊ตฌ์กฐ ์‹œ๊ฐํ™”
  • "์™ผ์ชฝ ์ปฌ๋Ÿผ ์šฐ์„ " ์›์น™ ์ฒดํ™”
  • ์ง์ ‘ EXPLAIN ๋Œ๋ ค๋ณด๋ฉฐ ๊ฒ€์ฆ

1~13์ฃผ์ฐจ ํ†ตํ•ฉ ํ๋ฆ„ โ€” DB ๋ณธ์—ฐ์˜ ์˜์—ญ์œผ๋กœ

12์ฃผ์ฐจ๊นŒ์ง€๊ฐ€ ์ž๋ฐ”ยทSpringยทJPA์˜ ์œ„์ชฝ ์ถ”์ƒํ™” ์˜€๋‹ค๋ฉด, 13์ฃผ์ฐจ๋Š” DB ์ž์ฒด์˜ ๊นŠ์ด ๋กœ ๋‚ด๋ ค๊ฐ”๋‹ค.

์˜์—ญ์ฃผ์ฐจ์ถ”์ƒํ™” ์ˆ˜์ค€
์ž๋ฐ” ์–ธ์–ด1~3์ฃผ์ฐจ๊ฐ€์žฅ ๋†’์Œ
๋™์‹œ์„ฑยทSpring4~5์ฃผ์ฐจ๋†’์Œ
Spring DB ์ ‘๊ทผ6~7์ฃผ์ฐจ์ค‘์ƒ
AOPยทํŠธ๋žœ์žญ์…˜8~10์ฃผ์ฐจ์ค‘์ƒ
JPAยท์˜์†์„ฑ ์ปจํ…์ŠคํŠธ11~12์ฃผ์ฐจ์ค‘
DB ํŽ€๋”๋ฉ˜ํ„ธ13์ฃผ์ฐจ (์ง€๊ธˆ)๊ฐ€์žฅ ๋‚ฎ์Œ (DB ์ž์ฒด)

์˜์˜:

  • ๊ทธ๋™์•ˆ JPA๊ฐ€ ๊ฐ€๋ ค๋†“์•˜๋˜ DB์˜ ์ง„์งœ ๋™์ž‘ ์„ ๋ณธ๋‹ค
  • ์ •๊ทœํ™”ยท์ธ๋ฑ์Šคยท์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋ชจ๋“  ORM์˜ ๊ธฐ๋ฐ˜
  • ์ด์ œ๋ถ€ํ„ฐ N+1 ๋ฌธ์ œ๋„, ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€๋„ ๋” ๊นŠ์ด ์ดํ•ด ๊ฐ€๋Šฅ

ํ•™์Šต ์‹œ ์ฃผ์˜ โ€” ๋ฐ˜๋“œ์‹œ ์ง์ ‘ ์‹คํ–‰

์ด๋ฒˆ ์ฃผ์ฐจ๋Š” ์ด๋ก ๋งŒ ์ฝ์œผ๋ฉด ์ ˆ๋Œ€ ์ฒดํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  1. Phase 2 (์ •๊ทœํ™”) โ€” ์œ„๋ฐ˜/์ ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง์ ‘ SQL๋กœ ์ž‘์„ฑ
  2. Phase 4 (SQL Injection) โ€” ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ ๊ณต๊ฒฉ ์‹œ๋„
  3. Phase 5 (NoSQL) โ€” Docker๋กœ MongoDB/Redis ๋„์šฐ๊ณ  ์‹ค์Šต
  4. Phase 6 (๋ฝ) โ€” ๋‘ ํŠธ๋žœ์žญ์…˜์„ ๋™์‹œ ์‹คํ–‰ํ•˜๋ฉฐ ๋ฝ ์ถฉ๋Œ ์žฌํ˜„
  5. Phase 8~10 (์ธ๋ฑ์Šค) โ€” ๋ฐ˜๋“œ์‹œ EXPLAIN ์œผ๋กœ ์‹คํ–‰ ๊ณ„ํš ํ™•์ธ

ํŠนํžˆ Phase 8 (B-tree) ์™€ Phase 9 (EXPLAIN) ์€ ILIC ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ:

EXPLAIN SELECT * FROM bookings WHERE customer_id = ? AND status = ?;
EXPLAIN ANALYZE ...  -- ์‹ค์ œ ์‹œ๊ฐ„ ์ธก์ • (PostgreSQL/MySQL 8.0+)

์ด๋Ÿฐ ์‹์œผ๋กœ ์ง์ ‘ ๊ฒ€์ฆํ•˜์„ธ์š”. 1~2์‹œ๊ฐ„ EXPLAIN ๋‹ค์–‘ํ•œ ์ฟผ๋ฆฌ์— ๋Œ๋ ค๋ณด๋ฉด ์ธ๋ฑ์Šค ๊ฐ๊ฐ์ด ํญ๋ฐœ์ ์œผ๋กœ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.


profile
Software Developer

0๊ฐœ์˜ ๋Œ“๊ธ€