๐Ÿ’ป BackEnd/๐ŸŸข Spring | SpringBoot

๐ŸŸข [Spring] ์Šคํ”„๋ง ์˜์กด์„ฑ ์ฃผ์ž…(DI) - [1]

Dbswnstjd 2023. 7. 6. 20:46

spring

๐Ÿšฉ   ์˜์กด์„ฑ ์ฃผ์ž…์˜ ๊ฐœ๋…๊ณผ ํ•„์š”์„ฑ


[ ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ž€โ“]

Spring ํ”„๋ ˆ์ž„์›Œํฌ๋Š” 3๊ฐ€์ง€ ํ•ต์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI) ์ด๋‹ค. DI๋Š” ์™ธ๋ถ€์—์„œ ๋‘ ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์ด์— ๋‘ฌ์„œ ๊ธ€๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ๋Š” ์˜์กด๊ด€๊ณ„๊ฐ€ ๊ณ ์ •๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์‹œ์— ๊ด€๊ณ„๋ฅผ ๋™์ ์œผ๋กœ ์ฃผ์ž…ํ•˜์—ฌ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

public class testController{
	
    private testService service;

}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด testController ๊ฐ์ฒด๊ฐ€ testService ๊ฐ์ฒด์— ์˜์กด์„ฑ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. 

์ด ๋‘˜์˜ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๊ฒƒ์„ ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ๊ณ  ํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ ์ฃผ์ž… ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. 

1. ์ƒ์„ฑ์ž ์ฃผ์ž…

 

2. ํ•„๋“œ ์ฃผ์ž…

 

3. ์ˆ˜์ •์ž ์ฃผ์ž… 

 

์ด์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์œ„์ฃผ๋กœ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.

๊ทธ ์ด์œ ๋Š” ํ•„๋“œ ์ฃผ์ž…์ด๋‚˜ ์ˆ˜์ •์ž ์ฃผ์ž…์€ ๋งค์šฐ ํฐ ๋‹จ์ ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ๊ธ€์—์„œ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.


[ ์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection) ์ด ํ•„์š”ํ•œ ์ด์œ  ]

์˜์กด์„ฑ ์ฃผ์ž…์ด ํ•„์š”ํ•œ ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋ณด๋ฉด ์‰ฝ๋‹ค.

public class Car{
	
    private ATire tire;
    
    public Car(){
    	this.tire = new ATire();
}

ATire๋ฅผ ์žฅ์ฐฉํ•˜์—ฌ ํŒ๋งคํ•˜๋Š” Car ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

์œ„์˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ์กด์žฌํ•œ๋‹ค.

  • ๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค.
  • ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์ง„๋‹ค.

1. ๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค.

์œ„์˜ Car ํด๋ž˜์Šค๋Š” ATire์™€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์„ ๋•Œ ๋‹ค๋ฅธ Tire๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด ์ƒ์„ฑ์ž์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋•Œ ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ํƒ€์ด์–ด๋ฅผ ๊ต์ฒดํ• ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ์ž๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—๋„ ์–ด๊ธ‹๋‚˜๊ณ  ์ข‹์ง€ ์•Š์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์†์„ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ์†์€ ์ œ์•ฝ์ด ๋งŽ๊ณ  ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง€๋ฏ€๋กœ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 


2. ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์ง„๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์ ธ์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์˜ ์˜ˆ์‹œ๋Š” ํด๋ž˜์Šค๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋กœ ๋งบ์–ด์ ธ ์žˆ๋‹ค. ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์กŒ๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๊ตฌ์ฒด ํด๋ž˜์Šค(ATire ์ธ์ง€ BTire์ธ์ง€)๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋”๋ผ๋„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํƒ€์ž…(Tire)์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ์ ๋“ค์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ Spring์—์„œ๋Š” DI๋ฅผ ์ ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. 

 

ํ˜„์žฌ์˜ ์˜ˆ์‹œ๋กœ๋Š” ๋ณ„๋กœ ๋ฌธ์ œ์ ์ด ๋ณด์ด์ง€ ์•Š์„์ˆ˜๋„ ์žˆ๋‹ค. ๋‚˜ ๋˜ํ•œ ์ฒ˜์Œ์— ์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ตณ์ด ํ•ด์•ผํ•˜๋Š” ํ•„์š”์„ฑ์„ ๋Š๋ผ์ง€ ๋ชปํ–ˆ๊ณ  ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์•˜๋‹ค. ํ•˜์ง€๋งŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์ง€๊ณ  ํ•„๋“œ๊ฐ€ ๋งŽ์•„์ง„๋‹ค๋ฉด ๋ง์ด ๋‹ฌ๋ผ์ง„๋‹ค. ํƒ€์ด์–ด๋ฅผ ๋งค์ผ ๊ต์ฒดํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ๋งค๋ฒˆ ์ € ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํƒ€์ด์–ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ถ€ํ’ˆ๋“ค๋„ ์กด์žฌํ•˜๊ณ  ๊ทธ ๋ถ€ํ’ˆ์„ ๋งค๋ฒˆ ๋‹ค๋ฅธ ํšŒ์‚ฌ ์ œํ’ˆ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์œ ์ง€๋ณด์ˆ˜๋ฅผ ํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์›Œ์ง„๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋“ค ๋•Œ๋ฌธ์— Spring์—์„œ๋Š” DI๋ฅผ ์ง€์›ํ•˜๊ณ  ์ด๋ฅผ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

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