[Spring] DI (์ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?)
DI (Dependency Injection)
- ์์กด์ฑ ์ฃผ์ (์์กด ๊ด๊ณ ์ฃผ์ )
- ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ ์ธ๋ถ์์ ์์ฑํ ํ ์ฃผ์ ์์ผ ์ค๋ค.
์ฅ์
- ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ฌ์ค๋ค.
- ํ ์คํธ๊ฐ ์ฉ์ดํด์ง๋ค.
- ๊ฐ์ฒด ๊ฐ์ ์์กด๊ด๊ณ๋ฅผ ์์ ๊ฑฐ๋ ์ค์ผ ์ ์๋ค.
- ๊ฒฐํฉ๋(coupling)์ ๋ฎ์ถ๋ฉด์ ์ ์ฐ์ฑ๊ณผ ํ์์ฑ์ ํฅ์ํ ์ ์์ต๋๋ค.
- DI๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ๊ฐ์ฒด ๋ด๋ถ์์ ๋ค๋ฅธ ๊ฐ์ฒด ์์ฑ ์ ๋ ๊ฐ์ฒด ๊ฐ์ ๊ฐํ ๊ฒฐํฉ๋๊ฐ ์๊น๋๋ค. ๋ฐ๋ผ์ ํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ๊ฒฐํฉ๋ ๊ฐ์ฒด๋ ์ํฅ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
- ํ์ง๋ง DI๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ธ๋ถ์์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ผ๋ฏ๋ก ์์กด๊ด๊ณ๊ฐ ์ฝํด์ง๊ณ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๋์์ง๋ค.
์์กด์ฑ ์ฃผ์ ์ 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