[Spring] DI / IoC


Spring - DI / IoC



IoC


IoC๋ž€ Inversion of Control์˜ ์ค„์ž„๋ง๋กœ ํ•œ๊ธ€๋กœ ๋ฒˆ์—ญํ•˜๋ฉด ์ œ์–ด์˜ ์—ญ์ „์ด๋ผ๋Š” ๋ง์ด๋‹ค.

โ€œ์ œ์–ด์˜ ์—ญ์ „โ€ ์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋ฉ”์†Œ๋“œ๋‚˜ ๊ฐ์ฒด์˜ ํ˜ธ์ถœ์ž‘์—…์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,

์™ธ๋ถ€์—์„œ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๊ด€๋ฆฌ๊นŒ์ง€ ๋ชจ๋“ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ ์˜์กด๊ด€๊ณ„ ๊ฒฐ์ •(component dependency resolution),

    ์„ค์ •(configuration) ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ(lifecycle)๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ ํŒจํ„ด(Design Pattern)์ด๋‹ค.

์ œ์–ด์˜ ์—ญ์ „ ๊ฐœ๋…์€ ์ด๋ฏธ ํญ๋„“๊ฒŒ ์ ์šฉ๋˜์–ด ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์€ main() ๋ฉ”์†Œ๋“œ์—์„œ ์‹œ์ž‘ํ•ด์„œ

๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฏธ๋ฆฌ ์ •ํ•œ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‹คํ–‰๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์„œ๋ธ”๋ฆฟ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ์„œ๋ธ”๋ฆฟ์„ ๊ฐœ๋ฐœํ•ด์„œ ์„œ๋ฒ„์— ๋ฐฐํฌํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๋ฐฐํฌํ•˜๊ณ  ๋‚˜์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€

์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‹ค. ๋Œ€์‹  ์„œ๋ธ”๋ฆฟ์— ๋Œ€ํ•œ ์ œ์–ด ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ ์ ˆํ•œ ์‹œ์ ์—

์„œ๋ธ”๋ฆฟ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์ด ๋ฐฉ์‹์€ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ,

๊ฐœ๋ฐœ์ž๋Š” ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ๊ฐœ๋ฐœํ•ด์„œ ๋ผ์›Œ ๋„ฃ๊ธฐ์˜ ํ˜•ํƒœ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— ํ•„์š”ํ•œ ๋ถ€ํ’ˆ์„ ๊ฐœ๋ฐœํ•˜๊ณ ,

์กฐ๋ฆฝํ•˜๋Š” ๋ฐฉ์‹์˜ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์กฐ๋ฆฝ๋œ ์ฝ”๋“œ์˜ ์ตœ์ข… ํ˜ธ์ถœ์€ ๊ฐœ๋ฐœ์ž์— ์˜ํ•ด์„œ ์ œ์–ด๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,

ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋‚ด๋ถ€์—์„œ ๊ฒฐ์ •๋œ ๋Œ€๋กœ ์ด๋ค„์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ โ€œ์ œ์–ด์˜ ์—ญ์ „โ€์ด๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

์Šคํ”„๋ง์€ ๊ทธ ์ž์ฒด๊ฐ€ โ€œ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์กŒ๋‹คโ€ ๋ผ๋Š” ๋œป์ด๋‹ค.

99A1C04D5C70D71432

IoC๊ฐ€ ์•„๋‹Œ๊ฒฝ์šฐ - new ๋ฐฉ์‹์„ ์จ์„œ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ• ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

IoC์ธ๊ฒฝ์šฐ - new ๋ฐฉ์‹์„ ์จ์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”์—†๋‹ค.


IoC ์ปจํ…Œ์ด๋„ˆ

์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณดํ†ต ์ธ์Šคํ„ด์Šค์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋“ค์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋„ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ƒ์„ฑ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ์ฆ‰, IoC ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

  • IoC ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ์ฑ…์ž„์ง€๊ณ , ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • POJO์˜ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ์„œ๋น„์Šค, ์†Œ๋ฉธ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง„๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋“ค์ด ์ง์ ‘ POJO๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๋งก๊ธด๋‹ค.
  • ๋นˆ(Bean) : ์Šคํ”„๋ง์ด ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์ง์ ‘ ๋งŒ๋“ค๊ณ  ๊ด€๊ณ„๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ
  • ๋นˆ ํŒฉํ† ๋ฆฌ(Bean Factory) : ๋นˆ(์˜ค๋ธŒ์ ํŠธ)์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„ ์„ค์ • ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” IoC์˜ค๋ธŒ์ ํŠธ. ์ข€ ๋” ํ™•์žฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(application context)๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ: (IoC ์ปจํ…Œ์ด๋„ˆ or ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ) DI๋ฅผ ์œ„ํ•œ ๋นˆ ํŒฉํ† ๋ฆฌ์— ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ
  • ์„ค์ •์ •๋ณด/์„ค์ • ๋ฉ”ํƒ€์ •๋ณด : ๊ตฌ์„ฑ์ •๋ณด or ํ˜•์ƒ์ •๋ณด (XML)
  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ(IoC ์ปจํ…Œ์ด๋„ˆ) : IoC ๋ฐฉ์‹์œผ๋กœ ๋นˆ์„ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋‚˜ ๋นˆ ํŒฉํ† ๋ฆฌ๋ฅผ ์˜๋ฏธ
IoC์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค๋ฅธ ์šฉ์–ด๋กœ ๋นˆ ํŒฉํ† ๋ฆฌ(Bean Factory), ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context) ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.์Šคํ”„๋ง์˜ IoC ์ปจํ…Œ์ด๋„ˆ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋งํ•œ๋‹ค.
 

* ๋นˆ ํŒฉํ† ๋ฆฌ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ๋˜๋Š” IoC์ปจํ…Œ์ด๋„ˆ๋ผ ๋งํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ์‚ฌ์‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋Š” ๋นˆ์„ ์ข€ ๋” ํ™•์žฅํ•œ ๊ฐœ๋…์ด๋‹ค.
* ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋Š” ๊ทธ ์ž์ฒด๋กœ IoC์™€ DI๋ฅผ ์œ„ํ•œ ๋นˆ ํŒฉํ† ๋ฆฌ(Bean Factory)์ด๋ฉด์„œ ๊ทธ ์ด์ƒ์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„๋‹ค.
* ๋นˆํŒฉํ† ๋ฆฌ์™€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ปจํ…์ŠคํŠธ๋Š” ๊ฐ๊ฐ BeanFactory, ApplicationContext ๋‘ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•œ๋‹ค.
* ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค๋Š” BeanFactory ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ ์„œ๋ธŒ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
* ์‹ค์ œ๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” IoC ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ ์ด ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค.
* ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ณธ๊ฒฉ์ ์ธ IoC ์ปจํ…Œ์ด๋„ˆ๋กœ์„œ ๋™์ž‘ํ•˜๋ ค๋ฉด POJOํด๋ž˜์Šค์™€ ์„ค์ • ๋ฉ”ํƒ€์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

(์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ : POJO ํด๋ž˜์Šค์™€ ์„ค์ • ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ์ด์šฉํ•ด IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ์กฐํ•ฉ์ด๋‹ค.)


IoC ์ปจํ…Œ์ด๋„ˆ

์–ด๋– ํ•œ ๊ฐ์ฒด์˜ ๋ช…์„ธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์Šคํ”„๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ•ด๋‹น ๋ช…์„ธ๋Œ€๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ. ์ƒ์„ฑ๋œ ๊ฐ์ฒด(๊ทธ๋ฆฌ๊ณ  ๋””ํŽœ๋˜์‹œ)๋“ค์„ ๋ณด๊ด€ํ•˜๋Š” ๊ณต๊ฐ„์„ ์˜๋ฏธํ•จ

DL(Dependency Lookup) ๊ณผ DI(Dependency Injection)

  • DL : ์ €์žฅ์†Œ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” Bean์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์ด์šฉํ•˜์—ฌ Bean์„ Lookup ํ•˜๋Š” ๊ฒƒ
  • DI : ๊ฐ ํด๋ž˜์Šค๊ฐ„์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ๋นˆ ์„ค์ •(Bean Definition) ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ
    • Setter Injection
    • Constructor Injection
    • Method Injection

DL ์‚ฌ์šฉ์‹œ ์ปจํ…Œ์ด๋„ˆ ์ข…์†์ด ์ฆ๊ฐ€ํ•˜์—ฌ, ์ฃผ๋กœ DI๋ฅผ ์‚ฌ์šฉํ•จ.

99A9A0455C5A74AB20


IoC ์šฉ์–ด ์ •๋ฆฌ

  • bean : ์Šคํ”„๋ง์—์„œ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์ง์ ‘ ๋งŒ๋“ค์–ด ๊ด€๊ณ„๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ Java Bean, EJB์˜ Bean๊ณผ ๋น„์Šทํ•œ ์˜ค๋ธŒ์ ํŠธ ๋‹จ์œ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋นˆ์€ ์•„๋‹ˆ๋‹ค. ์Šคํ”„๋ง์˜ ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๊ณ„์„ค์ •, ์‚ฌ์šฉ์„ ์ œ์–ดํ•ด์ฃผ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งํ•œ๋‹ค.
  • bean factory : ์Šคํ”„๋ง์˜ IoC๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ์ปจํ…Œ์ด๋„ˆ Bean์„ ๋“ฑ๋ก/์ƒ์„ฑ/์กฐํšŒ/๋ฐ˜ํ™˜/๊ด€๋ฆฌ ํ•œ๋‹ค. ๋ณดํ†ต bean factory๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ด๋ฅผ ํ™•์žฅํ•œ application context๋ฅผ ์ด์šฉํ•œ๋‹ค. BeanFactory๋Š” bean factory๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” interface์ด๋‹ค. (getBean()๋“ฑ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.)
  • application context : bean factory๋ฅผ ํ™•์žฅํ•œ IoC ์ปจํ…Œ์ด๋„ˆ Bean์˜ ๋“ฑ๋ก/์ƒ์„ฑ/์กฐํšŒ/๋ฐ˜ํ™˜/๊ด€๋ฆฌ ๊ธฐ๋Šฅ์€ bean factory์™€ ๊ฐ™์ง€๋งŒ, ์ถ”๊ฐ€์ ์œผ๋กœ spring์˜ ๊ฐ์ข… ๋ถ€๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ApplicationContext๋Š” application context๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” interface์ด๋ฉฐ, BeanFactory๋ฅผ ์ƒ์†ํ•œ๋‹ค.
  • configuration metadata : application context ํ˜น์€ bean factory๊ฐ€ IoC๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”ํƒ€์ •๋ณด ์Šคํ”„๋ง์˜ ์„ค์ •์ •๋ณด๋Š” ์ปจํ…Œ์ด๋„ˆ์— ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์„ธํŒ…ํ•˜๊ฑฐ๋‚˜ ์กฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ฃผ๋กœ bean์„ ์ƒ์„ฑ/๊ตฌ์„ฑํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • container (ioC container) : IoC ๋ฐฉ์‹์œผ๋กœ bean์„ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ bean factory๋‚˜ application context๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. application context๋Š” ๊ทธ ์ž์ฒด๋กœ ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณดํ†ต ์—ฌ๋Ÿฌ๊ฐœ์˜ ApplicationContext ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ์ด๋ฅผ ํ†ต์นญํ•ด์„œ spring container๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.


DI


DI๋ž€ Dependency Injection์˜ ์ค„์ž„๋ง๋กœ ํ•œ๊ธ€๋กœ ๋ฒˆ์—ญํ•˜๋ฉด ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ๋Š” ๋ง์ด๋‹ค.

DI๋ฅผ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—, ์˜์กด์„ฑ์ด๋ผ๋Š” ๋ง๋ถ€ํ„ฐ ํ•œ๋ฒˆ ๋ณด์ž

* ์˜์‚ฌ ์ฝ”๋“œ

  ์šด์ „์ž๊ฐ€ ์ž๋™์ฐจ๋ฅผ ์ƒ์‚ฐํ•œ๋‹ค.
  ์ž๋™์ฐจ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํƒ€์ด์–ด๋ฅผ ์ƒ์‚ฐํ•œ๋‹ค.

* Java ํ‘œํ˜„
  new Car();
  Car ๊ฐ์ฒด ์ƒ์„ฑ์ž์—์„œ new Tire();

* ์ •๋ง ๊ฐ„๋‹จํžˆ ์˜์กด์„ฑ์ด๋ž€?

  ์˜์กด์„ฑ์€ new ์ด๋‹ค.
  new๋ฅผ ์‹คํ–‰ํ•˜๋Š” Car์™€ Tire ์‚ฌ์ด์—์„œ Car๊ฐ€ Tire์— ์˜์กดํ•œ๋‹ค๋ผ๊ณ  ํ•œ๋‹ค.


์ผ์ฒดํ˜•

  • Composition : HAS-A ๊ด€๊ณ„
  • A๊ฐ€ B๋ฅผ ์ƒ์„ฑ์ž์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ด€๊ณ„

275F4C4254E6C6A20C

โ€œ์˜์กด์„ฑ ์ฃผ์ž…โ€์€ ์ œ์–ด์˜ ์—ญํ–‰์ด ์ผ์–ด๋‚  ๋•Œ ์Šคํ”„๋ง์ด ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

์ž๋ฐ”์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์˜์กด์ ์ธ ๊ฐ์ฒด์˜ ๊ด€๊ณ„๋ฅผ ์ตœ๋Œ€ํ•œ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.


๋ถ„๋ฆฌ / ๋„ํ‚น(๋ถ€์ฐฉ) ํ˜•

  • Association ๊ด€๊ณ„
  • A๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๋…€์„์ด ๋งŒ๋“  B ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ

23213E4654E6C6DB2D

๊ทธ๋ฆผ ์„ค๋ช…
A๋ฅผ ์Šค๋งˆํŠธํฐ, B๋ฅผ ๋ฐฐํ„ฐ๋ฆฌ๋ฆฌ๋ผ ํ•˜๋ฉด,
์ผ์ฒดํ˜• ์Šค๋งˆํŠธํฐ (์•„์ดํฐ)์€ ๋ฐ”๋กœ ์ „์›์„ ์ผœ๋„ ๋˜์ง€๋งŒ,
๋ฐฐํ„ฐ๋ฆฌ ํƒˆ๋ถ€์ฐฉ ํ˜•ํƒœ์˜ ์Šค๋งˆํŠธํฐ (๊ฐค๋Ÿญ์‹œS)์€ ์—ฌ๊ธฐ์„œ๋Š” ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ๋„ฃ๊ณ , ์ „์›์„ ๋„ฃ์–ด์•ผ ํ•จ.

์ผ์ฒดํ˜•์€ A๋ผ๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ๋ถ„๋ฆฌํ˜•์€ A์™€ B๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ธํŒ…ํ•ด ์ฃผ์–ด์•ผ ํ•จ. ๋‹จ, ๋ถ„๋ฆฌํ˜•์€ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ(๋‹ค๋ฅธ ๋ฐฐํ„ฐ๋ฆฌ)์œผ๋กœ ๋ฐ”๊พธ์–ด ๋ถ€์ฐฉํ•  ์ˆ˜ ์žˆ์Œ. ์ด๊ฒƒ์„ DI์˜ ๊ฐœ๋…์ด๋ผ ๋ณด๋ฉด ๋จ.


์˜์กด์„ฑ ์ฃผ์ž…์€ ๋ง ๊ทธ๋Œ€๋กœ ์˜์กด์ ์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,

ํŠน์ • ๊ฐ์ฒด์— ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€์—์„œ ๊ฒฐ์ •ํ•ด์„œ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ฆ‰, ์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์ถ”์ƒ์ ์œผ๋กœ ๋ฌถ์–ด๋‘” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋‹ค ์“ฐ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‚˜๋จธ์ง€๋Š” ์Šคํ”„๋ง์—์„œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ์ธํ•ด ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง€๊ณ  ์œ ์—ฐ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

  • Setter Injection (Setter ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์‚ฝ์ž…) : ์˜์กด์„ฑ์„ ์ž…๋ ฅ ๋ฐ›๋Š” setter ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.
  • Constructor Injection (์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์‚ฝ์ž…) : ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.
  • Method Injection (์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์‚ฝ์ž…) : ์˜์กด์„ฑ์„ ์ž…๋ ฅ ๋ฐ›๋Š” ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž. Player ๊ฐ์ฒด์— ์žˆ๋Š” Weapon์ด๋ผ๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์„ ์„ธํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ํ•˜๊ณ  ์žˆ๋‹ค. Gun์œผ๋กœ ํ•˜๋“  Spike๋กœ ํ•˜๋“  ๋ฌด๊ธฐ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ ๊ทธ ๋ฌด๊ธฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‹จ์ˆœํžˆ ์ฃผ์ž…ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

class Knife implements Weapon{

    public void useWeapon() {
        System.out.println("Use Knife");
    }
}

class Gun implements Weapon{

    public void useWeapon() {
        System.out.println("Use Gun");
    }
}

class Spike implements Weapon{

    public void useWeapon() {
        System.out.println("Use Spike");
    }
}

interface Weapon {

    void useWeapon();
}

public class Player {

    private Weapon weapon;

    Player(){
    }

    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }

    public void usePlayerWeapon() {
        weapon.useWeapon();
    }
}

public class Main {
    public static void main(String[] args) {
        /**
         * ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ์˜์กด ์š”์†Œ๋“ค์„ ์‰ฝ๊ฒŒ ๊ฐˆ์•„ ๋ผ์šธ ์ˆ˜ ์žˆ๋‹ค.
         */
        Player player = new Player();

        player.setWeapon(new Gun());   // Player์— Gun ๊ฐ์ฒด๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…
        player.usePlayerWeapon();

        player.setWeapon(new Spike()); // Player์— Spike ๊ฐ์ฒด๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…
        player.usePlayerWeapon();

        player.setWeapon(new Knife()); // Player์— Knife ๊ฐ์ฒด๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…
        player.usePlayerWeapon();
    }
}

์Šคํ”„๋ง์—๋Š” ํฌ๊ฒŒ (1)XML๋กœ ์ž‘์„ฑ๋œ Bean ์ •์˜ ํŒŒ์ผ์„ ์ด์šฉํ•œ DI

(2)์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ DI

(3)JavaConfig์— ์˜ํ•œ DI๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


(1-1) XML config.xml

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

XML (์Šคํ”„๋ง DI) config.xml

<bean id=โ€œrecordโ€ class=โ€œdi.SprRecordโ€></bean> // ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ
<bean id=โ€œviewโ€ class=โ€œdi.SprRecordViewโ€> // ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ
  <property name=โ€œrecordโ€ ref=โ€œrecordโ€></property> // setRecord() ํ˜ธ์ถœ 
</bean>

XML (์Šคํ”„๋ง DI) : ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ, ํŒจํ‚ค์ง€๋ช…์„ ํฌํ•จํ•œ ํ’€ ํด๋ž˜์Šค ๋„ค์ž„ ์ž‘์„ฑ.
XML์— ์ž‘์„ฑ๋œ ๋ช…์„ธ์„œ๋ฅผ ๋ณด๊ณ , IoC์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ’์„ ์ฃผ์ž…ํ•ด์คŒ.
์—ฌ๊ธฐ์„œ ApplicationContext ๊ฐ€ IoC์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•จ.

JAVA
// XML์„ ํŒŒ์‹ฑํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์— ๋‹ด๋Š” ์ž‘์—…
ApplicationContext ctx = new ClassPathXmlApplicationContext(โ€œconfig.xmlโ€);
RecordView = (RecordView) ctx.getBean(โ€œviewโ€);


(1-2) XML(Bean) Sample

* ๋นˆ(Bean) ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉ. ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒํด๋ž˜์Šค๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ.
* ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ, ๊ฐ์ฒด ์ดˆ๊ธฐํ™”, ๊ฐ์ฒด ๊ฐ’(๋˜๋Š” ๋ ˆํผ๋Ÿฐ์Šค) ์ฃผ์ž….

1)
<bean id=โ€œrecordโ€ name=โ€œr1,r2 r3;r4โ€ class=โ€œdi.SprRecordโ€>
    <property name=โ€œkorโ€ value=โ€œ20โ€></property>
</bean>

2)
<bean id=โ€œrecordโ€ name=โ€œr1,r2 r3;r4โ€ class=โ€œdi.SprRecordโ€>
    <constructor-arg value=โ€œ20โ€></constructor-arg>
</bean>

3)
<bean id=โ€œrecordโ€ name=โ€œr1,r2 r3;r4โ€ class=โ€œdi.SprRecordโ€>
    <constructor-arg name=โ€œkorโ€ value=โ€œ20โ€></constructor-arg>
</bean>

4)
<bean id=โ€œrecordโ€ โ€ name=โ€œr1,r2 r3;r4โ€ class=โ€œdi.SprRecordโ€
    p:kor=โ€œ50โ€ p:eng=โ€œ60โ€ p:math=โ€œ70โ€>

5)
<bean id=โ€œviewโ€ class=โ€di.SprRecordViewโ€>
    <property name=โ€œrecordโ€ ref=โ€œrecordโ€></property>
</bean>
 

id : ๋นˆ ๊ฐ์ฒด ๊ณ ์œ  ์ด๋ฆ„ (์ ‘๊ทผ ๊ฐ€๋Šฅ์ž)
name : ๊ฐ์ฒด์˜ ์ด๋ฆ„(๋ณ„์นญ)
class : ์ƒ์„ฑํ•  ํด๋ž˜์Šค
constructor-arg : ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • (์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์‚ฌ์šฉ)
property : ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • (Setterํ•จ์ˆ˜ ์‚ฌ์šฉ)

1) ์ด๋ฆ„์ด record์ธ ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ / ๋ณ„๋ช… 4๊ฐœ : r1,r2,r3,r4 / SprReocrd ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ.
   ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ kor ๋ผ๋Š” ํ”„๋กœํผํ‹ฐ์— 20๊ฐ’ ๋Œ€์ž… (setํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•ด์•ผ ์œ„์™€ ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ ์„ค์ •์ด ๊ฐ€๋Šฅ).
2) ์ด๋ฆ„์ด record์ธ ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ / ์ƒ์„ฑ์ž(์ธ์ž๊ฐ€ ํ•˜๋‚˜์ธ)๋ฅผ ํ†ตํ•ด์„œ ๊ฐ’ ๋Œ€์ž… & ์ƒ์„ฑ.
3) ์ƒ์„ฑ์ž ์ค‘์—์„œ kor ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ 20๊ฐ’ ๋Œ€์ž…ํ•˜๊ณ , ์ƒ์„ฑ.
4) 3๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด kor = 50, eng = 60, math = 70 ๋Œ€์ž… & ์ƒ์„ฑ.
5) ์ƒ์„ฑ๋œ record ๊ฐ์ฒด๋ฅผ setํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ์— ์ €์žฅํ•˜๊ณ  SprRecordView๋ฅผ ์ƒ์„ฑ.

์ฐธ๊ณ ๋กœ ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” value, ์ฐธ์กฐ(๋ ˆํผ๋Ÿฐ์Šค)๋ฅผ ๋Œ€์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ref ๋ฅผ ์‚ฌ์šฉ.


(2-1)์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ DI


@Autowired์™€ @Component

์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์•ž์— @Autowired๋ฅผ ๋ถ™์ด๋ฉด DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ทธ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ํ˜•์— ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ @Component๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค ์ค‘์—์„œ ์ฐพ์•„๋‚ด ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์ ์…˜ํ•ด์ค๋‹ˆ๋‹ค(์ •ํ™•ํžˆ๋Š” Bean ์ •์˜์—์„œ ํด๋ž˜์Šค๋ฅผ ์Šค์บ”ํ•  ๋ฒ”์œ„๋ฅผ ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค). ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋กœ์˜ ์ธ์ ์…˜์€ ์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ private๋ผ๋„ ์ธ์ ์…˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Setter ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. (๊ณผ๊ฑฐ์— ์บก์Аํ™”์˜ ์ •๋ณด ์€๋‹‰์— ๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ƒ๋Š” ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, ํ˜„์žฌ๋Š” ํŽธ๋ฆฌํ•จ์— ๋ฐ€๋ ค ๊ทธ๋Ÿฐ ๋…ผ์˜๋ฅผ ๋ณด๊ธฐ ํž˜๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.)

๋งŒ์•ฝ @Component๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์–ด๋„ ํ˜•์ด ๋‹ค๋ฅด๋ฉด @Autowired๊ฐ€ ๋ถ™์€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์ธ์ ์…˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ˜•์„ ๋ณด๊ณ  ์ธ์ ์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ byType์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

@Autowired

@Autowired๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์•ž์— ๋ถ™์ด๋Š” ๊ฒƒ ์™ธ์—๋„, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ๋‹นํ•œ ๋ฉ”์„œ๋“œ ์„ ์–ธ ์•ž์—๋„ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Autowired
public void setFoo(Foo foo) {
    this.foo = foo;
}
@Autowired
public void setFoo(Foo foo, Bar bar) {
    this.foo = foo;
    this.bar = bar;
}

๋˜ํ•œ ์ƒ์„ฑ์ž์—๋„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public class Foo {
    @Autowired
    public Food(Bar b) {...}
}