๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Spring] DI (์™œ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?) ๋ณธ๋ฌธ

๐—ฃ๐—ฟ๐—ผ๐—ด๐—ฟ๐—ฎ๐—บ๐—บ๐—ถ๐—ป๐—ด๐Ÿ’ป/๐’๐ฉ๐ซ๐ข๐ง๐ 

[Spring] DI (์™œ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?)

๐ŸคRyusun๐Ÿค 2022. 12. 27. 15:04

DI (Dependency Injection)

  • ์˜์กด์„ฑ ์ฃผ์ž…(์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…)
  • ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•œ ํ›„ ์ฃผ์ž…์‹œ์ผœ ์ค€๋‹ค.


์žฅ์ 

 

  1. ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.
  2. ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•ด์ง„๋‹ค.
  3. ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ์—†์• ๊ฑฐ๋‚˜ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  4. ๊ฒฐํ•ฉ๋„(coupling)์€ ๋‚ฎ์ถ”๋ฉด์„œ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์ž‘์„ฑ์€ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • DI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ๋‘ ๊ฐ์ฒด ๊ฐ„์— ๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด ๊ฒฐํ•ฉ๋œ ๊ฐ์ฒด๋„ ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ DI๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์œผ๋ฏ€๋กœ ์˜์กด๊ด€๊ณ„๊ฐ€ ์•ฝํ•ด์ง€๊ณ  ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…์˜ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•

1. ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection)
2. ํ•„๋“œ ์ฃผ์ž…(Field Injection)
3. ์ˆ˜์ •์ž ์ฃผ์ž…(Setter Injection)

 

 

1. ์ƒ์„ฑ์ž ์ฃผ์ž…(Construction Injection)


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

 

 

2. ํ•„๋“œ ์ฃผ์ž…(Field Injection)

 

ํ•„๋“œ์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ์ž๋™์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.
๋‹จ์ 

  • ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
  • ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กด์ ์ด๊ณ  ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์ข‹์ง€ ์•Š๋‹ค.

 

 

3. ์ˆ˜์ •์ž ์ฃผ์ž…(Setter Injection)


Setter๋ฉ”์„œ๋“œ์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
๋‹จ์ 

  • ์ˆ˜์ •์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด setter๋ฉ”์„œ๋“œ๋ฅผ public์œผ๋กœ ์—ด์–ด๋‘์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ ์–ด๋””์„œ๋“  ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

 

 

 

โญ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜์ž.

 

  • ๋‹ค์–‘ํ•œ DI ๋ฐฉ๋ฒ• ์ค‘์—์„œ Spring Framework reference๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
 

Core Technologies

In the preceding scenario, using @Autowired works well and provides the desired modularity, but determining exactly where the autowired bean definitions are declared is still somewhat ambiguous. For example, as a developer looking at ServiceConfig, how do

docs.spring.io

 

๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

 

1. ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ ํ™•๋ณด

 

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

 

2. ์˜ค๋ฅ˜ ๋ฐฉ์ง€

 

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

 

3. final ํ‚ค์›Œ๋“œ ์ž‘์„ฑ ๋ฐ Lombok๊ณผ์˜ ๊ฒฐํ•ฉ

 

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•„๋“œ ๊ฐ์ฒด์— final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ˆ„๋ฝ๋œ ์˜์กด์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋‹ค๋ฅธ ์ฃผ์ž… ๋ฐฉ๋ฒ•๋“ค์€ ๊ฐ์ฒด์˜ ์ƒ์„ฑ(์ƒ์„ฑ์ž ํ˜ธ์ถœ) ์ดํ›„์— ํ˜ธ์ถœ๋˜๋ฏ€๋กœ final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ final ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด Lombok๊ณผ ๊ฒฐํ•ฉ๋˜์–ด ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด @AllArgsConstructor๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ์ž ์ฃผ์ž…์ฝ”๋“œ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

4. ์ˆœํ™˜ ์ฐธ์กฐ ์—๋Ÿฌ ๋ฐฉ์ง€

 

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™ ์‹œ์ (๊ฐ์ฒด์˜ ์ƒ์„ฑ ์‹œ์ )์— ์ˆœํ™˜ ์ฐธ์กฐ ์—๋Ÿฌ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @Autowired๋ฅผ ์ด์šฉํ•œ ํ•„๋“œ ์ฃผ์ž…์—์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™ ์‹œ์ ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ์กฐ๋ฆฝ(@Autowired) ์‹œ์ ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.@Autowired๋Š” ๋ชจ๋“  ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ด ์™„๋ฃŒ๋œ ํ›„์— ์กฐ๋ฆฝ(์˜์กด๊ด€๊ณ„ ์ฃผ์ž…)์ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

[์ฐธ์กฐ]

https://dev-coco.tistory.com/70

https://velog.io/@znftm97/Spring-DIDependency-Injection-%EC% A0%95% EB% A6% AC