SpringFramework 01. IoC & Container - swkim0128/PARA GitHub Wiki


type: Spring archive: false

IoC & Container

IoC (Inversion of Control, ์ œ์–ด์˜ ์—ญํ–‰)


IoC/DI

๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ Object ๊ฐ„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ •

๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋А์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋จ(loose coupling)

IoC์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ DI

IoC ์œ ํ˜•


!Untitled 39.png

  • Dependency Lookup

    ์ปจํ…Œ์ด๋„ˆ๊ฐ€ lookup contenxt๋ฅผ ํ†ตํ•ด์„œ ํ•„์š”ํ•œ Resource๋‚˜ Object๋ฅผ ์–ป๋Š” ๋ฐฉ์‹.

    JNDI ์ด์™ธ์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด JNDI ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์˜ค๋ธŒ์ ํŠธ ๋‚ด์—์„œ ์ผ์ผ์ด ๋ณ€๊ฒฝํ•ด ์ฃผ์–ด์•ผ ํ•จ

    Lookup ํ•œ Object๋ฅผ ํ•„์š”ํ•œ ํƒ€์ž…์œผ๋กœ Casting ํ•ด ์ฃผ์–ด์•ผ ํ•จ.

    Naming Exception์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ง์ด ํ•„์š”

  • Dependency Injection

    Object์— lookup ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ง์ ‘ ์˜์กด ๊ตฌ์กฐ๋ฅผ Object์— ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์ •ํ•ด ์ฃผ๋Š” ๋ฐฉ์‹

    Object๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์˜ ์กฐ์žฌ ์—ฌ๋ถ€๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†์Œ

    Lookup ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์ด Object ๋‚ด์—์„œ ์‚ฌ๋ผ์ง

    Setter Injection๊ณผ Constructor Inject

Container


  • Container๋ž€?

    ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์‚ฌ์šฉ ์†Œ๋ฉธ์— ํ•ด๋‹นํ•˜๋Š” ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๋‹ด๋‹น

    ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ธฐ๋ณธ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ์— ํ•„์š”ํ•œ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต

  • Container ๊ธฐ๋Šฅ

    ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ

    Dependency ๊ฐ์ฒด ์ œ๊ณต

    Thread ๊ด€๋ฆฌ

    ๊ธฐํƒ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ

  • Container ํ•„์š”์„ฑ

    ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์™ธ์— ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ

    ์„œ๋น„์Šค look up์ด๋‚˜ Configuration์— ๋Œ€ํ•œ ์ผ๊ด€์„ฑ์„ ๊ฐ–๊ธฐ ์œ„ํ•จ

    ์„œ๋น„์Šค ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ๊ฐ Factory ๋˜๋Š” Singleton ํŒจํ„ด์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋จ

  • IoC Container

    ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„์„ค์ •, ์‚ฌ์šฉ, ์ œ๊ฑฐ๋“ฑ์˜ ์ž‘์—…์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋Œ€์‹  ๋…๋ฆฝ๋œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ด๋‹น

    ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฝ”๋“œ ๋Œ€์‹  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์„ ๊ฐ–๊ณ  ์žˆ์–ด IoC๋ผ๊ณ  ๋ถ€๋ฆ„

    ์ด๋Ÿฐ ์ด์œ ๋กœ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ IoC์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ.

    ์Šคํ”„๋ง์—์„œ IoC๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์—๋Š” BeanFactory, ApplicatoinContext๊ฐ€ ์žˆ์Œ.

  • Spring DI Container

    Spring DI Container๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋นˆ(Bean)์ด๋ผ ํ•˜๊ณ , ์ด ๋นˆ๋“ค์˜ ์ƒ๋ช…์ฃผ๊ธฐ(Life-Cycle)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์˜๋ฏธ๋กœ ๋นˆํŒฉํ† ๋ฆฌ(BeanFactory)๋ผ ํ•œ๋‹ค.

    Bean Factory์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ApplicationContext๋ผ ํ•œ๋‹ค.

    !Untitled 1 17.png

    !Untitled 2 16.png

IoC ๊ฐœ๋…


๊ฐ์ฒด ์ œ์–ด ๋ฐฉ์‹

  • ๊ธฐ์กด : ํ•„์š”ํ•œ ์œ„์น˜์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง ๊ตฌํ˜„
  • IoC : ๊ฐ์ฒด ์ƒ์„ฑ์„ Container ์—๊ฒŒ ์œ„์ž„ํ•˜์—ฌ ์ฒ˜๋ฆฌ

IoC ์‚ฌ์šฉ์— ๋”ฐ๋ฅธ ์žฅ์ 

  • ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Œ (loose coupling)

๊ฐ์ฒด๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์œผ๋ฉด?

  • ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์œ ์ง€๋ณด์ˆ˜ ๋ ๋•Œ ๊ทธ ํด๋ž˜์Šค์™€ ๊ฒฐํ•ฉ๋œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋„ ๊ฐ™์ด ์œ ์ง€ ๋ณด์ˆ˜ ๋˜์–ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ.

๊ฐ์ฒด๊ฐ„ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ

  • ํด๋ž˜์Šค ํ˜ธ์ถœ ๋ฐฉ์‹

  • ํด๋ž˜์Šค ๋‚ด์— ์„ ์–ธ๊ณผ ๊ตฌํ˜„์ด ๋ชจ๋‘ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ

    !Untitled 3 15.png

๊ฐ์ฒด ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค.

  • ์ธํ„ฐํŽ˜์ด์Šค ํ˜ธ์ถœ ๋ฐฉ์‹

  • ๊ตฌํ˜„ ํด๋ž˜์Šค ๊ต์ฒด๊ฐ€ ์šฉ์ดํ•˜์—ฌ ๋‹น์•ผํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™”๊ฐ€๋Šฅ

  • ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค ๊ต์ฒด ์‹œ ํ˜ธ์ถœ ํด๋ž˜์Šค๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ.

    !Untitled 4 12.png

๊ฐ์ฒด ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ Factory๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค

  • ํŒฉํ† ๋ฆฌ ํ˜ธ์ถœ ๋ฐฉ์‹

  • ํŒฉํ† ๋ฆฌ ๋ฐฉ์‹์€ ํŒฉํ† ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค๋Š” ํ”ฝํ† ๋ฆฌ๋ฅผ ํ˜ธ์ถœ

  • ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€๊ฒฝ ์‹œ ํŒฉํ† ๋ฆฌ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋จ. ํ˜ธ์ถœ ํด๋ž˜์Šค์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ

  • ํ•˜์ง€๋งŒ ํด๋ž˜์Šค์— ํŒฉํ† ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์†Œ์Šค๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•จ. ๊ทธ๊ฒƒ ์ž์ฒด๊ฐ€ ํŒฉํ† ๋ฆฌ์— ์˜์กดํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

    !Untitled 5 11.png

๊ฐ์ฒด ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ Assembler๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค

  • IoC ํ˜ธ์ถœ ๋ฐฉ์‹

  • ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์žฅ์ ์„ ๋”ํ•˜์—ฌ ์–ด๋– ํ•œ ๊ฒป์—๋„ ์˜์กดํ•˜์ง€ ์•Š์€ ํ˜•ํƒœ๊ฐ€ ๋จ.

  • ์‹คํ–‰์‹œ์ (Runtime)์— ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ์ด ๋จ

    !Untitled 6 9.png

Spring DI ์šฉ์–ด ์ •๋ฆฌ


  • ๋นˆ(Bean)

    ์Šคํ”„๋ง์ด IoC ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งํ•œ๋‹ค.

    ์Šคํ”„๋ง์ด ์ง์ ‘ ๊ทธ ์ƒ์„ฑ๊ณผ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋งŒ์„ Bean์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

  • ๋นˆ ํŒฉํ† ๋ฆฌ(BeanFactory)

    ์Šคํ”„๋ง์ด IoC๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ์ปจํ…Œ์ด๋„ˆ

    Bean์„ ๋“ฑ๋ก, ์ƒ์„ฑ, ์กฐํšŒ, ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹น

    ์ผ๋ฐ˜์ ์œผ๋กœ BeanFactory๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ด๋ฅผ ํ™•์žฅํ•œ ApplicationContext๋ฅผ ์ด์šฉํ•œ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(ApplicationContext)

    BeanFactory๋ฅผ ํ™•์žฅํ•œ IoC ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค.

    Bean์„ ๋“ฑ๋กํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์€ BeanFactory์™€ ๋™์ผํ•˜๋‹ค

    ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ฐ€์ข… ๋ถ€๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์ œ๊ณตํ•œ๋‹ค.

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

  • ์„ค์ • ์ •๋ณด / ์„ค์ • ๋ฉ”ํƒ€ ์ •๋ณด(configuration metadata)

    ์Šคํ”„๋ง์˜ ์„ค์ •์ •๋ณด๋ž€ ApplicationContext ๋˜๋Š” BeanFactory๊ฐ€ IoC๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๋งํ•œ๋‹ค. ์ด๋Š” ๊ตฌ์„ฑ ์ •๋ณด ๋‚ด์ง€๋Š” ํ˜•์ƒ์ •๋ณด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

    ์„ค์ • ์ •๋ณด๋Š” IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” Bean๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋จ.

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ

    ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” IoC์ปจํ…Œ์ด๋„ˆ, ApplicationContext๋ฅผ ํฌํ•จํ•ด์„œ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ†ตํ‹€์–ด ๋งํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

Spring Container


!Untitled 7 8.png

โš ๏ธ **GitHub.com Fallback** โš ๏ธ