๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring

[Spring] ์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injection)์˜ ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

by Leica 2020. 2. 28.
๋ฐ˜์‘ํ˜•

[Spring] ์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injection)์˜ ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

Spring์€ @Autowired ์• ๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ ๋‹ค์–‘ํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

@Autowired ์• ๋…ธํ…Œ์ด์…˜์€ Spring์—๊ฒŒ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋ผ๋Š” ์ง€์‹œ์ž ์—ญํ• ๋กœ ์“ฐ์ด๋Š”๋ฐ ์ƒ์„ฑ์ž, ํ•„๋“œ, ์„ธํ„ฐ์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿšจ Spring IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์€ ๋นˆ(Bean) ๋ผ๋ฆฌ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

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

1
2
3
4
5
6
7
8
9
@Component
public class SampleController {
    private SampleRepository sampleRepository;
 
    @Autowired
    public SampleController(SampleRepository sampleRepository) {
        this.sampleRepository = sampleRepository;
    }
}
cs

์ด๋ ‡๊ฒŒ ์ƒ์„ฑ์ž์— @Autowired ์• ๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

Spring 4.3๋ถ€ํ„ฐ๋Š” ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜์ด๊ณ  ๊ทธ ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž…๋ฐ›์„ ๊ฐ์ฒด๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค๋ฉด ์ƒ์„ฑ์ž ์ฃผ์ž…์—์„œ @Autowired๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

1
2
3
4
5
@Component
public class SampleController {
    @Autowired
    private SampleRepository sampleRepository;
}
cs

๋ณ€์ˆ˜ ์„ ์–ธ๋ถ€์— @Autowired ์• ๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.

 

3. Setter ์ฃผ์ž…

1
2
3
4
5
6
7
8
9
@Component
public class SampleController {
    private SampleRepository sampleRepository;
 
    @Autowired
    public void setSampleRepository(SampleRepository sampleRepository) {
        this.sampleRepository = sampleRepository;
    }
}
cs

Setter ๋ฉ”์†Œ๋“œ์— @Autowired ์• ๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.

 

์ด ์„ธ๊ฐœ์˜ ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ SampleController์— SampleRepository๋ฅผ ์ฃผ์ž…ํ•˜๋„๋ก ํ•œ๋‹ค.

 

4. ์ƒ์„ฑ์ž, ํ•„๋“œ, Setter ์ฃผ์ž… ์ค‘ ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ํƒํ•  ๊ฒƒ์ธ๊ฐ€?

Spring framework reference์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์ฃผ์ž…์ด๋‹ค.

์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ข‹์€ ์ด์œ ๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์˜์กด์„ฑ ์—†์ด๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

SampleController๊ฐ€ SampleRepository ์—†์ด๋Š” ์ œ๋Œ€๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด SampleController ์ž…์žฅ์—์„œ SampleRepository๋Š” ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

๊ทธ๊ฒƒ์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ๋ฒ•์„ ์“ฐ๋Š”๊ฒƒ์ด๋‹ค.

 

5. ํ•„๋“œ, Setter ์ฃผ์ž… ๋ฐฉ๋ฒ•์˜ ํ•„์š”์„ฑ

๐Ÿ“ ์ˆœํ™˜ ์ฐธ์กฐ(Circular Dependency)

A๊ฐ€ B๋ฅผ ์ฐธ์กฐํ•˜๊ณ  B๊ฐ€ A๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ƒํƒœ

 

A ํด๋ž˜์Šค์™€ B ํด๋ž˜์Šค๊ฐ€ ์ˆœํ™˜ ์ฐธ์กฐ ๊ด€๊ณ„์ด๊ณ  ๋‘˜ ๋‹ค ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด A์™€ B์ค‘ ์–ด๋–ค ์ธ์Šคํ„ด์Šค๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰์กฐ์ฐจ ๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ฐ€๊ธ‰์ ์ด๋ฉด ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ํ”ผํ•˜๋Š”๊ฒŒ ์ข‹์ง€๋งŒ ์–ด์ฉ”์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ํ•„๋“œ๋‚˜ setter ์ฃผ์ž… ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

References

์ธํ”„๋Ÿฐ - ๋ฐฑ๊ธฐ์„ ๋‹˜์˜ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ์ž…๋ฌธ(๊ฐœ์ •ํŒ)

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€