์คํ๋ง ์์กด์ฑ ์ฃผ์ @Autowired, @Resource, @Inject (Java Spring Dependency Injection)
โ
์์กด์ฑ ์ฃผ์ ์ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ @Service์ ์ด์ฉํ์ฌ class annotation์ผ๋ก ๋ฌ์์ฃผ๋ฉด ์คํ๋ง์ beanFactory์ ๋ด์ ๋๊ณ ์ฌ์ฉํ๋ ๊ณณ์ @Autowired์ ์ฌ์ฉํ๋ ๊ณณ์ ํด๋น bean์ ์ฐพ์ ์ฃผ์ ์์ผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ค๋ค.
โ
1. @Autowired
@Autowired๋ ์ฃผ์ ํ๋ ค๊ณ ํ๋ ๊ฐ์ฒด์ ํ์ ์ด ์ผ์นํ๋ ๊ฐ์ฒด๋ฅผ loc ์ปจํ ์ด๋ ์์ ์กด์ฌํ๋ Bean์ ์๋์ผ๋ก ์ฃผ์ ํ๋ค.
โ
์ฃผ์ ๋ฐฉ๋ฒ์ 3๊ฐ์ง๊ฐ ์๋ค.
โ
ํ๋ ์ฃผ์ (Field Injection)
ํ๋์ @Autowired ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ ์ฃผ๋ฉด ์๋์ผ๋ก ์์กด์ฑ์ด ์ฃผ์ ๋๋ค. ๋งค์ฐ ๊ฐ๋จํ๋ฉฐ ์์ ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด๋ค.
โ
์์ฑ์ ์ฃผ์ (Constructor Injection)
๋จ์ผ ์์ฑ์์ธ ๊ฒฝ์ฐ @Autowired ์ด๋ ธํ ์ด์ ์ ๋ถ์ด์ง ์์๋ ๋์ง๋ง ์์ฑ์ 2๊ฐ ์ด์์ผ ๊ฒฝ์ฐ์๋ ์ด๋ ธํ ์ด์ ์ ๊ผญ ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค.
โ
์ธํฐ ์ฃผ์ (Setter Injection)
๋ฉ์๋ ์ด๋ฆ์ด ์ธํฐ ๋ค์ด๋ฐ ํจํด(setXXXX)์ด ์๋์ด๋ ๋์ผํ ๊ธฐ๋ฅ์ ํ์ง๋ง ์ผ๊ด์ฑ๊ณผ ๋ช ํํ ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด์
์ ํํ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
โ
์ฌ๊ธฐ์ ์์์ผ ํ ๋ด์ฉ์ ํ๋ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ๋ค.
Spring Team recommends: “Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies”.
ํ๋ ์ฃผ์ ์ ์ฌ์ฉํ์ง ๋ง๊ณ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ผ๋๋ฐ ์์ฑ์ ์ฃผ์ ์ ๊ถ์ฅํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
https://madplay.github.io/post/why-constructor-injection-is-better-than-field-injection
- ์ํ ์ฐธ์กฐ ๋ฐฉ์ง (A๊ฐ B๋ฅผ ์ฐธ์กฐํ๊ณ B๊ฐ A๋ฅผ ์ฐธ์กฐํ ๋ ๋ฐ์๋ ์ ์๋ ๋ฌธ์ )
- ํ ์คํธ์ ์ฉ์ด
- final ์ ์ธ ๊ฐ๋ฅ
- ์ค๋ฅ ๋ฐฉ์ง (๋ถ๋ณ(immutable) ๊ฐ์ฒด ๋๋ null ๋ฐฉ์ง ๊ฐ๋ฅ)
โ
Qualifier ์ด๋ ธํ ์ด์
๋์ผํ ํ์ ์ ๋น ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ๊ฐ ์ ์๋์ด ์์ ๊ฒฝ์ฐ,
์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ ๋น ์ฑ ์ฒด์ <bean> ํ๊ทธ ํ์์ <qualifier>ํ๊ทธ๋ฅผ ์ค์ ํ์ฌ ํน์ ๋น์ ์ฃผ์ ํ ์ ์๊ฒ ํ๋ค.
โ
โ
2. @Resource
@Resource๋ ์ฃผ์ ํ๋ ค๊ณ ํ๋ ๊ฐ์ฒด์ ์ด๋ฆ(id)์ด ์ผ์นํ๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ฃผ์ ํ๋ฉฐ ํ๋, Setter์ ๋ถ์ผ ์ ์์ง๋ง ์์ฑ์์๋ ๋ถ์ผ ์ ์๋ค. @Autowired์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๋์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์ ์๋์ด ์์ด์ผ ํ๋ค.
์์กด์ฑ ์ค์
ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ธฐ ์ํด javax.annotation-api ์์กด์ฑ์ ์ถ๊ฐํ๋ค.
ํ๋ ์ฃผ์ (Field Injection)
์ธํฐ ์ฃผ์ (Setter Injection)
โ
โ
3. @Inject
@Inject๋ @Autowired์ ์ ์ฌํ๊ฒ ์ฃผ์ ํ๋ ค๊ณ ํ๋ ๊ฐ์ฒด์ ํ์ ์ด ์ผ์นํ๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ฃผ์ ํ๋ค.
์์กด์ฑ ์ค์
ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ธฐ ์ํด javax.inject ์์กด์ฑ์ ์ถ๊ฐํ๋ค.
โ
ํ๋ ์ฃผ์ (Field Injection)
์์ฑ์ ์ฃผ์ (Constructor Injection)
์ธํฐ ์ฃผ์ (Setter Injection)
Named ์ด๋ ธํ ์ด์
@Autowired์ @Qualifier ์ ๋น์ทํ ์ญํ ์ ํ๋๊ฒ @Inject์์์ @Named์ด๋ค.
@Qualifier์ ๋ฌ๋ฆฌ @Named์๋ bean id ์ ์ง์ ํ๋ฏ๋ก
@Autowired, @Qualifier๋ฅผ ์ฌ์ฉํ ๋์ ๋นํด XML ์ค์ ํ์ผ์ด ๋ค์ ์งง์์ง๋ค๋ ํน์ง์ด ์๋ค.
XML ์ค์ ํ์ผ
<Qualifier> ํ๊ทธ๊ฐ ํ์ํ @Qualifier์ ๋ฌ๋ฆฌ @Named๋ XML ์ค์ ํ์ผ์ ์ถ๊ฐ์ ์ผ๋ก ์ค์ ํ ๊ฒ์ด ์๋ค.
์๋ฐ ์ฝ๋
@Named์ ๋น ์ด๋ฆ(id)๋ฅผ ์ง์ ํ๋ค.
*๊ณต๋ถ์ฉ ๊ธฐ๋ก์ ๋๋ค.