week 1 sangyun - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

์ž๋ฐ”

JVM,JDK,JRE๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • JDK๋Š” Java Development Kit์˜ ์•ฝ์ž
    • JDK๋Š” JRE๋ฟ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ํ”„๋กœ๊ทธ๋žจ๋“ค๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
    • ์ปดํŒŒ์ผ๋Ÿฌ, ์‹คํ–‰ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ๋“ฑ์ด ํฌํ•จ
  • JRE๋Š” Java Runtime Environment์˜ ์•ฝ์ž
    • JVM์„ ์„ค์น˜ํ•  ๋•Œ ์„ ํƒํ•˜๋Š” ๋„๊ตฌ
    • ์ž๋ฐ” ์‹คํ–‰์— ๊ด€๋ จ๋œ ํŒŒ์ผ๋“ค๋„ ํ•จ๊ป˜ ๊ตฌ์„ฑ
  • Java 11๋ถ€ํ„ฐ๋Š” JDK์— JRE๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Œ

์ž๋ฐ” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค

  • ์ž๋ฐ”์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ JVM์ด ์‹คํ–‰๋˜๋ฉด์„œ OS๋กœ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค.

  • Runtime Data Area๊ฐ€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.

  • Class(Method)

    • ํด๋ž˜์Šค ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„, ๋ฐ์ดํ„ฐ ํƒ€์ž…, ์ ‘๊ทผ ์ œ์–ด์ž ์ •๋ณด๊ฐ™์€ ํ•„๋“œ ์ •๋ณด์™€ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„
  • Stack

    • ์Šค๋ ˆ๋“œ๋ณ„๋กœ ๋ณ„๋„ ์ƒ์„ฑ
    • ์ง€์—ญ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ด ๊ฐ’, ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋˜๋Š” ์ž„์‹œ ๊ฐ’๋“ฑ์ด ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ
  • Heap

    • new ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ
  • Native Method

    • java๊ฐ€ ์•„๋‹Œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์˜์—ญ
  • PC Register

    • ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ
    • ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„์˜ ์ฃผ์†Œ์™€ ๋ช…๋ น์„ ์ €์žฅ
  • Java8 ๋ถ€ํ„ฐ ํž™์˜์—ญ์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊น€

    • PERMEN GEN์„ ์—†์• ๊ณ  METASPACE๋ผ๋Š” ๊ณต๊ฐ„์ด ์ƒ๊น€
    • Permen Gen ์˜์—ญ์—๋Š” ํด๋ž˜์Šค,๋ฉ”์†Œ๋“œ์˜ ๋ฉ”ํƒ€์ •๋ณด, static ๋“ฑ์ด ์ €์žฅ
    • static object๋ฅผ ์ƒ์„ฑํ•˜๋Š”๊ฒฝ์šฐ ๊ฐ์ฒด์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ด PermGen์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— OOM ๋ฐœ์ƒ
    • Java8 ์—์„œ๋Š” Metaspace๋ฅผ ๋„์ž…ํ•ด์„œ Static Object ๋ฐ ์ƒ์ˆ˜ํ™”๋œ String Object๋ฅผ heap ์˜์—ญ์œผ๋กœ ์˜ฎ๊ฒจ์„œ ์ตœ๋Œ€ํ•œ GC ๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค

minor GC : Heap ์˜์—ญ์˜ young generation

young generation์€ eden ์˜์—ญ๊ณผ survivor์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„ ํ•œ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐ์ฒด ๋Œ€๋ถ€๋ถ„์€ eden ์˜์—ญ์— ์˜ฌ๋ผ๊ฐ€๊ณ  ๋”์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋Š” GC๋‹นํ•˜๊ณ  ์‚ด์•„ ๋‚จ๋Š” ๊ฐ์ฒด๋Š” survivor๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ์ด๋•Œ, survivor ์˜์—ญ์ด ๊ฝ‰ ์ฐจ๋ฉด ๊ทธ์ค‘ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ survivor๋กœ์ด๋™ ์‹œํ‚จ๋‹ค. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” old generation์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

major GC : Heap ์˜์—ญ์˜ old generation

Serial GC

  • ์ ์€ ๋ฉ”๋ชจ๋ฆฌ์™€ CPU์ฝ”์–ด๊ฐ€ ์ ์„๋•Œ ์‚ฌ์šฉ
  • Old ์˜์—ญ์—์„œ ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„(Mark)
  • heap ์•ž ๋ถ€๋ถ„๋ถ€ํ„ฐ ํ™•์ธํ•˜์—ฌ ์‚ด์•„์žˆ๋Š” ๊ฒƒ๋งŒ ๋‚จ๊ธด๋‹ค(Sweep)
  • ๊ฐ ๊ฐ์ฒด๋“ค์ด ์—ฐ์†๋˜๊ฒŒ ์Œ“์ด๋„๋ก ํž™์˜ ๊ฐ€์žฅ ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฑ„์›Œ์„œ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค(Compaction)

Parallel GC

  • Serial GC์™€ ๊ฐ™์€ ๋ฐฉ์‹์ด์ง€๋งŒ GC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ด๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ์™€ CPU ์ฝ”์–ด๊ฐ€ ๋งŽ์„๋•Œ ์œ ๋ฆฌํ•˜๋‹ค.

Concurrent Mark & Sweep GC (CMS)

  • mark ๋‹จ๊ณ„์—์„œ๋Š” ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๋งŒ ์ฐพ๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚ธ๋‹ค.
  • concurrent mark ๋‹จ๊ณ„์—์„œ๋Š” ๋ฐฉ๊ธˆ ์‚ด์•„์žˆ๋‹ค๊ณ  ํ™•์ธํ•œ ๊ฐ์ฒด์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ํ™•์ธ(์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ์—์„œ ๋™์‹œ์— ์ง„ํ–‰)
  • remark ๋‹จ๊ณ„์—์„œ๋Š” concurrent mark๋‹จ๊ณ„์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ฐธ์กฐ๊ฐ€ ๋Š๊ธด ๊ฐ์ฒด๋ฅผ ํ™•์ธ
  • concurrent sweep ๋‹จ๊ณ„์—์„œ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…(์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ์—์„œ ๋™์‹œ์— ์ง„ํ–‰)
  • JVM์ด ๋ฉˆ์ถ”๋Š” ์‹œ๊ฐ„์ด ๋งค์šฐ ์งง๋‹ค.
  • ์‘๋‹ต ์†๋„๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ• ๋•Œ ์‚ฌ์šฉ
  • CPU ์ฝ”์–ด์™€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋†’๋‹ค.
  • compaction ๋‹จ๊ณ„๊ฐ€ ์—†์Œ

G1(Garbage First) GC

  • initial mark
  • root region scan
  • concurrent mark
  • remark
  • cleanup
  • copy

https://d2.naver.com/helloworld/1329 https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html


์Šคํ”„๋ง

์Šคํ”„๋ง ๋ถ€ํŠธ์™€ ์Šคํ”„๋ง์˜ ์ฐจ์ด

์Šคํ”„๋ง

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„ ์›Œํฌ๋Š” ์ž๋ฐ” ํ”Œ๋žซํผ์„ ์ด์šฉํ•ด์„œ ์›น์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํ•˜๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์ง‘์ค‘
  • ํ•ต์‹ฌ์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์„œ๋น„์Šค ๊ธฐ๋Šฅ์„ POJO์—๊ฒŒ ์ œ๊ณต
    • POJO ๋Š” Plain Old Java Oeject์˜ ์•ฝ์ž๋กœ ํ™˜๊ฒฝ๊ณผ ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์žฌํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„๋œ ๊ฐ์ฒด
  • Spring JDBC, Spring MVC, Spring Security, Spring AOP, Spring ORM ํ”„๋กœ์ ํŠธ์™€ Dependency Injection, IoC๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ฆฌ์•กํ‹ฐ๋ธŒ ์Šคํƒ
    • ์Šคํ”„๋ง WebFlux
    • ๋ฉ€ํ‹ฐ์ฝ”์–ด, ์ฐจ์„ธ๋Œ€ ํ”„๋กœ์„ธ์„œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์‹œ์— ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋…ผ๋ธ”๋กœํ‚น I/O
  • ์„œ๋ธ”๋ฆฟ ์Šคํƒ
    • ์Šคํ”„๋ง MVC
    • ์„œ๋ธ”๋ฆฟ API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šค๋ ˆ๋“œ๋‹น ํ•˜๋‚˜์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋ธ๋กœ ๋™๊ธฐ ๋ธ”๋กœํ‚น I/O ๋ฐฉ์‹์ด๋‹ค.

์Šคํ”„๋ง ๋ถ€ํŠธ

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ๋งŽ์€ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋Š” ์Šคํ”„๋ง์„ ์ด์šฉํ•ด์„œ ์›น์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์„ค์ •์„ ์ž๋™ํ™”ํ•œ ํ”„๋กœ์ ํŠธ์ด๋‹ค.

์Šคํ”„๋ง์˜ ํŠน์ง•์— ๋Œ€ํ•ด์„œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋น—๋Œ€์–ด ์„ค๋ช…ํ•˜์‹œ์˜ค

Dipendency Injection์ด ํ•„์š”ํ•œ ์ด์œ ?

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ• ๋•Œ ํ•˜๋‚˜์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐํ•ฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์ด ์˜ฌ๋ผ๊ฐ€๊ฒŒ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋“ค๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ์‹ฌํ•ด์ง€๊ณ  ๋†’์€ ๊ฒฐํ•ฉ๋„๋กœ ์ธํ•ด์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํž˜๋“ค์–ด์ง€๊ณ  ๋ณ€๊ฒฝํ•˜๊ธฐ ํž˜๋“ค์–ด์ง„๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ๊ณผ ์˜์กด ๊ด€๊ณ„์˜ ์—ฐ๊ฒฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋‹น ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋Œ€์‹  ํ•ด์ค€๋‹ค.

DI ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด์šฉํ•ด์„œ ์ธ์Šคํ„ด์Šค ๊ด€๋ฆฌ์‹œ ์žฅ์ ์€?

  • ์ธ์Šคํ„ด์Šค์˜ ์Šค์ฝ”ํ”„๋ฅผ ์ œ์–ด
  • ์ธ์Šคํ„ด์Šค์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ œ์–ด
  • AOP ๋ฐฉ์‹์œผ๋กœ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ง‘์–ด๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์˜์กดํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ์„œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.

BeanFactory, ApplicationContext ?

  • BeanFactory๋Š” ์Šคํ”„๋ง ์„ค์ •ํŒŒ์ผ(applicaitonContext.xml)์— ๋“ฑ๋ก๋œ bean ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•œ๋‹ค. ๋˜ํ•œ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ตฌ๋™๋  ๋•Œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ์˜ ์š”์ฒญ์— ์˜ํ•ด์„œ๋งŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.(์ง€์—ฐ ๋กœ๋”ฉ)

  • ApplicationContext๋Š” BeanFactory๋ฅผ ์ƒ์†ํ•˜์˜€๋Š”๋ฐ BeanFactory๊ธฐ๋Šฅ์— ๋”ํ•ด ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋‚˜ ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜์˜ ๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ตฌ๋™๋˜๋Š” ์‹œ์ ์— bean์— ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์„ ๊ฐ์ฒดํ™”ํ•˜๋Š” ์ฆ‰์‹œ ๋กœ๋”ฉ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘.

  • ApplicationContext์˜ ๊ตฌํ˜„์ฒด์ธ AnnotationConfigApplicationContext ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

Bean์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

  • Initialize : Bean Object๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  DI๋ฅผ ๋งˆ์นœ ํ›„ ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ
  • @PostConstruct : ์ดˆ๊ธฐํ™” ํ•˜๊ณ  ์‹ถ์€ ๋ฉ”์„œ๋“œ์— @PostConstruct ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด ์Šคํ”„๋ง์ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์ดˆ๊ธฐํ™”
  • @Bean(initMethod) : @Bean์–ด๋…ธํ…Œ์ด์…˜์˜ initMethod ์†์„ฑ์„ ์ด์šฉํ•ด ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • InitializingBean : InitializingBean ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์Šคํ”„๋ง์ด afterPropertiesSet ๋ฉ”์„œ๋“œ๋ฅผ ์ดˆ๊ธฐํ™”์‹œ์— ํ˜ธ์ถœํ•œ๋‹ค.
  • @PreDestory : ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ ๋  ๋•Œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๋ฉ”์„œ๋“œ์— ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด ๋œ๋‹ค.
  • DisposableBean : DisposableBean์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์Šคํ”„๋ง์ด destroy๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
  • @Bean(destoryMethod) : destroyMethod ์†์„ฑ์„ ์ด์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ์‹œ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • close & shutDown : DisposableBeanAdapter์— ์˜ํ•ด ์‹คํ–‰

Bean ์Šค์ฝ”ํ”„๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

  • Singleton

    • ์Šคํ”„๋ง ๋นˆ(Beam)์€ ๊ธฐ๋ณธ์ ์œผ๋กœ singleton ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑ์ด๋œ๋‹ค. singleton ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ์— ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜๊ฒฐ๊ณผ์ฒ˜๋Ÿผ applicationContext.getBean()์œผ๋กœ ๊ฐ™์€ ํƒ€์ž…์„ 2๊ฐœ ๊ฐ€์ง€๊ณ ์™€๋„ ๋‘๊ฐœ์˜ ํ•ด์‰ฌ์ฝ”๋“œ๋Š” ๊ฐ™์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
package com.spring.core.springcore;

import com.spring.core.springcore.basic.BinarySearchimpl;
import com.spring.core.springcore.basic.BubbleSortAlgorithm;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringCoreApplication {

	public static void main(String[] args) {

		/**
		 * How to check beans in Spring Framework
		 *
		 * 1. What are the beans? @Component annotation
		 * 2. What are the dependencies of a bean? @Autowired annotation
		 * 3. Where to search for beans? package com.spring.core.springcore์— ์œ„์น˜ํ•œ SpringCoreApplication ํด๋ž˜์Šค์˜ @SpringBootApplication ์–ด๋…ธํ…Œ์ด์…˜์— ์˜ํ•ด ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์ด ์‹คํ–‰๋œ๋‹ค.
		 */


		ApplicationContext applicationContext =
				SpringApplication.run(SpringCoreApplication.class, args);


		//singleton bean
		BinarySearchimpl binarySearch1 = applicationContext.getBean(BinarySearchimpl.class);

		//singleton bean
		BinarySearchimpl binarySearch2 = applicationContext.getBean(BinarySearchimpl.class);

		//same hashCode  because of singleton bean
		System.out.println(binarySearch1 == binarySearch2);

	}

}

  • Prototype

    • ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์–ด๋””์—์„œ ๋นˆ์„ ์ฃผ์ž…๋ฐ›๋˜ ํ•ญ์ƒ ๋™์ผํ•œ ๋นˆ์„ ์ฃผ์ž…๋ฐ›๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ๋นˆ ์ฃผ์ž…๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋นˆ์„ ์ƒ์„ฑํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊ฒฝ์šฐ์—๋Š” Prototype ๋นˆ์„ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. Prototype ์œผ๋กœ ๋นˆ์„ ์ƒ์„ฑํ•˜๋ฉด ๋นˆ์„ ์ฃผ์ž…ํ• ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. @Scope ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ํƒ€์ž…์„ ์„ค์ •ํ•˜๋ฉด ์„ค์ •๋œ ํƒ€์ž…์œผ๋กœ ๋นˆ์ด ์ƒ์„ฑ๋œ๋‹ค.
    • ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ƒ์„ฑ๋œ A ๋นˆ์— ํ”„๋กœํ† ํƒ€์ž…์ธ B ๋นˆ์„ ์ฃผ์ž…ํ•˜๋ฉด A๋นˆ ์ž์ฒด๊ฐ€ ๋‹จ ํ•œ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— B๋˜ํ•œ ํ•ญ์ƒ ๋™์ผํ•œ ๋นˆ์„ ์‚ฌ์šฉํ•˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
package com.spring.core.springcore.basic;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class BinarySearchimpl{

    @Autowired
    @Qualifier("quick")
    private SortAlgorithm sortAlgorithm;

    public int binarySearch(int [] numbers, int numberToSearchFor) {
        int [] sortedNumbers = sortAlgorithm.sort(numbers);
        return 3;
    }

}

package com.spring.core.springcore;

import com.spring.core.springcore.scope.PersonDAO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class SpringCoreScopeApplication {

    private static Logger logger = LoggerFactory.getLogger(SpringCoreScopeApplication.class);

    public static void main(String[] args) {




        ApplicationContext applicationContext =
                SpringApplication.run(SpringCoreBasicApplication.class, args);

        PersonDAO personDao1 =
                applicationContext.getBean(PersonDAO.class);
        PersonDAO personDao2 =
                applicationContext.getBean(PersonDAO.class);

        logger.info("{}", personDao1.getJdbcConnection());
        logger.info("{}", personDao2.getJdbcConnection());
        logger.info("{}", personDao1);
        logger.info("{}", personDao2);

    }

}

package com.spring.core.springcore.scope;


import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class JdbcConnection {


    public JdbcConnection() {
        System.out.println("JDBC Connection");
    }
}
package com.spring.core.springcore.scope;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
public class PersonDAO {
    @Autowired
    JdbcConnection jdbcConnection;

    public JdbcConnection getJdbcConnection() {
        return jdbcConnection;
    }

    public void setJdbcConnection(JdbcConnection jdbcConnection) {
        this.jdbcConnection = jdbcConnection;
    }
}
  • Request
    • request ๋‹จ์œ„๋งˆ๋‹ค ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • Session
    • ํ•˜๋‚˜์˜ Bean ์ •์˜์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์˜ HTTP Session์˜ ์ƒ๋ช…์ฃผ๊ธฐ ์•ˆ์— ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์กด์žฌํ•œ๋‹ค.
  • global session
    • ํ•˜๋‚˜์˜ Bean ์ •์˜์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์˜ global HTTP Session์˜ ์ƒ๋ช…์ฃผ๊ธฐ ์•ˆ์— ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์กด์žฌํ•œ๋‹ค.

Dependency Injection ๋ฐฉ๋ฒ• ์„ค๋ช…

  • Field Injection
  • Setter Based Injection
  • Constructor based Injection

Constructor based Injection์„ ์‚ฌ์šฉํ•˜์ž

  • IoC์ปจํ…Œ์ด๋„ˆ์™€ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ์—†์ด๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค. (POJO)
  • final์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ถˆ๋ณ€ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (์‹คํ–‰ ์ค‘์— ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.)
  • ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ตฌ๋™๋˜์ง€ ์•Š๋Š”๋‹ค. (์‚ฌ์ „์— ๊ฐ์ง€ ๊ฐ€๋Šฅ)

์ฃผ์ž…๋Œ€์ƒ์ด ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

  • @Autowired ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•  ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒฝ์šฐ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
    • ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๊ฐ€ 2๊ฐœ ์žˆ์„๊ฒฝ์šฐ @Autowired๋Š” Type์„ ๊ธฐ์ค€์œผ๋กœ ์ฃผ์ž… ๊ฐ์ฒด๋ฅผ ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
  • @Qualifier์€ ๊ฐ™์€ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ bean๊ฐ์ฒด๊ฐ€ ์žˆ์„๊ฒฝ์šฐ @Qualifier ์–ด๋…ธํ…Œ์ด์…˜์˜ ์œ ๋ฌด๋ฅผ ํ™•์ธํ•ด์„œ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค.
  • @Primary๋Š” ๊ฐ™์€ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ bean ๊ฐ์ฒด๊ฐ€ ์žˆ์„๊ฒฝ์šฐ ๊ทธ ์ค‘ @Primary ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ๊ฐ์ฒด๋งŒ ์šฐ์„ ์ˆœ์œ„๋กœ ์žก์•„์„œ ์ฃผ์ž…์ด ๋œ๋‹ค.

AOP ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

AOP ๊ฐœ๋…

  • Cross Cutting Concert(ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ)๋ฅผ ํ•œ ๊ณณ์— ๋ชจ์•„์„œ ์ฒ˜๋ฆฌํ•˜์ž
  • ์ธ์ฆ ์ฒ˜๋ฆฌ ํ˜น์€ ๊ณตํ†ต ๋กœ๊ทธ ์ˆ˜์ง‘๊ณผ ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ AOP๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ˜„

AOP๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ?

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์‹œ ์†Œ์Šค์ฝ”๋“œ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๋กœ๊น…์ด๋‚˜ ์บ์‹œ์™€ ๊ฐ™์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฌด๊ด€ํ•œ ๋‚ด์šฉ์ด ์ฝ”๋“œ์— ํฌํ•จ

AOP๋ฅผ ์ด์šฉํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ

  • DRT(Do not Repeat Yourself)
  • ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•˜๋‹ค.

AOP ์›๋ฆฌ

  • Proxy๋ฅผ ์ด์šฉํ•œ AOP ๊ตฌํ˜„
    • Proxy๋Š” ํƒ€๊ฒŸ์„ ๊ฐ์‹ธ์„œ ํƒ€๊ฒŸ์˜ ์š”์ฒญ์„ ๋Œ€์‹  ๋ฐ›์•„์ฃผ๋Š” Wrapping ์˜ค๋ธŒ์ ํŠธ

    • ํ˜ธ์ถœ์ž์—์„œ ํƒ€๊ฒŸ์„ ํ˜ธ์ถœํ•˜๋ฉด ํƒ€๊ฒŸ์ด ์•„๋‹Œ ํƒ€๊ฒŸ์„ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” Wrapping ์˜ค๋ฒ„์ ํŠธ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์„œ ์ „์ฒ˜๋ฆฌ,ํ›„์ฒ˜๋ฆฌ ๋“ฑ์„ ์ง„ํ–‰

    • Dynamic Proxy

      • ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์ ์šฉ๊ฐ€๋Šฅ
      • java ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
    • CGLIB

      • ํด๋ž˜์Šค์— ์ ์šฉ๊ฐ€๋Šฅ (final ํด๋ž˜์Šค์—๋Š” ์ ์šฉ ๋ถˆ๊ฐ€)
      • BCI๋ฅผ ํ†ตํ•ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•ด์„œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
      • ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ cglib ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ๋‹ค.
      • cglib๊ฐ€ ์กฐ๊ธˆ ๋” ๋น ๋ฅด๊ณ  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๋‹ค.

PSA

Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. DB๋ฅผ ๊ต์ฒดํ•ด๋„ ์ฝ”๋“œ ๋ณ€ํ™”๋Š” ์—†๋‹ค.

์Šคํ”„๋ง์˜ ์„œ๋น„์Šค ์ถ”์ƒํ™”๋ž€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค

Spring์ด ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ธํ„ฐํŽ˜์ด์Šค Service Abstraction ๋•๋ถ„์— ๊ธฐ์ˆ ์ด ๋ณ€ํ•˜๋”๋ผ๋„ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์€ ๊ฑฐ์˜ ์—†๋‹ค.

  • PSA(Portable Service Abstraction)
  • ํ™˜๊ฒฝ๊ณผ ๊ตฌํ˜„ ๊ธฐ์ˆ ์˜ ๋ณ€๊ฒฝ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์ˆ ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›
  • ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์˜ ์„œ๋น„์Šค ์ถ”์ƒํ™” ์ œ๊ณต
    • ํŠธ๋žœ์žญ์…˜,์บ์‹œ,๋ฉ”์ผ,๋ฉ”์‹œ์ง•
  • POJO๊ธฐ๋ฐ˜ ์ˆœ์ˆ˜ ๊ฐ์ฒด(๋น„์ฆˆ๋‹ˆ์Šค ์˜ค๋ธŒ์ ํŠธ)๋Š” ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค ์ถ”์ƒํ™”(์บ์‹œ๋งค๋‹ˆ์ €)๋กœ ์บ์‹œ๋ฅผ ์ œ์–ด
  • @Cacheable์™€ ๊ฐ™์œผ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„์ฒด๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ๊ธฐ์ˆ ์„ ๋ฐ”๊พธ์–ด ์ƒ์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ตฌํ˜„๊ธฐ์ˆ ์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋น„์ฆˆ๋‹ˆ์Šค ์˜ค๋ธŒ์ ํŠธ์—๋Š” ์˜ํ–ฅ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

์•„ํ‚คํ…์ฒ˜

๊ฐ์ฒด์ง€ํ–ฅ๊ณผ ์ ˆ์ฐจ์ง€ํ–ฅ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค

  • ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„๊ธฐ๋ฒ•์€ ๊ฐ์ฒด๋“ค๊ฐ„์— ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉด์„œ ํ˜‘๋ ฅ์„ ํ†ตํ•ด ์„ค๊ณ„๋ฅผ ํ•œ๋‹ค.
  • ์ ˆ์ฐจ์ง€ํ–ฅ ๊ธฐ๋ฒ•์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์ ˆ์ฐจ์— ์ดˆ์ ์„ ๋งž์ถฐ์„œ ์„ค๊ณ„ํ•œ๋‹ค.

SOLID ์›์น™์— ๋Œ€ํ•ด ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•˜์‹œ์˜ค

  • SRP(Single Responsibility Principle) : ํ•œ ํด๋ž˜์Šค๋Š” ๋‹จ ํ•œ๊ฐ€์ง€ ์—ญํ• ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • OCP(Open-Closed Principle) : ๋™์ž‘ํ•˜๊ณ  ์žˆ๋˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ๋ง๋ถ™์—ฌ์„œ ํ™•์žฅํ•œ๋‹ค.
  • LSP(Liskob Subsitution Principle) : ์ž์‹ ํƒ€์ž…์€ ๋ถ€๋ชจํƒ€์ž…์œผ๋กœ ์น˜ํ™˜๊ฐ€๋Šฅ
  • ISP(Interface Segregation Principle) : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  • DIP(Dependency Inversion Principle) : ์ถ”์ƒํ™”์— ์˜์กดํ•˜์ž.

์บก์Šํ™”์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค

  • ์บก์Šํ™”๋Š” ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๊ฒƒ์ด๋ผ๋„ ๊ฐ์ถ”๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋‚ด๋ถ€ ๊ตฌํ˜„์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์™ธ๋ถ€์˜ ๊ฐ์ฒด๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์œผ๋ฉด ์•ˆ๋œ๋‹ค.
  • ์„ค๊ณ„์—์„œ ๋ณ€ํ•˜๋Š”๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๊ณ ๋ คํ•˜๊ณ  ๋ณ€ํ•˜๋Š” ๊ฐœ๋…์„ ์บก์Šํ™” ํ•ด์•ผํ•œ๋‹ค.