๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [Spring] 'Spring DI, IoC' ํŽธ

ybkยท2024๋…„ 4์›” 19์ผ

spring

๋ชฉ๋ก ๋ณด๊ธฐ
2/55
post-thumbnail

๐Ÿ”” 'Spring DI, IoC'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ Spring(์Šคํ”„๋ง)

Spring : ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์ž๋ฐ”์˜ ์˜คํ”ˆ์†Œ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋กœ ํŠน์ • ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ๋กœ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ ์ œ์–ด์˜ ์—ญ์ „์„ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • B ๊ฐ์ฒด๊ฐ€ A ๊ฐ์ฒด๋ฅผ new ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • B๋Š” A์— ์˜์กด(์‚ฌ์šฉ)ํ•ฉ๋‹ˆ๋‹ค. (๊ฐ•ํ•œ๊ฒฐํ•ฉ)
  • ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ setter(), ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

    • ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์™€ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. (์•ฝํ•œ ๊ฒฐํ•ฉ)

๐Ÿ’Ÿ IoC(Invesion of Control, ์ œ์–ด์˜ ์—ญ์ „)

IoC : ์ œ์–ด๊ถŒ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์žˆ์ง€ ์•Š๊ณ , ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ์–ด์„œ ํ•„์š”์— ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž์˜ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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


๐Ÿ’Ÿ DI (Dependency Injection, ์˜์กด์„ฑ ์ฃผ์ž…)

DI : ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ์ฒด Bean์„ ๋จผ์ € ์ƒ์„ฑํ•ด๋‘๊ณ  ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•œ ๊ฐ์ฒด์— ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์„ ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด๋ฅผ ์˜์กดํ•œ๋‹ค? : ๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ์ฒด์— ์˜์กดํ•˜๋‹ค๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง์ ‘ ์˜์กดํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ํ•ด์„œ ๊ฐ€์ ธ์˜ฌ ํ•„์š” ์—†์–ด์„œ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง€๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Animal ํด๋ž˜์Šค

  • ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. @Component ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๋นˆ์œผ๋กœ ์‚ฌ์šฉ๋  ๊ฒƒ์ž„์„ ์•Œ๋ ธ์Šต๋‹ˆ๋‹ค.

  1. ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection):

    • ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์˜์กดํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ 1ํšŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
    • ์ด ๋ฐฉ์‹์€ ์˜์กด์„ฑ์ด ํ•„์ˆ˜์ ์ผ ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ•œ ๋ฒˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • Spring์—์„œ๋Š” @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ, @Autowired์€ ์ƒ๋žต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ final ํ•„๋“œ์— ๋Œ€ํ•œ ์ดˆ๊ธฐํ™”๋Š” ์ƒ์„ฑ์ž์—์„œ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Zoo ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ Animal ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์Šต๋‹ˆ๋‹ค.
  • Zoo ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ Animal ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
Zoo zoo = new Zoo(animal);

  • ๋งค๋ฒˆ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ์ž์™€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.
  • @RequiredArgsConstructor ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด Animal ํ•„๋“œ์— ๋Œ€ํ•œ ์ƒ์„ฑ์ž๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜์ ์œผ๋กœ ์ฃผ์ž…ํ•ด์•ผ ํ•˜๋Š” ์˜์กด์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Setter ์ฃผ์ž…(Setter Injection):

    • Setter ์ฃผ์ž…์€ setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    • ์ด ๋ฐฉ์‹์€ ์„ ํƒ์ ์ธ ์˜์กด์„ฑ์„ ๊ฐ€์งˆ ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • public์œผ๋กœ ์—ด์–ด๋‘์–ด ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. (๋ˆ„๊ตฐ๊ฐ€ ์‹ค์ˆ˜๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)
    • Spring์—์„œ๋Š” ์—ญ์‹œ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ setter ์ฃผ์ž…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  1. ํ•„๋“œ ์ฃผ์ž…(Field Injection):

    • ํ•„๋“œ ์ฃผ์ž…์€ ํ•„๋“œ์— ์ง์ ‘ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    • ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝํ•˜๊ธฐ ํž˜๋“ค๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กด์ ์ด์—ฌ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค.
    • Spring์—์„œ๋Š” @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ํ•„๋“œ์— ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ ์ฃผ์ž…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐ŸŸฆ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

  • final(๋ถˆ๋ณ€์„ฑ)
    • ์ฒ˜์Œ ์‹คํ–‰๋  ๋•Œ ๋Œ€๋ถ€๋ถ„ ์ •ํ•ด์ง€๊ณ  ์ข…๋ฃŒ ์ „๊นŒ์ง€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋”ฑ 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ์ดํ›„์— ํ˜ธ์ถœ๋˜๋Š” ์ผ์ด ์—†์–ด ๋ถˆ๋ณ€ํ•˜๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐฉ์ง€
    • ์ˆœํ™˜ ์ฐธ์กฐ๋ž€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ด€๊ณ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B๋ฅผ ์ฐธ์กฐํ•˜๊ณ , ๋™์‹œ์— ๊ฐ์ฒด B๊ฐ€ ๊ฐ์ฒด A๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ƒํ™ฉ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„๋“œ์ฃผ์ž…, ์ˆ˜์ •์ž์ฃผ์ž…์€ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์˜ˆ์ธกํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค ์ง„ํ–‰์ „ ๋ฏธ๋ฆฌ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

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