[Spring]DI

DevelopHeoยท2024๋…„ 12์›” 23์ผ
0
post-thumbnail

๐Ÿ“™ SpringFramework ๋“ฑ์žฅ๋ฐฐ๊ฒฝ

Framework VS Library

ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ท€์ฐฎ์€ ์ž‘์—…์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง

SpringFramework ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ 2

EJB๋ž€? (Enterprisee JavaBeans)

  • EJB๋Š” ๊ธฐ์—…ํ™˜๊ฒฝ์˜ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„์ธก ์ปดํฌ๋„ŒํŠธ ๋ชจ๋ธ์ด๋‹ค. ์ฆ‰, EJB๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—…๋ฌด ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค.
  • EJB ์‚ฌ์–‘์€ Java EE์˜ ์ž๋ฐ” API ์ค‘ ํ•˜๋‚˜๋กœ, ์ฃผ๋กœ ์›น ์‹œ์Šคํ…œ์—์„œ JSP๋Š” ํ™”๋ฉด ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ  EJB๋Š” ์—…๋ฌด ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

EJB - ํ˜„์‹ค์—์„œ์˜ ๋ฐ˜์˜์ด ์–ด๋ ต๋‹ค.

  • ์ฝ”๋“œ ์ˆ˜์ • ํ›„ ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ • ์ž์ฒด๊ฐ€ ๊ฑฐ์ฐฝํ•ด ๊ธฐ๋Šฅ์€ ์ข‹์ง€๋งŒ ๋ณต์žกํ•œ ์ŠคํŽ™์œผ๋กœ ์ธํ•œ ๊ฐœ๋ฐœ์˜ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง

SpringFramework ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ3

  • ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์ ์  ์ปค์ง€๋ฉด์„œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰์˜ ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋จ
  • ์ž๋ฐ” ์ง„์˜์—์„œ๋Š” EJB๊ฐ€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์„œ๋น„์Šค๋กœ ๊ฐ๊ด‘์„ ๋ฐ›๊ฒŒ ๋จ
    • EJB ์ŠคํŽ™์— ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฏ€๋กœ ๊ธฐ์กด์— ์ž‘์„ฑ๋œ POJO๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ
    • ์ปจํ…Œ์ด๋„ˆ์— ๋ฐฐํฌ๋ฅผ ํ•ด์•ผ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ์ €ํ•˜๋จ
    • ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ต๊ณ , ์„ค์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ๋งŽ์Œ

Rod Johnson์ด EJB๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•จ( ์Šคํ”„๋ง์˜ ๋ชจํƒœ )

  • AOP๋‚˜ DI๊ฐ™์€ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ๊ฐ€๋Šฅ
  • POJO๋กœ ์„ ์–ธ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์ด ๊ฐ€๋Šฅํ•ด ์ง

SpringFramework ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ 4

์ ์ฐจ POJO + ๊ฒฝ๋Ÿ‰ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘
POJO (Plain Old Java Object) - ์˜›๋‚  ์ž๋ฐ”์˜ ๊ฐ์ฒด๋ฅผ ์œ ์ง€

  • ํŠน์ • ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๊ธฐ์ˆ ์— ์˜์กด์ ์ด์ง€ ์•Š์€ ์ž๋ฐ” ๊ฐ์ฒด
  • ํŠน์ • ๊ธฐ์ˆ ์— ์ข…์†์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์‚ฐ์„ฑ, ์ด์‹์„ฑ ํ–ฅ์ƒ
  • Plain : component interface๋ฅผ ์ƒ์†๋ฐ›์ง€ ์•Š๋Š” ํŠน์ง• (ํŠน์ • framework์— ์ข…์†๋˜์ง€ ์•Š๋Š”)
  • Old : EJB ์ด์ „์˜ java class๋ฅผ ์˜๋ฏธ

๊ฒฝ๋Ÿ‰ ํ”„๋ ˆ์ž„์›Œํฌ

  • EJB๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ๋“ฑ์žฅ
  • Hibernate(JPA), JDO, myBatis, Spring

SpringFramework ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ 5

POJO + Framework

  • EJB์„œ๋ฒ„์™€ ๊ฐ™์€ ๊ฑฐ์ฐฝํ•œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š” ์—†๋‹ค.
  • ์˜คํ”ˆ ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ๋ผ ์‚ฌ์šฉ์ด ๋ฌด๋ฃŒ
  • ๊ฐ์ข… ๊ธฐ์—…์šฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ์ƒ๋‹นํžˆ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ง€์›
  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์Šคํ”„๋ง์€ ์›น ๋ถ„์•ผ ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ ๋ชจ๋“  ๋ถ„์•ผ์— ์ ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

Spring Framework? = ๊ฒฝ๋Ÿ‰ํ™” ๋œ ์†”๋ฃจ์…˜์ด๋‹ค.

  • ๊ธฐ์กด์˜ ์ž๋ฐ”์˜ ๋ฌด๊ฑฐ์› ๋˜ ๋ถ€๋ถ„์„ ์ตœ์†Œํ™”ํ•จ
  • JEE๋ฅผ ๋Œ€์ฒดํ•˜๋Š” Framework์ด๋‹ค.
  • DI(Dependency Injection) ๋‚˜ AOP(Aspect Oriented Programming)์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ๋„ ์ง€์› ํ•œ๋‹ค.

๐Ÿ“™ StringFramework์˜ ํŠน์ง•

1) ๊ฒฝ๋Ÿ‰์ ์ด๋‹ค.

์Šคํ”„๋ง์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“ˆ์‹ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ๊ฐ ๋ชจ๋“ˆ์€ ํ•˜๋‚˜ ์ด์ƒ์˜ JAR ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ์‰ฌ์šด ๊ฐœ๋ฐœ๊ณผ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ POJO(ํ‰๋ฒ”ํ•œ ์˜›๋‚  ์ž๋ฐ” ๊ฐ์ฒด, Plain Old Java Object) ํ˜•ํƒœ๋กœ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•ด์„œ ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ€๋ณ๋‹ค.

2) ์ œ์–ด์˜ ์—ญํ–‰(IoC, Inversion of Control)๊ณผ ์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injection)

์Šคํ”„๋ง์€ IoC๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ์œ ์ง€ํ•œ๋‹ค. IoC๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์Šคํ”„๋ง์˜ Spring Bean๋ชจ๋“ˆ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ œ์–ดํ•˜๋ฉฐ ๊ด€๋ฆฌํ•˜๋Š” ํŠน์ง•์„ ์ž˜ ์„ค๋ช…ํ•ด์ค€๋‹ค. (Bean ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ณณ์€ Bean Factory๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.)

// ๊ธฐ์กด Java
public class TV {
	private Speaker speaker;
    
    public TV(Speaker speaker) {
    	this.speaker = speaker;
    }
}

// Spring
@Component
public class TV {
	
    @Autowired
	private Speaker speaker;
}

DI๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ํฌ๊ฒŒ ์ค„์—ฌ์ค€๋‹ค๋Š” ๊ฒƒ์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค. ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์ด ์ค„์–ด๋“ ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ๋งŒํผ ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ํ•  ๋•Œ ์†์ด ๋งŽ์ด ๊ฐ€๋Š” ๊ฒƒ์„ ์ค„์—ฌ์ค€๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•˜๋‹ค.


3) ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(AOP, Aspect Oriented Programming)

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

4) ์ปจํ…Œ์ด๋„ˆ(Container)

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

๐Ÿ“™ StringFramework์˜ ๊ตฌ์กฐ

Spring ์‚ผ๊ฐํ˜•

POJO

1. PSA (Portable Service Abstraction)

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

2. IoC/DI (Inversion of Control / Dependency Injection)

  • IoC(์ œ์–ด์˜ ์—ญํ–‰)์™€ DI(์˜์กด์„ฑ ์ฃผ์ž…)๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…
  • IoC๋Š” ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด๊ถŒ์„ ์—ญ์ „์‹œํ‚ค๋Š” ๊ฐœ๋…
  • DI๋Š” ํ•ด๋‹น ๊ฐœ๋…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ, ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…์‹œํ‚ค๋Š” ํŒจํ„ด์„ ๋งํ•œ๋‹ค.
  • ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด ๋งŒ๋“ค์–ด์„œ ์ค€๊ฑธ ๋‚ด๊ฐ€ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ฐ๋Š”๊ฑฐ
  • DI๋Š” ์œ ์—ฐํ•˜๊ฒŒ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‘๊ณ  ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด๊ด€๊ณ„๋Š” ์™ธ๋ถ€์—์„œ ๋‹ค์ด๋‚˜๋ฏนํ•˜๊ฒŒ ์„ค์ •

3. AOP (Aspect Oriented Programming)

  • ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ชจ๋“ˆ์„ฑ์„ ํ–ฅ์ƒ
  • ๊ณตํ†ต ๋ชจ๋“ˆ์„ ์—ฌ๋Ÿฌ ์ฝ”๋“œ์— ์‰ฝ๊ฒŒ ์ ์šฉ๊ฐ€๋Šฅ

Spring Framework์˜ ๋™์ž‘ ๊ณผ์ •


๐Ÿ“™ IoC & DI & Container

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

IoC -> ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฑฐ ์“ฐ๋Š” ๊ฑฐ

IoC ๊ฐœ๋…1

  • ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค ํ˜ธ์ถœ ๋ฐฉ์‹ ์‚ฌ์šฉ

โ†’ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค (loosely-coupling) = ๋…๋ฆฝ์ ์ด๊ฒŒ ๋œ๋‹ค.

  • ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ท„๋‹ค๋Š” ๊ฒƒ์€ ์–‘์ชฝ ๋‹ค ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š”๊ฑธ ํ•œ์ชฝ๋งŒ ๋ฐ”๊ฟ”๋„ ๋˜๊ฒŒ ํ•œ๊ฑฐ์ž„
  • ๊ตฌํ˜„ ํด๋ž˜์Šค ๊ต์ฒด๊ฐ€ ์šฉ์ดํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™”๊ฐ€๋Šฅ( ๋‹คํ˜•์„ฑ )
  • ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค ๊ต์ฒด ์‹œ ํ˜ธ์ถœ ํด๋ž˜์Šค๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ( ๊ฐ์ฒด ์ƒ์„ฑ๊ด€๊ณ„ ์˜์กด์„ฑ์€ ์—ฌ์ „ํžˆ ์กด์žฌ )

IoC ๊ฐœ๋…2

  • ๊ฐ์ฒด ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ Factory๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค
    • ํŒฉํ† ๋ฆฌ ํ˜ธ์ถœ ๋ฐฉ์‹
    • ํŒฉํ† ๋ฆฌ ๋ฐฉ์‹์€ ํŒฉํ† ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค๋Š” ํŒฉํ† ๋ฆฌ๋ฅผ ํ˜ธ์ถœ
    • ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€๊ฒฝ ์‹œ ํŒฉํ† ๋ฆฌ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋จ. ํ˜ธ์ถœ ํด๋ž˜์Šค์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ
    • ํ•˜์ง€๋งŒ ํด๋ž˜์Šค์— ํŒฉํ† ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์†Œ์Šค๊ฐ€ ๋“ค์–ด๊ฐ. ๊ทธ๊ฒƒ ์ž์ฒด๊ฐ€ ํŒฉํ† ๋ฆฌ์— ์˜์กดํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๊ฐ์ฒด ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ Assembler๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค
    • IoC ํ˜ธ์ถœ ๋ฐฉ์‹
    • ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์žฅ์ ์„ ๋”ํ•˜์—ฌ ์–ด๋– ํ•œ ๊ฒƒ์—๋„ ์˜์กดํ•˜์ง€ ์•Š๋Š” ํ˜•ํƒœ๊ฐ€ ๋จ
    • ์‹คํ–‰์‹œ์ (Runtime)์— ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ์ด ๋จ

  • Dependency Lookup - ๋‚ด๊ฐ€ ์•Œ์•„์„œ ์ฐพ์•„์„œ ์“ธ๊ฒŒ
  • Dependency Injection - ๋„ˆ ์–ด์ฐจํ”ผ ์“ธ๊ฑฐ์ง€? ๋ฏธ๋ฆฌ ๋„ฃ์–ด์ค„๊ฒŒ(๋‚ด๊ฐ€ ์ฐพ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค)

Dependency Lookup

  • Lookupํ•œ Object๋ฅผ ํ•„์š”ํ•œ ํƒ€์ž…์œผ๋กœ ๋งค๋ฒˆ ํ˜•๋ณ€ํ™˜ ํ•ด์ค˜์•ผํ•จ(๋ถˆํŽธ)

DI (Dependency Injection) - ์˜์กด์„ฑ ์ฃผ์ž…

Dependency Injection(DI) ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ๋ฒ•๋“ค

  • Setter Injection (์„ธํ„ฐ ์ฃผ์ž…)
    • Setter ๋ฉ”์†Œ๋“œ์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    • ์ˆ˜์ •์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด setXXX ๋ฉ”์„œ๋“œ๋ฅผ public์œผ๋กœ ์—ด์–ด๋‘์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ ์–ด๋””์„œ๋“  ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (๋‹จ์ )
  • Constructor Injection (์ƒ์„ฑ์ž ์ฃผ์ž…)
    • ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜์ด๊ณ , ๊ทธ ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž…๋ฐ›์„ ๊ฐ์ฒด๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค๋ฉดย ย @Autowired๋ฅผ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์กฐ๊ธˆ ๋” ์˜นํ˜ธํ•˜๊ณ  ๊ถŒ์žฅํ•จ.
  • Method Injection
  • Field-based injection

์Šคํ”„๋ง ์˜์กด์„ฑ ์ฃผ์ž… ์ฐธ๊ณ ์ž๋ฃŒ : https://ittrue.tistory.com/227

Dependency Injection(DI) ํŠน์ง•

  • Test๊ฐ€ ์šฉ์ดํ•ด์ง„๋‹ค.
  • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.
  • ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ(์ข…์†์„ฑ)์„ ์ค„์ด๊ฑฐ๋‚˜ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋ฉด์„œ ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  • lookup ์ฝ”๋“œ ์•ˆ์จ๋„ ๋จ, ์•ˆ์— ์ด๋ฏธ ์žˆ์œผ๋‹ˆ ๋‚ด๊บผ์ฒ˜๋Ÿผ ์จ๋„ ๋จ
  • Object๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†์Œ
  • Lookup ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์ด Object ๋‚ด์—์„œ ์‚ฌ๋ผ์ง
  • Setter Injection๊ณผ Constructor Injection

DI ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  • XML์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Annotation ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Java Config

Conatainer

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

Container ๊ธฐ๋Šฅ

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

Container ํ•„์š”์„ฑ

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์™ธ์— ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ
  • ์„œ๋น„์Šค look up ์ด๋‚˜ Configuration์— ๋Œ€ํ•œ ์ผ๊ด€์„ฑ์„ ๊ฐ–๊ธฐ ์œ„ํ•จ
  • ์„œ๋น„์Šค ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ๊ฐ Factory ๋˜๋Š” Signleton ํŒจํ„ด์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋จ
  • ๊ธฐ๋Šฅ์„ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋Š” Factory๋„ ์Šคํ”„๋ง์ด ์•Œ์•„์„œ ํ•ด์ค€๋‹ค.
  • BeanFactory๋ฅผ ํ™•์žฅํ•ด๋†“์€๊ฒŒ ApplicationContext์ด๋‹ค.

BeanFactory

  • Bean์„ ๋“ฑ๋ก, ์ƒ์„ฑ, ์กฐํšŒ, ๋ฐ˜ํ™˜ ๊ด€๋ฆฌ
  • ์ผ๋ฐ˜์ ์œผ๋กœ BeanFactory๋ณด๋‹ค๋Š” ์ด๋ฅผ ํ™•์žฅํ•œ ApplicationContext ์‚ฌ์šฉ
  • getBean() method๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Œ

ApplicationContext (BeanFactory๋ฅผ ํ™•์žฅํ•จ)

  • Bean์„ ๋“ฑ๋ก, ์ƒ์„ฑ, ์กฐํšŒ, ๋ฐ˜ํ™˜ ๊ด€๋ฆฌ๊ธฐ๋Šฅ์€ BeanFactory์™€ ๊ฐ™์Œ
  • Spring์˜ ๊ฐ์ข… ๋ถ€๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์ œ๊ณต
  • Spring์ด ์ œ๊ณตํ•˜๋Š” ApplicationContext ๊ตฌํ˜„ ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

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