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

5์ฃผ์ฐจ ์ž๋ฃŒ์˜ ๋ชจ๋“  ํ† ํ”ฝ์„ ๋‘ ๊ฐœ์˜ ํฐ ํ๋ฆ„์œผ๋กœ ์ •๋ฆฌํ•œ ํ•™์Šต ๊ฒฝ๋กœ.
1) ๋™์‹œ์„ฑ ๋งˆ๋ฌด๋ฆฌ (Atomic/CAS, ์Šค๋ ˆ๋“œ ํ’€์˜ ํ•„์š”์„ฑ)
2) ํ† ๋น„์˜ ์Šคํ”„๋ง ์‹œ์ž‘ (DAO ์ง„ํ™” โ†’ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ โ†’ ๋””์ž์ธ ํŒจํ„ด โ†’ IoC/DI)

์ž๋ฐ” ๊ธฐ์ดˆยท๋™์‹œ์„ฑ์„ ๋๋‚ด๊ณ  Spring ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋กœ ์ง„์ž…ํ•˜๋Š” ๋‹ค๋ฆฌ ์ฃผ์ฐจ๋‹ค.


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

[Part A โ€” ๋™์‹œ์„ฑ ๋งˆ๋ฌด๋ฆฌ]
  [Phase 1] ์Šค๋ ˆ๋“œ ํ’€์˜ ํ•„์š”์„ฑ ์žฌ์ •๋ฆฌ
     โ†“
  [Phase 2] ๋™์‹œ์„ฑ ์•ˆ์ „ ๋„๊ตฌ 3์ข… ๋น„๊ต (synchronized/volatile/Atomic)

           โ†“ (์ž๋ฐ” ๊ธฐ์ดˆ ์™„์„ฑ)

[Part B โ€” ํ† ๋น„์˜ ์Šคํ”„๋ง: ๊ฐ์ฒด ์„ค๊ณ„์˜ ์ง„ํ™”]
  [Phase 3] ์ „ํ†ต DAO์˜ ๋ฌธ์ œ
     โ†“
  [Phase 4] ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ
     โ†“
  [Phase 5] ๋””์ž์ธ ํŒจํ„ด ์ ์šฉ (ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ / ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ)
     โ†“
  [Phase 6] ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™ (OCP, ์ „๋žต ํŒจํ„ด)
     โ†“
  [Phase 7] ์ œ์–ด์˜ ์—ญ์ „ (IoC)
     โ†“
  [Phase 8] Spring ์ปจํ…Œ์ด๋„ˆ (ApplicationContext + DI)

์ด 8 Phase ร— 26 Unit

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

์ฃผ์ฐจ์ฃผ์ œํ•ต์‹ฌ ๋ณ€ํ™”
1์ฃผ์ฐจOOPยทJVMยทGCยท์ปฌ๋ ‰์…˜ยทI/O ๊ฐœ๋ก ์ž๋ฐ” ํฐ ๊ทธ๋ฆผ
2์ฃผ์ฐจJVM ๋‚ด๋ถ€ยท๋ฐ”์ดํŠธ์ฝ”๋“œยทG1 GC"์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋‚˜"
3์ฃผ์ฐจ์ปฌ๋ ‰์…˜ ์ „์ฒด ์ง€๋„ยท์ œ๋„ค๋ฆญยทํ•จ์ˆ˜ํ˜•์ž๋ฐ” ํ‘œํ˜„๋ ฅ ์™„์„ฑ
4์ฃผ์ฐจ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉยท๋™์‹œ์„ฑยทExecutor๋™์‹œ์„ฑ ์ฒซ ์ •๋ณต
5์ฃผ์ฐจ (์ง€๊ธˆ)Atomic + Spring IoC/DI ์ž…๋ฌธ์ž๋ฐ” โ†’ Spring ๋‹ค๋ฆฌ

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

DayPhaseํ•™์Šต ๋ชฉํ‘œ
1์ผ์ฐจPhase 1 + 2๋™์‹œ์„ฑ ๋งˆ๋ฌด๋ฆฌ (Atomic/CAS)
2์ผ์ฐจPhase 3์ „ํ†ต DAO ๋ถ„์„
3์ผ์ฐจPhase 4๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ (1ยท2๋‹จ๊ณ„)
4์ผ์ฐจPhase 5ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ + ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด
5์ผ์ฐจPhase 6OCP + ์ „๋žต ํŒจํ„ด
6์ผ์ฐจPhase 7IoC + ํ”„๋ ˆ์ž„์›Œํฌ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
7์ผ์ฐจPhase 8ApplicationContext + DI

๐Ÿงต Part A โ€” ๋™์‹œ์„ฑ ๋งˆ๋ฌด๋ฆฌ

๐Ÿ“š Phase 1 โ€” ์Šค๋ ˆ๋“œ ํ’€์˜ ํ•„์š”์„ฑ ์žฌ์ •๋ฆฌ

๋ชฉํ‘œ: 4์ฃผ์ฐจ์—์„œ ๋ณธ Executor ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ "์™œ" ํ•„์š”ํ•œ์ง€๋ฅผ ์Šค๋ ˆ๋“œ ์ž์ฒด์˜ ๋น„์šฉ ๊ด€์ ์—์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ชป ๋ฐ•๋Š”๋‹ค.

Unit 1.1 โ€” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŽ์ด ์“ธ ๋•Œ์˜ ํ•จ์ •

์„ ์ˆ˜ ์ง€์‹: 4์ฃผ์ฐจ Phase 1, 7

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

"์Šค๋ ˆ๋“œ๋ฅผ ๋งŽ์ด ์“ธ์ˆ˜๋ก ํ•ญ์ƒ ๋น ๋ฅผ๊นŒ?" โ†’ NO

3๊ฐ€์ง€ ํ•จ์ •:
1. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ์˜ค๋ฒ„ํ—ค๋“œ: ์Šค๋ ˆ๋“œ N๊ฐœ โ†‘ โ†’ ์Šค์œ„์นญ ๋น„์šฉ โ†‘
2. ๋ฐ๋“œ๋ฝ: ๋ฝ์ด ๋งŽ์„์ˆ˜๋ก ๋ฐ๋“œ๋ฝ ๊ฐ€๋Šฅ์„ฑ โ†‘
3. ๋…ธ๋Š” ์Šค๋ ˆ๋“œ์˜ ์ž์› ๋‚ญ๋น„: ์ž‘์—… ์•ˆ ํ•ด๋„ ๋ฉ”๋ชจ๋ฆฌ ์ฐจ์ง€ + ์Šค์ผ€์ค„๋ง ๋น„์šฉ

ํ•ต์‹ฌ ํ†ต์ฐฐ: ์Šค๋ ˆ๋“œ๋Š” "๊ณต์งœ๊ฐ€ ์•„๋‹ˆ๋‹ค". ์กด์žฌ ์ž์ฒด๋กœ ๋น„์šฉ.

์ž๊ธฐ ์ ๊ฒ€

  • ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ๋น„์šฉ์ด ์ ์€ ์ด์œ ๋Š”? (ํžŒํŠธ: ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ )
  • "๋…ธ๋Š” ์Šค๋ ˆ๋“œ"๊ฐ€ CPU์— ๋ถ€๋‹ด์„ ์ฃผ๋Š” ์ด์œ ๋Š”?

Unit 1.2 โ€” ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์˜ ์ง„์งœ ๋น„์šฉ

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

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

์Šค์œ„์นญ ์‹œ ์ผ์–ด๋‚˜๋Š” ์ผ:
1. ํ˜„์žฌ ์Šค๋ ˆ๋“œ์˜ CPU ๋ ˆ์ง€์Šคํ„ฐ โ†’ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐฑ์—…
2. ๋‹ค์Œ ์Šค๋ ˆ๋“œ์˜ ์ด์ „ ์ƒํƒœ โ†’ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณต์›
3. CPU ์บ์‹œ ๋ฌดํšจํ™” (์บ์‹œ ๋ฏธ์Šค ๋ฐœ์ƒ)
4. ์Šค๋ ˆ๋“œ ์Šคํƒ, PC ์นด์šดํ„ฐ ๋“ฑ ์ปจํ…์ŠคํŠธ ์ „ํ™˜

์Šค์œ„์นญ ํšŸ์ˆ˜ = ์Šค๋ ˆ๋“œ ์ˆ˜ ร— ์‹œ๊ฐ„ ๋น„๋ก€ โ†’ ์Šค๋ ˆ๋“œ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด CPU๊ฐ€ ์ž‘์—…๋ณด๋‹ค ์Šค์œ„์นญ์— ๋” ๋งŽ์€ ์‹œ๊ฐ„ ์†Œ๋น„

์ž๊ธฐ ์ ๊ฒ€

  • ์ฝ”์–ด 4๊ฐœ ์‹œ์Šคํ…œ์—์„œ ์Šค๋ ˆ๋“œ 4๊ฐœ vs 100๊ฐœ์˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ ์ฐจ์ด๋Š”?
  • "๋…ธ๋Š” ์Šค๋ ˆ๋“œ๋„ ์Šค์œ„์นญ ๋Œ€์ƒ์ด ๋˜๋Š”๊ฐ€"์˜ ๋‹ต์€?

Unit 1.3 โ€” ์Šค๋ ˆ๋“œ ํ’€์ด๋ผ๋Š” ๋‹ต

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

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

๋ฌธ์ œ โ†’ ํ•ด๊ฒฐ:

  • ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ๋น„์šฉ โ†‘ โ†’ ์žฌ์‚ฌ์šฉ
  • ๋ฌดํ•œ ์ƒ์„ฑ ์œ„ํ—˜ โ†’ ๊ฐœ์ˆ˜ ์ œํ•œ
  • ์ž์› ๋‚ญ๋น„ โ†’ idle ์Šค๋ ˆ๋“œ ํšŒ์ˆ˜ (CachedThreadPool)

์ด๊ฒŒ 4์ฃผ์ฐจ์—์„œ ๋ณธ Executor ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์กด์žฌ ์ด์œ ๋‹ค.

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

"์Šค๋ ˆ๋“œ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์ง€ ๋งˆ๋ผ. ExecutorService๋ฅผ ์จ๋ผ. ํ’€ ํฌ๊ธฐ๋Š” ์‹ ์ค‘ํžˆ ์ •ํ•˜๋ผ."

์ž๊ธฐ ์ ๊ฒ€

  • ์ผ๋ฐ˜ ์›น ์„œ๋ฒ„์˜ ์ ์ • ์Šค๋ ˆ๋“œ ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€? (ํžŒํŠธ: I/O ๋ฐ”์šด๋“œ vs CPU ๋ฐ”์šด๋“œ)
  • Tomcat์˜ ๊ธฐ๋ณธ maxThreads๋Š” ๋ช‡์ด๋ฉฐ, ๊ทธ ์˜๋ฏธ๋Š”?

๐Ÿ“š Phase 2 โ€” ๋™์‹œ์„ฑ ์•ˆ์ „ ๋„๊ตฌ 3์ข… ๋น„๊ต

๋ชฉํ‘œ: 4์ฃผ์ฐจ์—์„œ synchronized์™€ volatile์„ ๋ณธ ๋‹ค์Œ, ์ด๋ฒˆ์—” Atomic๊นŒ์ง€ ๋”ํ•ด 3๊ฐ€์ง€ ๋„๊ตฌ์˜ ์ •ํ™•ํ•œ ์ฐจ์ด๋ฅผ ๋งคํŠธ๋ฆญ์Šค๋กœ ์žก๋Š”๋‹ค.

Unit 2.1 โ€” ๋‘ ๊ฐ€์ง€ ๋™์‹œ์„ฑ ๋ฌธ์ œ ๊ตฌ๋ถ„

์„ ์ˆ˜ ์ง€์‹: 4์ฃผ์ฐจ Phase 4

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

๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” ์ •ํ™•ํžˆ 2๊ฐ€์ง€ ๋‹ค:

๋ฌธ์ œ์ •์˜์˜ˆ์‹œ
๊ฐ€์‹œ์„ฑ(Visibility)ํ•œ ์Šค๋ ˆ๋“œ์˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์•ˆ ๋ณด์ž„runFlag = false ํ–ˆ๋Š”๋ฐ ๋ฌดํ•œ ๋ฃจํ”„
๋™์‹œ ์ ‘๊ทผ(Atomicity)๋™์‹œ ์ˆ˜์ •์ด ์„œ๋กœ๋ฅผ ๋ฎ์–ด์”€count++ ๊ฐ€ ์ผ๋ถ€ ์†์‹ค

์ด ๋‘˜์„ ๋ถ„๋ฆฌํ•ด์„œ ๋ณด๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ. ๋„๊ตฌ๋งˆ๋‹ค ํ•ด๊ฒฐ ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅด๋‹ค.

์ž๊ธฐ ์ ๊ฒ€

  • ๊ฐ€์‹œ์„ฑ๊ณผ ์›์ž์„ฑ์„ ๋‘˜ ๋‹ค ๊นจ๋Š” ์‚ฌ๋ก€๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ผ
  • ๊ฐ€์‹œ์„ฑ๋งŒ ๊นจ์ง€๊ณ  ์›์ž์„ฑ์€ OK์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„๊นŒ?

Unit 2.2 โ€” synchronized: ๋‘˜ ๋‹ค ํ•ด๊ฒฐ, ๋Œ€์‹  ๋А๋ฆผ

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

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

  • โœ… ๊ฐ€์‹œ์„ฑ ๋ณด์žฅ (synchronized ์•ˆ ๋ณ€์ˆ˜๋Š” ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ ๋™๊ธฐํ™”)
  • โœ… ์›์ž์„ฑ ๋ณด์žฅ (ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ์ง„์ž…)
  • โŒ ์„ฑ๋Šฅ ๋น„์šฉ โ€” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” BLOCKED

๊ฐ€์žฅ ์•ˆ์ „ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ๋น„์‹ผ ๋„๊ตฌ.

์ž๊ธฐ ์ ๊ฒ€

  • synchronized๊ฐ€ "์ „์ฒด ๋ฝ"์„ ๊ฑฐ๋Š” ๊ฒƒ์˜ ๋‹จ์ ์€?
  • ์ฝ๊ธฐ๋งŒ ํ•˜๋Š”๋ฐ๋„ synchronized๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š”?

Unit 2.3 โ€” volatile: ๊ฐ€์‹œ์„ฑ๋งŒ, ์›์ž์„ฑ์€ โŒ

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

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

  • โœ… ๊ฐ€์‹œ์„ฑ ๋ณด์žฅ (๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ ์ง์ ‘ R/W)
  • โŒ ์›์ž์„ฑ ๋ณด์žฅ ์•ˆ ๋จ
volatile int count = 0;
count++;  // โš ๏ธ ์—ฌ์ „ํžˆ ์œ„ํ—˜! (read โ†’ +1 โ†’ write 3๋‹จ๊ณ„)

์ ํ•ฉํ•œ ์‚ฌ์šฉ์ฒ˜: ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ์“ฐ๊ณ , ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฝ๋Š” ํ”Œ๋ž˜๊ทธ

volatile boolean shutdown = false;  // ํ•œ ๊ณณ์—์„œ๋งŒ true ์„ค์ •

์ž๊ธฐ ์ ๊ฒ€

  • count++ ๊ฐ€ volatile๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€์œผ๋กœ?
  • volatile์ด ์ ํ•ฉํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค 3๊ฐ€์ง€๋Š”?

Unit 2.4 โ€” Atomic + CAS ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๋ฝ ์—†์ด ์›์ž์„ฑ)

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

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

CAS (Compare And Swap) ์•Œ๊ณ ๋ฆฌ์ฆ˜:
1. ํ˜„์žฌ ๊ฐ’ ์ฝ๊ธฐ โ†’ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ (A)
2. ์ƒˆ ๊ฐ’ ๊ณ„์‚ฐ (B)
3. ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’๊ณผ A๋ฅผ ๋น„๊ต

  • ๊ฐ™์œผ๋ฉด โ†’ B๋กœ ๊ต์ฒด โœ…
  • ๋‹ค๋ฅด๋ฉด โ†’ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ด๋ฏธ ์ˆ˜์ • โ†’ ์žฌ์‹œ๋„

์€ํ–‰ ์ž”์•ก ์˜ˆ์‹œ:

  • ์Šค๋ ˆ๋“œ1: 100 โ†’ 150 ์‹œ๋„, ๋ฉ”๋ชจ๋ฆฌ 100๊ณผ ์ผ์น˜ โ†’ ์„ฑ๊ณต
  • ์Šค๋ ˆ๋“œ2: 100 โ†’ 150 ์‹œ๋„, ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ด๋ฏธ 150 โ†’ ์‹คํŒจ โ†’ ์žฌ์‹œ๋„ โ†’ 150 โ†’ 200 ์„ฑ๊ณต
AtomicInteger num = new AtomicInteger(0);
num.incrementAndGet();  // ๋ฝ ์—†์ด ์›์ž์ 

๋น„๊ต ๋งคํŠธ๋ฆญ์Šค:

๋„๊ตฌ๊ฐ€์‹œ์„ฑ์›์ž์„ฑ๋ฐฉ์‹์„ฑ๋Šฅ
synchronizedโœ…โœ…๋ฝ (๋ธ”๋กœํ‚น)๊ฐ€์žฅ ๋А๋ฆผ
volatileโœ…โŒ๋ฉ”๋ชจ๋ฆฌ ๋™๊ธฐํ™”๋น ๋ฆ„
Atomicโœ…โœ…CAS (๋…ผ๋ธ”๋กœํ‚น)๋น ๋ฆ„

์ž๊ธฐ ์ ๊ฒ€

  • CAS์˜ "์žฌ์‹œ๋„"๊ฐ€ ๋ฌดํ•œ ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€? (ํžŒํŠธ: ABA ๋ฌธ์ œ)
  • Atomic์ด synchronized๋ณด๋‹ค ๋น ๋ฅธ ์ด์œ ๋Š”?

๐ŸŒฑ Part B โ€” ํ† ๋น„์˜ ์Šคํ”„๋ง: ๊ฐ์ฒด ์„ค๊ณ„์˜ ์ง„ํ™”

์ด ํŒŒํŠธ์˜ ํ•ต์‹ฌ ๋ฉ”์‹œ์ง€:
"DAO ์ฝ”๋“œ ํ•œ ์ค„์ด ์–ด๋–ป๊ฒŒ Spring์˜ IoC/DI๊นŒ์ง€ ์ง„ํ™”ํ•˜๋Š”์ง€" โ€” ํ•œ ํด๋ž˜์Šค์˜ ๋ฆฌํŒฉํ† ๋ง ์—ฌ์ •์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™๊ณผ Spring์˜ ๋ณธ์งˆ์„ ๋™์‹œ์— ์ตํžŒ๋‹ค.

๐Ÿ“š Phase 3 โ€” ์ „ํ†ต DAO์˜ ๋ฌธ์ œ

๋ชฉํ‘œ: Spring์ด ์™œ ํ•„์š”ํ•œ์ง€๋ฅผ, "Spring ์—†์ด ์ง  ์ฝ”๋“œ์˜ ๊ณ ํ†ต" ์œผ๋กœ ์ง์ ‘ ๋ณธ๋‹ค.

Unit 3.1 โ€” DAO๋ž€ ๋ฌด์—‡์ธ๊ฐ€

์„ ์ˆ˜ ์ง€์‹: 1์ฃผ์ฐจ Phase 7 (JDBC ๊ฐœ๋…)

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

  • DAO (Data Access Object): DB ์ ‘๊ทผยท์กฐ์ž‘ ๊ธฐ๋Šฅ๋งŒ ์ „๋‹ดํ•˜๋Š” ๊ฐ์ฒด
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ DB ์ ‘๊ทผ ๋กœ์ง์„ ๋ถ„๋ฆฌ ํ•˜๋Š” ํŒจํ„ด
  • 1990๋…„๋Œ€๋ถ€ํ„ฐ ์ž๋ฐ” ์ง„์˜์˜ ํ‘œ์ค€ ํŒจํ„ด

์ž๊ธฐ ์ ๊ฒ€

  • DAO ๋ถ„๋ฆฌ ์—†์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์•ˆ์— SQL์„ ๋ฐ•์œผ๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€?
  • DAO์™€ Repository์˜ ์ฐจ์ด๋Š”? (ํžŒํŠธ: DDD)

Unit 3.2 โ€” ์ „ํ†ต DAO์˜ ์ฝ”๋“œ (๋ชจ๋“  ์ฑ…์ž„์„ ๋‹ค ๋– ์•ˆ์€)

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

ํ•ต์‹ฌ ์ฝ”๋“œ ๋ถ„์„

public void add(User user) throws ... {
    Class.forName("com.mysql.jdbc.Driver");        // โ‘  ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
    Connection c = DriverManager.getConnection(    // โ‘ก DB ์ ‘์† ์ •๋ณด
        "jdbc:mysql://localhost/toby", "root", "*****");
    PreparedStatement ps = c.prepareStatement(     // โ‘ข SQL ์ž‘์„ฑ
        "insert into users(id, name, password) values (?,?,?)");
    ps.setString(1, user.getId());                 // โ‘ฃ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ
    // ...
    ps.executeUpdate();                            // โ‘ค ์‹คํ–‰
    ps.close(); c.close();                         // โ‘ฅ ์ž์› ํ•ด์ œ
}

์ž๊ธฐ ์ ๊ฒ€

  • ์œ„ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹ ๊ฒฝ ์“ฐ๋Š” "๊ด€์‹ฌ์‚ฌ"๋ฅผ 5๊ฐœ ์ด์ƒ ์ฐพ์•„๋ณด๋ผ
  • DB ์ข…๋ฅ˜๋ฅผ MySQL โ†’ Oracle๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ๋ช‡ ๊ตฐ๋ฐ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋‚˜?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.56


Unit 3.3 โ€” ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ๊ฐ€ โ€” ์ฑ…์ž„ ํ˜ผ์žฌ

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

ํ•ต์‹ฌ ๋ฌธ์ œ ์ง„๋‹จ

์ด ํ•œ ๋ฉ”์„œ๋“œ ์•ˆ์— ์„ž์—ฌ์žˆ๋Š” ์ฑ…์ž„:
1. DB ์—ฐ๊ฒฐ ์ •๋ณด ๊ด€๋ฆฌ (URL, user, password)
2. DB ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
3. SQL ์ž‘์„ฑ๊ณผ ์‹คํ–‰
4. ์ž์› ํ•ด์ œ
5. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

์™œ ๋ฌธ์ œ์ธ๊ฐ€:

  • DB ์ข…๋ฅ˜ ๋ฐ”๋€Œ๋ฉด โ†’ ๋ชจ๋“  ๋ฉ”์„œ๋“œ ์ˆ˜์ •
  • ์ ‘์† ์ •๋ณด ๋ฐ”๋€Œ๋ฉด โ†’ ๋ชจ๋“  ๋ฉ”์„œ๋“œ ์ˆ˜์ •
  • ๊ฐ™์€ ์ฝ”๋“œ(getConnection) ๊ฐ€ ๋ฉ”์„œ๋“œ๋งˆ๋‹ค ์ค‘๋ณต

โ†’ ๋ณ€๊ฒฝ 1๋ฒˆ = ์ˆ˜์ • N๊ณณ = ์œ ์ง€๋ณด์ˆ˜ ์ง€์˜ฅ

์ž๊ธฐ ์ ๊ฒ€

  • "์ฝ”๋“œ ์ค‘๋ณต"์ด ๋‹จ์ˆœํžˆ ๋ฏธ๊ด€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ์ด์œ ๋Š”?
  • ์ด ์ฝ”๋“œ๋ฅผ 1์ฃผ์ฐจ์˜ SOLID 5์›์น™์— ๋น„์ถ”๋ฉด ์–ด๋–ค ์›์น™๋“ค์„ ์œ„๋ฐ˜ํ•˜๋Š”๊ฐ€?

๐Ÿ“š Phase 4 โ€” ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ (Separation of Concerns)

๋ชฉํ‘œ: ๋ฆฌํŒฉํ† ๋ง์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ ์›๋ฆฌ๋ฅผ ์ฝ”๋“œ ๋ณ€ํ™”๋กœ ์ง์ ‘ ๋ณธ๋‹ค.

Unit 4.1 โ€” ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ ๊ฐœ๋…

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

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

"๊ด€์‹ฌ์ด ๊ฐ™์€ ๊ฒƒ๋ผ๋ฆฌ๋Š” ํ•˜๋‚˜๋กœ ๋ชจ์œผ๊ณ , ๊ด€์‹ฌ์ด ๋‹ค๋ฅธ ๊ฒƒ์€ ๋–จ์–ด๋œจ๋ ค๋ผ"

๊ด€์‹ฌ์‚ฌ(Concern)์˜ ์˜๋ฏธ:

  • ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฃจ๋Š” ํ•˜๋‚˜์˜ ์ฃผ์ œยท์ฑ…์ž„
  • ๋ณ€๊ฒฝ์˜ ์ด์œ ์™€ ์ผ์น˜ (1์ฃผ์ฐจ SRP์™€ ์ง๊ฒฐ)

์ฒ˜์Œ์—” ํ•œ๋ฐ ๋ชจ์€ ๊ฒŒ ํŽธํ•˜์ง€๋งŒ, ์‹œ์Šคํ…œ์ด ์ปค์ง€๋ฉด ๋ถ„๋ฆฌํ•ด์•ผ๋งŒ ์‚ด์•„๋‚จ๋Š”๋‹ค.

์ž๊ธฐ ์ ๊ฒ€

  • "๊ด€์‹ฌ์‚ฌ"์™€ "์ฑ…์ž„(Responsibility)"์€ ๊ฐ™์€ ๋ง์ธ๊ฐ€?
  • DAO์—์„œ ๋ถ„๋ฆฌํ•ด์•ผ ํ•  ์ฒซ ๋ฒˆ์งธ ๊ด€์‹ฌ์‚ฌ๋Š”?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.61


Unit 4.2 โ€” 1๋‹จ๊ณ„: ๋ฉ”์„œ๋“œ ์ถ”์ถœ (getConnection)

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

ํ•ต์‹ฌ ๋ณ€ํ™”

Before (๊ฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์ง์ ‘ ์—ฐ๊ฒฐ):

public void add(...) {
    Class.forName(...);
    Connection c = DriverManager.getConnection(...);
    // ...
}
public User get(...) {
    Class.forName(...);                      // โ† ์ค‘๋ณต
    Connection c = DriverManager.getConnection(...);  // โ† ์ค‘๋ณต
    // ...
}

After (๋ฉ”์„œ๋“œ ์ถ”์ถœ):

private Connection getConnection() throws ... {
    Class.forName("com.mysql.jdbc.Driver");
    return DriverManager.getConnection(...);
}
public void add(...) {
    Connection c = getConnection();  // ๊น”๋”
    // ...
}
public User get(...) {
    Connection c = getConnection();  // ๊น”๋”
    // ...
}

์–ป์€ ๊ฒƒ:

  • ์ค‘๋ณต ์ œ๊ฑฐ
  • DB ์ •๋ณด ๋ณ€๊ฒฝ ์‹œ ํ•œ ๊ณณ๋งŒ ์ˆ˜์ •

์ž๊ธฐ ์ ๊ฒ€

  • ์ด ๋‹จ๊ณ„์—์„œ ์–ด๋–ค SOLID ์›์น™์ด ์ ์šฉ๋˜์—ˆ๋Š”๊ฐ€?
  • ์•„์ง ๋‚จ์€ ๋ฌธ์ œ๋Š”? (ํžŒํŠธ: ๋‹ค๋ฅธ DB ์ง€์›)

Unit 4.3 โ€” 2๋‹จ๊ณ„: ์ถ”์ƒํด๋ž˜์Šค๋กœ ํ™•์žฅ (๋‹ค๋ฅธ DB ์ง€์›)

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

ํ•ต์‹ฌ ๋ณ€ํ™”

๋ฌธ์ œ: "๊ณ ๊ฐ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅธ DB๋ฅผ ์“ฐ๊ณ  ์‹ถ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ UserDao ์ฝ”๋“œ๋Š” ๊ณต๊ฐœํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค."

ํ•ด๊ฒฐ: getConnection์„ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ

public abstract class UserDao {
    public void add(...) {
        Connection c = getConnection();  // ๋ณ€ํ•˜์ง€ ์•Š๋Š” ํ๋ฆ„
        // ...
    }
    public abstract Connection getConnection();  // ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„
}

class NUserDao extends UserDao {
    public Connection getConnection() {
        // N์‚ฌ DB ์—ฐ๊ฒฐ ์ฝ”๋“œ
    }
}
class DUserDao extends UserDao {
    public Connection getConnection() {
        // D์‚ฌ DB ์—ฐ๊ฒฐ ์ฝ”๋“œ
    }
}

์ž๊ธฐ ์ ๊ฒ€

  • "๋ณ€ํ•˜์ง€ ์•Š๋Š” ํ๋ฆ„"๊ณผ "๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„"์˜ ๋ถ„๋ฆฌ๊ฐ€ ๊ฐ–๋Š” ์˜๋ฏธ๋Š”?
  • ์ด ๊ตฌ์กฐ์˜ ๋‹จ์ ์€? (ํžŒํŠธ: ๋‹จ์ผ ์ƒ์†)

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.65


๐Ÿ“š Phase 5 โ€” ๋””์ž์ธ ํŒจํ„ด์˜ ์ ์šฉ

๋ชฉํ‘œ: Phase 4์˜ ๋ฆฌํŒฉํ† ๋ง์ด ์‚ฌ์‹ค์€ ๋””์ž์ธ ํŒจํ„ด 2๊ฐœ์˜ ์ ์šฉ ์ด์—ˆ์Œ์„ ์•Œ๊ณ , ๊ทธ ํ•œ๊ณ„๊นŒ์ง€ ๋ณธ๋‹ค.

Unit 5.1 โ€” ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

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

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

"์Šˆํผํด๋ž˜์Šค์— ๊ธฐ๋ณธ ํ๋ฆ„์„ ๋งŒ๋“ค๊ณ , ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜๊ฒŒ ํ•˜๋Š” ํŒจํ„ด"

๊ตฌ์กฐ:

[์Šˆํผํด๋ž˜์Šค]
  โ”œโ”€ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ (๋ณ€ํ•˜์ง€ ์•Š๋Š” ํ๋ฆ„)
  โ””โ”€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ (๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„)
        โ†‘ ์˜ค๋ฒ„๋ผ์ด๋“œ
        [์„œ๋ธŒํด๋ž˜์Šค]

Phase 4-3์˜ UserDao ์ฝ”๋“œ๊ฐ€ ์ •ํ™•ํžˆ ์ด ํŒจํ„ด.

์ž๊ธฐ ์ ๊ฒ€

  • Spring์˜ JdbcTemplate์ด ์ด๋ฆ„์— "Template"์ด ๋ถ™์€ ์ด์œ ๋Š”?
  • ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ๋žŒ๋‹ค/ํ•จ์ˆ˜ํ˜•์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.67


Unit 5.2 โ€” ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

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

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

"๊ฐ์ฒด ์ƒ์„ฑ์„ ์„œ๋ธŒํด๋ž˜์Šค์— ์œ„์ž„ํ•˜๋Š” ํŒจํ„ด"

getConnection() ๋„ ์‚ฌ์‹ค์€:

  • "์–ด๋–ค Connection์„ ๋งŒ๋“ค์ง€" ๊ฒฐ์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • โ†’ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์„œ๋ธŒํด๋ž˜์Šค์— ๋งก๊น€
  • โ†’ ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

๊ทธ๋ž˜์„œ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋‘ ํŒจํ„ด์œผ๋กœ ๋™์‹œ์— ํ•ด์„๋œ๋‹ค:

  • "๊ธฐ๋ณธ ํ๋ฆ„ + ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„" โ†’ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ
  • "๊ฐ์ฒด ์ƒ์„ฑ์„ ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ๊ฒฐ์ •" โ†’ ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ

์ž๊ธฐ ์ ๊ฒ€

  • Spring์˜ BeanFactory ์ด๋ฆ„์˜ "Factory"๋Š” ์ด ํŒจํ„ด๊ณผ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋Š”๊ฐ€?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.67


Unit 5.3 โ€” ๋‘ ํŒจํ„ด์˜ ํ•œ๊ณ„

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

ํ•ต์‹ฌ ํ•œ๊ณ„

์ƒ์†์„ ์ด์šฉํ•œ ๋ถ„๋ฆฌ์˜ ๋‹จ์ :

  • ๋‹จ์ผ ์ƒ์† ์ œ์•ฝ โ€” UserDao๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค ์ƒ์† ๋ถˆ๊ฐ€
  • ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒฐํ•ฉ โ€” ์ƒˆ DB ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์ƒˆ ํด๋ž˜์Šค ๋งŒ๋“ค๊ณ  ์ปดํŒŒ์ผ
  • ์ƒ์† ๊ด€๊ณ„์˜ ๊นจ์ง€๊ธฐ ์‰ฌ์›€ โ€” ๋ถ€๋ชจ ๋ณ€๊ฒฝ ์‹œ ์ž์‹ ๋‹ค ์˜ํ–ฅ

โ†’ ์ƒ์† ๋Œ€์‹  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค: ์ธํ„ฐํŽ˜์ด์Šค + ํ•ฉ์„ฑ(composition)

์ž๊ธฐ ์ ๊ฒ€

  • "Composition over Inheritance" ์›์น™์˜ ์˜๋ฏธ๋Š”?
  • ์ƒ์†์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋Œ€์ฒดํ•˜๋ฉด ๋ฌด์—‡์ด ์ข‹์•„์ง€๋Š”๊ฐ€?

๐Ÿ“š Phase 6 โ€” ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™ (OCP & ์ „๋žต ํŒจํ„ด)

๋ชฉํ‘œ: ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถ”๊ธฐ๋กœ OCP๋ฅผ ๋‹ฌ์„ฑํ•˜๊ณ , ์ „๋žต ํŒจํ„ด์œผ๋กœ ๋” ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ ๋‹ค.

Unit 6.1 โ€” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถ”๊ธฐ

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

ํ•ต์‹ฌ ๋ณ€ํ™”

public interface ConnectionMaker {
    Connection makeConnection();
}

public class UserDao {
    private ConnectionMaker connectionMaker;  // ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กด

    public UserDao(ConnectionMaker cm) {
        this.connectionMaker = cm;            // ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์Œ
    }

    public void add(User user) {
        Connection c = connectionMaker.makeConnection();
        // ...
    }
}

public class NConnectionMaker implements ConnectionMaker { ... }
public class DConnectionMaker implements ConnectionMaker { ... }

ํ•ต์‹ฌ ๋ณ€ํ™”:

  • UserDao๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด โ†’ ์–ด๋–ค ๊ตฌํ˜„์ฒด๊ฐ€ ์™€๋„ OK
  • UserDao ์ฝ”๋“œ๋Š” ์ƒˆ DB ์ถ”๊ฐ€์—๋„ ๋ณ€๊ฒฝ ์•ˆ ๋จ

์ž๊ธฐ ์ ๊ฒ€

  • ์ด ๊ตฌ์กฐ์—์„œ ConnectionMaker ๊ตฌํ˜„์ฒด๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ฑ…์ž„์€ ๋ˆ„๊ตฌ์—๊ฒŒ?
  • 1์ฃผ์ฐจ์˜ DIP(์˜์กด ์—ญ์ „ ์›์น™)์™€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”๊ฐ€?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.74~78


Unit 6.2 โ€” OCP (๊ฐœ๋ฐฉํ์‡„์›์น™)

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

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

"ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค"

UserDao์˜ ๋ณ€ํ™”:

  • ์ƒˆ DB ์ง€์› = ConnectionMaker ๊ตฌํ˜„์ฒด ์ถ”๊ฐ€ (ํ™•์žฅ) โœ…
  • UserDao ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ (๋ณ€๊ฒฝ ์—†์Œ) โœ…

โ†’ OCP ๋งŒ์กฑ

OCP๊ฐ€ ๊นจ์ง€๋Š” ์ฝ”๋“œ์˜ ์‹ ํ˜ธ:

  • if (type.equals("MySQL")) ... else if (type.equals("Oracle"))
  • switch ๋ฌธ์ด ์ƒˆ ์ผ€์ด์Šค ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ˆ˜์ •๋จ

์ž๊ธฐ ์ ๊ฒ€

  • OCP๋ฅผ 100% ์ง€ํ‚ค๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€?
  • OCP์™€ SRP๋Š” ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”๊ฐ€?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.83


Unit 6.3 โ€” ์ „๋žต ํŒจํ„ด

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

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

"ํ•„์š”์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ตฌ์ฒด ๊ตฌํ˜„์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š” ํŒจํ„ด"

์šฉ์–ด ๋งคํ•‘:

  • Context = UserDao
  • Strategy = ConnectionMaker (์ธํ„ฐํŽ˜์ด์Šค)
  • ConcreteStrategy = NConnectionMaker, DConnectionMaker

์ „๋žต ํŒจํ„ด์€ ๊ณง OCP์˜ ๊ตฌํ˜„ ๋„๊ตฌ:

  • ์ƒˆ ์ „๋žต = ConcreteStrategy ์ถ”๊ฐ€ (ํ™•์žฅ)
  • Context ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ ์—†์Œ

์ž๊ธฐ ์ ๊ฒ€

  • ์ „๋žต ํŒจํ„ด๊ณผ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์˜ ์ฐจ์ด๋Š”? (ํžŒํŠธ: ์ƒ์† vs ํ•ฉ์„ฑ)
  • Spring์—์„œ ์ „๋žต ํŒจํ„ด์ด ์‚ฌ์šฉ๋˜๋Š” ์‚ฌ๋ก€๋Š”?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.87


๐Ÿ“š Phase 7 โ€” ์ œ์–ด์˜ ์—ญ์ „ (IoC)

๋ชฉํ‘œ: ๊ฐ์ฒด ์ƒ์„ฑยท์—ฐ๊ฒฐยท๊ด€๋ฆฌ์˜ ์ฑ…์ž„์ด ์–ด๋””์„œ ์–ด๋””๋กœ ์˜ฎ๊ฒจ๊ฐ€๋Š”์ง€ ์ถ”์ ํ•œ๋‹ค.

Unit 7.1 โ€” IoC (์ œ์–ด์˜ ์—ญ์ „) ๊ฐœ๋…

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

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

์ „ํ†ต ๋ฐฉ์‹:

public class UserDao {
    public UserDao() {
        this.connectionMaker = new NConnectionMaker();  // ์ž๊ธฐ๊ฐ€ ๊ฒฐ์ •
    }
}

โ†’ UserDao๊ฐ€ ์ž์‹ ์ด ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์Šค์Šค๋กœ ๊ฒฐ์ •ยท์ƒ์„ฑ

IoC ๋ฐฉ์‹:

public class UserDao {
    public UserDao(ConnectionMaker cm) {
        this.connectionMaker = cm;  // ์™ธ๋ถ€์—์„œ ์ฃผ์ž…
    }
}

โ†’ "์–ด๋–ค ConnectionMaker๋ฅผ ์“ธ์ง€"์˜ ๊ฒฐ์ • ๊ถŒํ•œ์ด ์™ธ๋ถ€๋กœ ๋„˜์–ด๊ฐ

์ œ์–ด์˜ ์—ญ์ „:

  • ๊ฐ์ฒด๊ฐ€ ์ž์‹ ์ด ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์Œ
  • ๋ˆ„๊ฐ€ ๊ทธ ๊ฒฐ์ •์„ ํ•˜๋‚˜? โ†’ ๋‹ค๋ฅธ ๊ฐ์ฒด / ํ”„๋ ˆ์ž„์›Œํฌ / ์ปจํ…Œ์ด๋„ˆ

์ž๊ธฐ ์ ๊ฒ€

  • "์—ญ์ „(Inversion)"์—์„œ ๋ฌด์—‡์ด ๋ฌด์—‡์œผ๋กœ ๋’ค์ง‘ํžˆ๋Š”๊ฐ€?
  • main() ๋ฉ”์„œ๋“œ ์™ธ์— IoC๊ฐ€ ์–ด๋””์—์„œ ์ผ์–ด๋‚˜๋Š”๊ฐ€?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.92


Unit 7.2 โ€” ํ”„๋ ˆ์ž„์›Œํฌ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

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

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

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌํ”„๋ ˆ์ž„์›Œํฌ
๋ˆ„๊ฐ€ ํ๋ฆ„์„ ์ œ์–ด๋‚ด ์ฝ”๋“œํ”„๋ ˆ์ž„์›Œํฌ
ํ˜ธ์ถœ ๋ฐฉํ–ฅ๋‚ด ์ฝ”๋“œ โ†’ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌํ”„๋ ˆ์ž„์›Œํฌ โ†’ ๋‚ด ์ฝ”๋“œ
๋น„์œ ๋ง์น˜ (ํ•„์š”ํ•  ๋•Œ ๊บผ๋‚ด ์”€)๊ณต์žฅ (๋“ค์–ด๊ฐ€์„œ ์ผํ•จ)

Hollywood Principle: "Don't call us, we'll call you" (ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋„ˆ๋ฅผ ๋ถ€๋ฅธ๋‹ค)

์ž๊ธฐ ์ ๋ณ€

  • jQuery๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ๊ฐ€, ํ”„๋ ˆ์ž„์›Œํฌ์ธ๊ฐ€?
  • Spring์ด ํ”„๋ ˆ์ž„์›Œํฌ์ธ ์ด์œ ๋Š”?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.93


Unit 7.3 โ€” IoC ์ปจํ…Œ์ด๋„ˆ์˜ ์—ญํ• 

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

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

IoC๋ฅผ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€:

  • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  • ๊ฐ์ฒด ๊ฐ„ ๊ด€๊ณ„๋ฅผ ์„ค์ •
  • ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ

์ด ์—ญํ• ์„ ํ•˜๋Š” ๊ฒŒ IoC ์ปจํ…Œ์ด๋„ˆ = Spring์˜ ApplicationContext.

์ž๊ธฐ ์ ๊ฒ€

  • IoC ์ปจํ…Œ์ด๋„ˆ ์—†์ด IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€? (ํžŒํŠธ: main์—์„œ ๋‹ค ๋งŒ๋“ค๊ธฐ)
  • Spring ์™ธ์— IoC ์ปจํ…Œ์ด๋„ˆ์˜ ๋‹ค๋ฅธ ์˜ˆ๋Š”?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.94


๐Ÿ“š Phase 8 โ€” Spring ์ปจํ…Œ์ด๋„ˆ (ApplicationContext + DI)

๋ชฉํ‘œ: Spring์˜ ํ•ต์‹ฌ ํด๋ž˜์Šค ApplicationContext์™€ DI์˜ ๋™์ž‘์„ ์ดํ•ดํ•œ๋‹ค.

Unit 8.1 โ€” ๋นˆ ํŒฉํ† ๋ฆฌ์™€ ApplicationContext

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

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

  • ๋นˆ(Bean): Spring์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด
  • ๋นˆ ํŒฉํ† ๋ฆฌ(BeanFactory): ๋นˆ์„ ์ƒ์„ฑยท๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค
  • ApplicationContext: BeanFactory๋ฅผ ํ™•์žฅํ•œ ๋” ํ’๋ถ€ํ•œ ์ปจํ…Œ์ด๋„ˆ (์‹ค๋ฌด ํ‘œ์ค€)
@Configuration
public class DaoFactory {
    @Bean
    public UserDao userDao() {
        return new UserDao(connectionMaker());
    }
    @Bean
    public ConnectionMaker connectionMaker() {
        return new DConnectionMaker();
    }
}

ApplicationContext ctx = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao dao = ctx.getBean("userDao", UserDao.class);

์ž๊ธฐ ์ ๊ฒ€

  • @Bean ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์ด ๋นˆ์˜ ID๊ฐ€ ๋˜๋Š” ์ด์œ ๋Š”?
  • ApplicationContext๊ฐ€ BeanFactory๋ณด๋‹ค ๊ฐ–๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€? (ํžŒํŠธ: i18n, ์ด๋ฒคํŠธ)

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.95


Unit 8.2 โ€” getBean()์˜ ๋™์ž‘

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

ํ•ต์‹ฌ ๋™์ž‘

ctx.getBean("userDao") ํ˜ธ์ถœ ์‹œ ApplicationContext๋Š”:
1. ๋นˆ ๋ชฉ๋ก์—์„œ "userDao" ์ฐพ๊ธฐ
2. ์—†์œผ๋ฉด @Bean ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ โ†’ ๊ฐ์ฒด ์ƒ์„ฑ
3. ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๋นˆ๋„ ์ž๋™์œผ๋กœ ๊ฐ™์ด ์ƒ์„ฑยท์ฃผ์ž…
4. ๋งŒ๋“ค์–ด์ง„ ๋นˆ ๋ฐ˜ํ™˜

์ž๊ธฐ ์ ๊ฒ€

  • ์ฒ˜์Œ ํ˜ธ์ถœ๊ณผ ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ์˜ ๋™์ž‘ ์ฐจ์ด๋Š”? (ํžŒํŠธ: ๋‹ค์Œ Unit)
  • @Bean ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ getBean()์˜ ์ฐจ์ด๋Š”?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.100


Unit 8.3 โ€” ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ

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

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

getBean()์„ 100๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ๊ฐ์ฒด๋Š” 1๊ฐœ.

  • ApplicationContext = ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ
  • ๋ชจ๋“  ๋นˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค (ApplicationContext ์•ˆ์—์„œ)

์™œ ์‹ฑ๊ธ€ํ†ค?

  • ๋งค ์š”์ฒญ๋งˆ๋‹ค ๊ฐ์ฒด ์ƒˆ๋กœ ๋งŒ๋“ค๋ฉด ๋ฉ”๋ชจ๋ฆฌยทGC ๋ถ€๋‹ด
  • DAOยทService ๊ฐ™์€ ๋ฌด์ƒํƒœ ๊ฐ์ฒด๋Š” 1๊ฐœ๋กœ ์ถฉ๋ถ„
  • ์ „์—ญ ์ ‘๊ทผ ๊ฐ€๋Šฅ

์ฃผ์˜: ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ stateless ์—ฌ์•ผ ์•ˆ์ „:

  • ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์š”์ฒญ๋ณ„ ๋ฐ์ดํ„ฐ ๋ณด๊ด€ โŒ (๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์ถฉ๋Œ)
  • โ†’ 4์ฃผ์ฐจ์˜ ๋™์‹œ์„ฑ ๋ฌธ์ œ์™€ ์—ฐ๊ฒฐ๋จ!

์ž๊ธฐ ์ ๊ฒ€

  • ์ „ํ†ต ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด(getInstance())๊ณผ Spring ์‹ฑ๊ธ€ํ†ค์˜ ์ฐจ์ด๋Š”?
  • ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด ConcurrentHashMap์„ ํ•„๋“œ๋กœ ๊ฐ€์ ธ๋„ ๋˜๋Š” ์ด์œ ๋Š”?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.104~106


Unit 8.4 โ€” ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… (DI)

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

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

DI (Dependency Injection):

"๊ตฌ์ฒด์ ์ธ ์˜์กด ์˜ค๋ธŒ์ ํŠธ์™€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋Ÿฐํƒ€์ž„์— ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ž‘์—…"

3๊ฐ€์ง€ ํ•ต์‹ฌ:
1. ์˜์กด: A๊ฐ€ B๋ฅผ ์‚ฌ์šฉ (A โ†’ B)
2. ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด: A๋Š” B์˜ ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด (๊ตฌ์ฒด ๊ตฌํ˜„ ๋ชจ๋ฆ„)
3. ์™ธ๋ถ€ ์ฃผ์ž…: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๊ตฌ์ฒด ๊ตฌํ˜„์„ ์ฃผ์ž…

3๊ฐ€์ง€ ์ฃผ์ž… ๋ฐฉ์‹:

  • ์ƒ์„ฑ์ž ์ฃผ์ž… (๊ถŒ์žฅ โœ…)
  • Setter ์ฃผ์ž…
  • ํ•„๋“œ ์ฃผ์ž… (@Autowired ํ•„๋“œ)

์ž๊ธฐ ์ ๊ฒ€

  • DI์™€ IoC์˜ ๊ด€๊ณ„๋Š”? (ํžŒํŠธ: DI๋Š” IoC์˜ ํ•œ ํ˜•ํƒœ)
  • ์ƒ์„ฑ์ž ์ฃผ์ž…์ด ๊ถŒ์žฅ๋˜๋Š” ์ด์œ  3๊ฐ€์ง€๋Š”? (ํžŒํŠธ: final, ์ˆœํ™˜ ์ฐธ์กฐ ๊ฐ์ง€, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ)

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

Part A: ๋™์‹œ์„ฑ ๋งˆ๋ฌด๋ฆฌ

  1. ์Šค๋ ˆ๋“œ๋ฅผ ๋งŽ์ด ๋งŒ๋“ค์ˆ˜๋ก ํ•ญ์ƒ ๋น ๋ฅธ๊ฐ€? ๊ทธ๋ ‡์ง€ ์•Š์€ ์ด์œ  3๊ฐ€์ง€๋Š”?
  2. ๊ฐ€์‹œ์„ฑ๊ณผ ์›์ž์„ฑ์˜ ์ฐจ์ด๋ฅผ ์˜ˆ์‹œ๋กœ ์„ค๋ช…ํ•˜๋ผ
  3. synchronized / volatile / Atomic์˜ ํ•ด๊ฒฐ ๋ฒ”์œ„์™€ ์„ฑ๋Šฅ ๋น„๊ต๋Š”?
  4. CAS ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋™์ž‘ํ•˜๋Š” 4๋‹จ๊ณ„๋Š”?
  5. CAS์˜ ABA ๋ฌธ์ œ๋ž€?

Part B: ๊ฐ์ฒด ์„ค๊ณ„์˜ ์ง„ํ™”

  1. DAO์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ด์œ ๋Š”?
  2. "๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ"์˜ ์ •์˜๋Š”?
  3. ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์ด๋ฉด์„œ ๋™์‹œ์— ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์ธ ์ด์œ ๋Š”?
  4. ์ƒ์† ๊ธฐ๋ฐ˜ ๋ถ„๋ฆฌ์˜ ํ•œ๊ณ„ 3๊ฐ€์ง€๋Š”?
  5. ์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…์ด OCP๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•˜๋Š”๊ฐ€?

Part B: ๋””์ž์ธ ์›์น™๊ณผ ํŒจํ„ด

  1. OCP์˜ ์ •์˜๋ฅผ ์ž๊ธฐ ๋ง๋กœ ์„ค๋ช…ํ•˜๋ผ
  2. ์ „๋žต ํŒจํ„ด์˜ 3๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋Š”?
  3. ์ „๋žต ํŒจํ„ด๊ณผ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์˜ ์ฐจ์ด๋Š”?

Part B: IoC์™€ DI

  1. IoC์—์„œ ๋ฌด์—‡์ด ๋ฌด์—‡์œผ๋กœ ์—ญ์ „๋˜๋Š”๊ฐ€?
  2. ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฐ์ •์  ์ฐจ์ด๋Š”?
  3. ApplicationContext์˜ ์—ญํ•  4๊ฐ€์ง€๋Š”?
  4. getBean()์„ 100๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ๊ฐ์ฒด๊ฐ€ 1๊ฐœ์ธ ์ด์œ ๋Š”?
  5. ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด stateless์—ฌ์•ผ ํ•˜๋Š” ์ด์œ ๋Š”? (4์ฃผ์ฐจ ๋™์‹œ์„ฑ๊ณผ ์—ฐ๊ฒฐ)
  6. ์ƒ์„ฑ์ž ์ฃผ์ž…์ด ๊ถŒ์žฅ๋˜๋Š” ์ด์œ  3๊ฐ€์ง€๋Š”?
  7. DI์™€ IoC์˜ ๊ด€๊ณ„๋Š”?

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

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

๋ฐ˜๋“œ์‹œ ๊นŠ์ด ํŒŒ๊ธฐ:

  • Unit 2.4 โ€” Atomic + CAS ์•Œ๊ณ ๋ฆฌ์ฆ˜ (โ˜…โ˜…โ˜… ๋ฉด์ ‘ ๋‹จ๊ณจ)
  • Unit 4.1 ~ 4.3 โ€” ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ์˜ ์ง„ํ™” (Spring ์ดํ•ด์˜ ์ถœ๋ฐœ์ )
  • Unit 6.2 โ€” OCP (๋ชจ๋“  ๋””์ž์ธ ํŒจํ„ด์˜ ๋ฟŒ๋ฆฌ)
  • Unit 7.1 โ€” IoC ๊ฐœ๋… (Spring์˜ ์ •์‹ )
  • Unit 8.3 โ€” ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (์‹ค๋ฌด ๋™์‹œ์„ฑ ์ง๊ฒฐ)
  • Unit 8.4 โ€” DI (Spring์˜ ํ•ต์‹ฌ)

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

[ ] Phase 1 โ€” ์Šค๋ ˆ๋“œ ํ’€์˜ ํ•„์š”์„ฑ ์žฌ์ •๋ฆฌ (Unit 1.1~1.3)
[ ] Phase 2 โ€” ๋™์‹œ์„ฑ ์•ˆ์ „ ๋„๊ตฌ 3์ข… ๋น„๊ต (Unit 2.1~2.4)
[ ] Phase 3 โ€” ์ „ํ†ต DAO์˜ ๋ฌธ์ œ (Unit 3.1~3.3)
[ ] Phase 4 โ€” ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ (Unit 4.1~4.3)
[ ] Phase 5 โ€” ๋””์ž์ธ ํŒจํ„ด ์ ์šฉ (Unit 5.1~5.3)
[ ] Phase 6 โ€” OCP & ์ „๋žต ํŒจํ„ด (Unit 6.1~6.3)
[ ] Phase 7 โ€” ์ œ์–ด์˜ ์—ญ์ „ (Unit 7.1~7.3)
[ ] Phase 8 โ€” Spring ์ปจํ…Œ์ด๋„ˆ (Unit 8.1~8.4)
[ ] ์ข…ํ•ฉ ์ž๊ธฐ ์ ๊ฒ€ 20๋ฌธํ•ญ ํ†ต๊ณผ

5์ฃผ์ฐจ์˜ ๋‘ ํ๋ฆ„ ์—ฐ๊ฒฐ ํฌ์ธํŠธ

๋™์‹œ์„ฑ (Part A)Spring (Part B)
์Šค๋ ˆ๋“œ ํ’€ = "์Šค๋ ˆ๋“œ๋ฅผ ๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€"IoC ์ปจํ…Œ์ด๋„ˆ = "๊ฐ์ฒด๋ฅผ ๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€"
Atomic/synchronized = "๊ณต์œ  ์ž์› ๋ณดํ˜ธ"์‹ฑ๊ธ€ํ†ค ๋นˆ = "๊ณต์œ ๋˜๋Š” ๊ฐ์ฒด" โ†’ stateless ํ•„์š”
ExecutorService = ์Šค๋ ˆ๋“œ ์ถ”์ƒํ™”ApplicationContext = ๊ฐ์ฒด ์ถ”์ƒํ™”

โ†’ ๋‘ ํ๋ฆ„์˜ ๋ณธ์งˆ์€ "๊ด€๋ฆฌ ์ฑ…์ž„์˜ ์œ„์ž„" ์ด๋ผ๋Š” ๋™์ผํ•œ ์‚ฌ์ƒ.


1~5์ฃผ์ฐจ ํ†ตํ•ฉ ํ๋ฆ„

  • 1~3์ฃผ์ฐจ: ์ž๋ฐ” ์–ธ์–ด ์ž์ฒด ์ •๋ณต (OOPยทJVMยท์ปฌ๋ ‰์…˜ยทํ•จ์ˆ˜ํ˜•)
  • 4์ฃผ์ฐจ: ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์™€ ๋™์‹œ์„ฑ
  • 5์ฃผ์ฐจ (์ง€๊ธˆ): Atomic ๋งˆ๋ฌด๋ฆฌ + Spring IoC/DI ์ž…๋ฌธ โ† ์ž๋ฐ” โ†’ Spring ๋‹ค๋ฆฌ
profile
Software Developer

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