DI

์˜์กด์„ฑ ์ฃผ์ž…์ด๋ž€?

  • ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ, ์™ธ๋ถ€ (Framework ๋“ฑ)์— ์˜ํ•ด ๊ฐ์ฒด ์˜์กด์„ฑ์ด ์ฃผ์ž…๋˜๋Š” ์„ค๊ณ„ ํŒจํ„ด

  • ํ•„์š”๋กœ ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์Šค์Šค๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ฃผ์ž…๋ฐ›๋Š” ๊ธฐ๋ฒ•

    • ํ•„์š”ํ•œ ์ž์›์„ ์™ธ๋ถ€์—์„œ ๋„ฃ์–ด์ฃผ๋Š”๊ฒŒ ๋ฐ”๋กœ ์˜์กด์„ฑ ์ฃผ์ž…์ด๋‹ค

DI ์™€ IoC (Inversion of Control)

  • Dependency Injection์€ IoC ๊ฐœ๋…์ด ์ ์šฉ๋œ ๊ฒฐ๊ณผ๋ฌผ ์ค‘ ํ•˜๋‚˜์ด๋‹ค

    • ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค๋Š” ๊ฒƒ์„ IoC ์ ์ธ ํ–‰์œ„๋กœ ๋ฐ”๋ผ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, IoC์™€ ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ™์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค

DI์™€ DIP (Dependency Inversion Principle)

DI๋Š” DIP๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋ฒ•์ค‘ ํ•˜๋‚˜์ผ ๋ฟ ์„œ๋กœ ๊ฐ™์€ ๊ฐœ๋…์ด ์•„๋‹ˆ๋‹ค

์Šคํ”„๋ง์—์„œ์˜ ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ž€?

  • ์Šคํ”„๋ง์€ DI๋ผ๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“ˆ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”์–ด์ค€๋‹ค

  • ์Šคํ”„๋ง์—์„œ์˜ DI๋ž€ Spring IoC Container ๊ฐ€ ๊ฐœ๋ฐœ์ž ๋Œ€์‹  ์ •์˜๋œ ๋Œ€๋กœ Bean ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์˜์กด์„ฑ์„ ๋Œ€์‹  ์ฃผ์ž… ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค

    • ์—ฌ๊ธฐ์„œ IoC๋ž€ ์ œ์–ด์˜ ์—ญ์ „์ด๋ผ๋Š” ๋ง๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋˜ ๊ฒƒ์„, Spring์˜ IoC Container๊ฐ€ ๋Œ€์‹  ํ•ด์ค€๋‹ค๋Š” ๋ง์ด๋‹ค

์Šคํ”„๋ง์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€?

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด์•ผํ•˜๋Š” ์ผ

    • Bean class ์ž‘์„ฑ

    • ์ฃผ์ž…์„ ์œ„ํ•œ ์„ค์ • (xmlํŒŒ์ผ ๊ธฐ์ˆ  ๋˜๋Š” @(์–ด๋…ธํ…Œ์ด์…˜) ๊ธฐ์ˆ )

์™œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

  • ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ด์šฉํ•˜๋ฉด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค

  • ๋А์Šจํ•œ ๊ฒฐํ•ฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ , ์ด ๊ณผ์ •์—์„œ OCP ์›์น™์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค

    • OCP (Open Closed Principle - ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™)

      • ํ™•์žฅ์— ๋Œ€ํ•ด ์—ด๋ ค์žˆ๊ณ , ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™

  • ์Šคํ”„๋ง์€ IoC ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค

    • IoC๋ฅผ ์ด์šฉํ•˜๋ฉด ๋กœ์ง ์‹คํ–‰๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๋ฉฐ, ๊ตฌํ˜„ ๊ฐ„์˜ ์ „ํ™˜์ด ์‰ฌ์›Œ์ง„๋‹ค

    • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Bean์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž์˜ ๊ด€๋ฆฌ ํฌ์ธํŠธ๊ฐ€ ์ค„์–ด๋“ ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค

    • IoC์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด ๋ฐ”๋กœ DI์ด๋‹ค

DI ๋ฐฉ์‹๊ณผ ์žฅ๋‹จ์ 

Spring Framework์—์„œ๋Š” Dependency Injection์„ 3๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค

์ƒ์„ฑ์ž (constructor) ์ฃผ์ž…

์ƒ์„ฑ์ž์— ์˜์กด์„ฑ ์ฃผ์ž…์„ ๋ฐ›๊ณ ์ž ํ•˜๋Š” field๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ๊ถŒ๊ณ ๋˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค

  • ์žฅ์ 

    • ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜์กด์„ฑ ์กด์žฌ ์—ฌ๋ถ€๊ฐ€ ๋ณด์žฅ๋˜๊ณ  ์˜์กด์ƒ์„ immutable ํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค

    • ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ ˆํผ๋Ÿฐ์Šค ์—†์ด๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋„๋ก ๊ฐ•์ œํ•œ๋‹ค

    • Spring 4.3 ์ด์ƒ๋ถ€ํ„ฐ๋Š”, ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ @Autowired๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค

      • ๋ฌต์‹œ์  ์ƒ์„ฑ์ž ์ž๋™ ์ฃผ์ž…

    • Circular Dependency (์ˆœํ™˜ ์ฐธ์กฐ) ์˜์กด์„ฑ์„ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ๋‹ค

    • ์˜์กด์„ฑ ๋Œ€์ƒ field๋ฅผ final ๋กœ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค

    • Test case ์ž‘์„ฑ ์‹œ, ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ ์ฃผ์ž…์ด ์šฉ์ดํ•˜๋‹ค

  • ๋‹จ์ 

    • ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ์ˆœํ™˜ ์ฐธ์กฐ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ต๋‹ค

      • ์ด ๋•Œ ๋‚˜๋จธ์ง€ ์ฃผ์ž… ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ง€๋งŒ, ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค

์ˆ˜์ •์ž (setter) ์ฃผ์ž…

setter method์— @Autowired annotation์„ ์„ ์–ธํ•˜์—ฌ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์žฅ์ 

    • ์˜์กด์„ฑ์ด ์„ ํƒ์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ

    • ์ƒ์„ฑ์ž์— ๋ชจ๋“  ์˜์กด์„ฑ์„ ๊ธฐ์ˆ ํ•˜๋ฉด ๊ณผ๋„ํ•˜๊ฒŒ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์„ ํƒ์ ์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค

  • ์œ ์˜ํ•  ์ 

    • ์ฃผ์ž… ๋ฐ›์€ ์˜์กด์„ฑ์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, null ๊ฐ’์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๋‹จ์ 

    • ์˜์กด์„ฑ ์ฃผ์ž… ๋Œ€์ƒ ํ•„๋“œ์— final๋กœ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค

field ์ฃผ์ž… โ†’ Deprecated

member field์— @Autowired annotation์„ ์„ ์–ธํ•˜์—ฌ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์žฅ์ 

    • ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค

  • ๋‹จ์ 

    • ์˜์กด ๊ด€๊ณ„๊ฐ€ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์•„ ์ถ”์ƒ์ ์ด๊ณ , ์ด๋กœ ์ธํ•ด ์˜์กด์„ฑ ๊ด€๊ณ„๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค

    • SRP (Single Responsibility Principle: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™)์— ๋ฐ˜ํ•˜๋Š” anti-pattern

    • Unit test ์‹œ ์˜์กด์„ฑ ์ฃผ์ž…์ด ์šฉ์ดํ•˜์ง€ ์•Š๋‹ค

    • ์˜์กด์„ฑ ์ฃผ์ž… ๋Œ€์ƒ ํ•„๋“œ์— final์„ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค

๊ฒฐ๋ก : ์ƒ์„ฑ์ž ์ฃผ์ž…๊ณผ setter ์ฃผ์ž…์„ ์ ์ ˆํžˆ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜์ž!

Last updated

Was this helpful?