Dependency Injection

Factory

  • ์ž๋ฐ”์—์„œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํด๋ž˜์Šค ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ , ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ์ข…์˜ ํŒจํ„ด์ด๋‹ค.

  • ์ด ํŒจํ„ด์€ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์บก์Šํ™”ํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๊ณ  ์ค‘์•™์ง‘์ค‘ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Component

  • Spring Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์—ฌ๊ธฐ์„œ Spring Bean์ด๋ž€ ์Šคํ”„๋ง์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋กœ์„œ ์Šคํ”„๋ง IoC์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

  • ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ spring์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” @Service, @Repository, @Controller ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์—๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

@Bean

  • ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” Bean์„ IoC์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

  • @Bean์€ ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง IoC์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•œ๋‹ค.

  • ์ฃผ๋กœ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋‹ค๋ฅธ ์„ค์ • ํŒŒ์ผ์—์„œ Bean ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ ๋“ฑ๋กํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

@ComponentScan

  • Component๋ฅผ Scanํ•˜๋Š” ์˜๋ฏธ๋กœ ๋ฐ›์•„๋“ค์ด๋ฉด ์‰ฝ๋‹ค. @Component๋ฅผ ์ด์šฉํ•˜์—ฌ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๋ ค๋Š” ํด๋ž˜์Šค๋“ค์„ ์ธ์‹ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ์Šค์บ” ๋Œ€์ƒ ํŒจํ‚ค์ง€๋‚˜ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// ํŒจํ‚ค์ง€๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์Šค์บ”
@ComponentScan(basePackages = "com.example") 

Spring AOP(Aspect Oriented Programming)

  • ํ•œ๊ตญ๋ง๋กœ ๊ด€์ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‹ค.

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์œผ๋กœ๋ถ€ํ„ฐ ๊ณตํ†ต์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•ด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

  • ์ข€ ๋” ์ž์„ธํžˆ ๋งํ•˜์ž๋ฉด, ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ๊ณตํ†ต ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ค๊ณ , ๋งŒ๋“ค์–ด์ง„ ๊ณตํ†ต๋ชจ๋“ˆ์„ ์˜๋„ํ•œ ์ฝ”๋“œ์— ์‚ฝ์ž…ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•œ๋‹ค.

  • ์ด๋กœ ์ธํ•ด์„œ, ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค์— ์ข€ ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ณ  ์‘์ง‘๋„ ๋†’์€ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

  • AOP์˜ ์ฃผ๋œ ์šฉ๋„์˜ ์˜ˆ๋กœ๋Š” ๋กœ๊น…, ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋“ฑ์ด ์žˆ๋‹ค.

Dependency Injection

  • ์Šคํ”„๋ง์—์„œ ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

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

  • DI๋Š” ๊ฐ์ฒด์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ(Spring์œผ๋กœ๋ถ€ํ„ฐ) ์ฃผ์ž…๋ฐ›๋„๋ก ํ•œ๋‹ค. ์ด๊ฒƒ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์Šคํ”„๋ง์˜ ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ์ฒด์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์— ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•œ๋‹ค.

  • ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•์€ ์ƒ์„ฑ์ž ์ฃผ์ž…๋ฐฉ์‹์ด ์žˆ๊ณ , setter ์ฃผ์ž… ๋ฐฉ์‹์ด ์žˆ๋‹ค.

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด

  • ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์˜ค์ง ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์ƒ์„ฑํ•˜๋„๋ก ๊ฐ•์ œ(๋˜๋Š” ๋ณด์žฅ)ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

  • ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ ์ „์—ญ ์ƒํƒœ๋‚˜ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

  • ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค.

    • ์‹ฑ๊ธ€ํ„ด ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ „์—ญ์ ์ธ ์ ‘๊ทผ์ ์ด ์ œ๊ณต๋œ๋‹ค.

    • ์‹ฑ๊ธ€ํ„ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ์˜ค์ง ํ•œ๊ฐ€์ง€ ๋ฟ์ด๋‹ค.

  • ๊ฐ„๋žตํžˆ ์‹ฑ๊ธ€ํ„ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž๋ฉด,

    1. ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์œ ์ผํ•œ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜(static ๋ณ€์ˆ˜)๋ฅผ ์„ ์–ธํ•œ๋‹ค.

    2. ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ์„ ์–ธํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๋Š”๋‹ค.

    3. ์‹ฑ๊ธ€ํ„ด ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ static ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

IoC(Inversion of Control)

  • ํ•ด์„ํ•ด๋ณด๋ฉด ์ œ์–ด(Control)์˜ ์—ญ์ „(Inversion)์ด๋‹ค.

  • ๊ฐ์ฒด์ƒ์„ฑ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋ ˆ์ž„์›Œํฌ(์Šคํ”„๋ง๊ณผ ๊ฐ™์€)๊ฐ€ ํ•˜๋„๋ก ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ๊ธฐ์ˆ ์ด DI(Dependency Injection, ์˜์กด์„ฑ ์ฃผ์ž…)์ด๋‹ค. DI์˜ ์ฃผ์ฒด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ธ๋ฐ, ๋งˆ์ฐฌ๊ฐ€์ง€ ๋งฅ๋ฝ์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์Šคํ”„๋ง์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜์กด๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์— ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • IoC์™€ DI๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด์˜ ๊ด€๊ณ„๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ์Šคํ”„๋ง๋ถ€ํŠธ ์ด์ „์—๋Š” XML์—๋„ ์ž‘์„ฑํ–ˆ์—ˆ์ง€๋งŒ, ์ด์ œ๋Š” ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ์ž๋ฐ” ์ฝ”๋“œ ๋“ฑ์œผ๋กœ ๋‹ค์–‘ํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  • IoC์˜ ์žฅ์ ์€ ๋ฌด์—‡์ผ๊นŒ? IoC๋ฅผ ํ†ตํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งค๋ฒˆ ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ํ•œ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฐ์ฒด ๊ฐ„์˜ ์˜ํ–ฅ๋„(๊ฒฐํ•ฉ๋„)๋ฅผ ๋‚ฎ์ถ”๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์ด๊ฒƒ์€ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” DI๋ฐฉ์‹ ๋•๋ถ„์ด๋‹ค.

Spring Bean

  • ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๋Š” Bean(๊ฐ์ฒด)๋ฅผ ๋งํ•œ๋‹ค.

  • ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ(Spring container)์—์„œ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ Spring Bean์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ์ •์˜๋œ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ Bean์„ ์ƒ์„ฑ / ์ดˆ๊ธฐํ™” / ์†Œ๋ฉธ ๋“ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ(Life Cycle)๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

BeanFactory

  • Bean์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. Spring Container์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘์˜ ํ•˜๋‚˜์ด๋‹ค.

  • BeanFactory ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋กœ๋Š” DefaultListableBeanFactory, XmlBeanFactory, ApplicationContext ๋“ฑ์ด ์žˆ๋‹ค. ์ด ํด๋ž˜์Šค๋“ค์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ Bean์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

Last updated