โ DI ํ์์ฑ
์ฐ์ "์์กด์ฑ(Dependency)"์ ์๋ฏธ์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํด๋ณด์๋ฉด,
ํด๋์ค ๊ฐ ์์กด์ฑ์ด ์๋ค
= ํ ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค
= ํ ํด๋์ค๊ฐ ๋ฐ๋๋ฉด ๋ค๋ฅธ ํด๋์ค๋ ์ํฅ์ ๋ฐ๋๋ค
= ํ ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค์ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ์์ ๋กญ์ง ์๋ค
์ ๋๋ก ์ ๋ฆฌํ ์ ์๊ฒ ๋ค.
์ข์ ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น(SOLID) ์ค
DIP(Dependency Inversion Principle, ์์กด์ฑ ์ญ์ ์์น)๋ ๋ฐ๋ก ์ด ์์กด์ฑ์ ๋ํด ์ด์ผ๊ธฐํ๋ค.
- ๊ตฌ์ฒด์ ์์กดํ ๊ฒฝ์ฐ: ์ถ์ ์ธํฐํ์ด์ค์ ๋ณ๊ฒฝ์ด ์๊ธฐ๋ฉด, ์ด๊ฒ์ ๊ตฌ์ฒดํํ ๊ตฌํ์ฒด๋ค๋ ์์ ํด์ผ ํ๋ค.
- ์ถ์์ ์์กดํ ๊ฒฝ์ฐ: ๊ทธ๋ฌ๋ ๊ตฌํ์ฒด์ ๋ณ๊ฒฝ์ด ์๊ธฐ๋๋ผ๋, ์ธํฐํ์ด์ค๋ ๋ณ๊ฒฝ๋ ํ์๊ฐ ์๋ค.
๋ฐ๋ผ์ ๊ตฌ์ฒด๊ฐ ์๋ ์ถ์์ ์์กดํด์ผ, ์ ์ฐํ๊ณ ํ์ฅ์ฑ์ด ์ข์ ์์คํ ์ ์ค๊ณํ ์ ์๋ค.
์ฆ DIP๋ฅผ ๋ฐ๋ฅด๋ ค๋ฉด ๊ตฌ์ฒด์ ์์์ ๋ํ ์์กด์ ํผํ๊ณ , ์ถ์ํ(์ธํฐํ์ด์ค)์ ์์กดํด์ผ ํ๋ค.
์์กด๊ด๊ณ ์ญ์ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก ์์กด์ฑ ์ฃผ์ (DI, Dependency Injectcion)๊ฐ ์๋ค.
์์กด์ฑ ์ฃผ์ (DI, Dependency Injection)์ด๋,
์ด๋ฌํ ์์กด์ฑ์ "์ธ๋ถ"์์ ์ฃผ์ ์์ผ ์ฃผ๋ ๊ฒ์ ๋งํ๋ค.
์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ์์ผ์ฃผ๋ฉด,
๊ฐ ํด๋์ค๋ ์์ ์ ๊ธฐ๋ฅ๋ง์ ์คํํ๊ณ , ์์ ๊ณผ ๋ค๋ฅธ ํด๋์ค์์ ์์กด์ฑ์ ๋ํด์๋ ๋์ด์ ์ ๊ฒฝ ์ฐ์ง ์๊ฒ ๋๋ค.
๋ค์ ๋งํด, ์์กด์ฑ์ด ์๋ ํด๋์ค๋ผ๋ฆฌ๋ ์๋ก์ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ์์ ๋ก์์ง๊ฒ ๋๋ค.
โ Spring DI
0๏ธโฃ DI ์์ด ๊ตฌํํ ์ฝ๋
@Controller
public class ProductController {
ProductService productService = new ProductService();
}
- ProductController๊ฐ ProductService๋ฅผ ์ง์ ์์ฑํ๊ณ , ์์กด์ฑ๋ ์ง์ ์ฃผ์ ํ๋ค.
- ๋ง์ฝ ProductService์ ๋ณ๊ฒฝ์ด ์๊ธฐ๋ฉด, ProductController์ ์ฝ๋๊น์ง ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํ๋ค.
- ๋ ํด๋์ค ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋์์, ํ์ฅ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๋จ์ด์ง๊ฒ ๋๋ค.
์ฐ๋ฆฌ๋ ํด๋์ค ๊ฐ ๊ฒฐํฉ๋๊ฐ ๋ฎ๊ณ , ํ์ฅ์ฑ๊ณผ ์ ์ฐ์ฑ์ด ๋์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์ ํด๋์ค ๊ฐ ์์กด๋๋ฅผ ์ธ๋ถ์์ ์ฃผ์ ํด์ฃผ๋๋ก, DI๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
์ฐ๋ฆฌ๋ @Autowired ๋ผ๋ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ, ์คํ๋ง ํ๋ ์์ํฌ์๊ฒ ์์กด์ฑ์ ์ฃผ์ ํด๋ฌ๋ผ๊ณ ์์ฒญํ ์ ์๋ค.
- ์ด๋ ์์กด์ฑ์ ์ฃผ์ ๋ฐ๋ ๊ฐ์ฒด๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์ด ์์ด์ผ ํ๋ค.
Spring DI ๊ตฌํ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ ํ๋ ์ฃผ์ , Setter ์ฃผ์ , ์์ฑ์ ์ฃผ์ ์ด ์๋ค.
1๏ธโฃ ํ๋ ์ฃผ์ (Field Injection)
@Controller
public class ProductController {
@Autowired
private ProductService productService;
}
- ๊ฐ๋จํ๊ฒ ์ฃผ์ ๋ฐ๊ณ ์ ํ๋ ํ๋ ์ ์ธ๋ถ์ @Autowired ์ด๋ ธํ ์ด์ ๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
- ์์กด์ฑ์ด ์ธ๋ถ์์ ์ด๋ป๊ฒ ์ฃผ์ ๋๋์ง ๋ช ํํ ๋๋ฌ๋์ง ์๋๋ค๋ ๋จ์ ์ด ์๋ค.
์ ์ฝ๋๋ง ๋ณด๊ณ ๋ ProductService๊ฐ ์ด๋ป๊ฒ ์์ฑ๋๊ณ , ์ฃผ์ ๋๋์ง ์ ์ ์๋ค.
์ด๋ก ์ธํด ์ฝ๋์ ํ์ฅ์ด๋ ํ ์คํธ, ์ ์ง๋ณด์์ ์ด๋ ค์์ด ์๊ธธ ์ ์๋ค.
2๏ธโฃ Setter ์ฃผ์ (Setter Injection)
@Controller
public class ProductController {
private ProductService productService;
@Autowired
public void setProductService(ProductService productService){
this.productService = productService;
}
}
- Setter๋ฅผ ์ ์ํ๊ณ , ๊ทธ ์์ @Autowired ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค๋ค.
- Runtime์ ์์กด์ฑ์ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ, Runtime์ ์์กด์ฑ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๋ค.
- ์์กด์ฑ์ ์ฃผ์ ํ ํ๋๋ final๋ก ์ ์ธํ ์ ์์ด์, ๊ฐ์ฒด์ ๋ถ๋ณ์ ๋ณด์ฅํ ์ ์๋ค.
- Setter๋ฅผ ํตํด ์์กด๊ด๊ณ ์ฃผ์ ์ ํ์ง ์์๋ ๊ฐ์ฒด ์์ฑ์ ๊ฐ๋ฅํ๋ค๋ ๋จ์ ์ด ์๋ค.
๋ง์ฝ ๊ฐ์ฒด ์์ฑ๋ง ํด๋๊ณ ๊ทธ ๊ตฌํ์ฒด๋ฅผ Setter๋ฅผ ํตํด ์ฃผ์ ํด์ฃผ์ง ์๋๋ค๋ฉด NullPointerException์ด ๋ฐ์ํ ์ ์๋ค.
3๏ธโฃ ์์ฑ์ ์ฃผ์ (Constructor-based DI)
@Controller
public class ProductController {
private final ProductService productService;
@Autowired
public ProductController(ProductService productService){
this.productService = productService;
}
}
- constructor๋ฅผ ์ ์ํ๊ณ , ๊ทธ ์์ @Autowired ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค๋ค.
- ๊ฐ์ฒด ์์ฑ ์์ ์ ์คํ๋ง์ด ์์กด์ฑ์ ์ฃผ์ ํด์ค๋ค.
- ๊ฐ์ฒด ์์กด์ฑ ์ฃผ์ ์ด ํ์์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ผ๋ฏ๋ก, NullPointerException์ ๋ฐฉ์งํ ์ ์๋ค.
- ๊ฐ์ฒด๋ฅผ final๋ก ์ ์ธํ์ฌ ๊ฐ์ฒด๊ฐ ์ต์ด ์ฃผ์ ๋ ์ดํ ๋ณํ์ง ์๋๋ก ํ ์ ์๋ค. (์์กด๊ด๊ณ ๋ถ๋ณ์ฑ O)
#๏ธโฃ ์ ์ค ์ด๋ค ์ฃผ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊น?
- ๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ถ์ฅ๋๋ ์ฌํญ์ด๋ค.
- ์์ฑ์ ์ฃผ์ ๋ง์ด ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
- ์์ฑ์ ์ฃผ์ ๋ง์ด NullPointerException์ ๋ฐฉ์งํ ์ ์๋ค.
- ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด, ์์ฑ์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ด๋ ํ ์์กด์ฑ์ด ํ์ํ์ง ๋ช ํํ ๋๋ฌ๋๋ค.
- (์ฐธ๊ณ ) ์์ฑ์ ์ฃผ์ ๋ง์ ์ฅ์ ์ด์๋ ๊ฒ: ์ํ ์ฐธ์กฐ ๋ฐฉ์ง
์ด์ ๊น์ง๋ ์์ฑ์ ์ฃผ์ ๋ง์ด ์ํ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค๋ ๊ฒ์ด ์์ฑ์ ์ฃผ์ ๋ง์ ํฐ ์ฅ์ ์ด์๋ค.
ํ๋ ์ฃผ์ ๊ณผ setter ์ฃผ์ ๊ณผ๋ ๋ฌ๋ฆฌ, ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์ํ ์ฐธ์กฐ ๋ฐ์์ ์๋ฌ๋ฅผ ๋์์ฃผ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ ์คํ๋ง๋ถํธ2.6 ๋ถํฐ๋ ์ด ๋ถ๋ถ์ด ํจ์น๋์ด, 3๊ฐ์ง ๋ฐฉ์ ๋ชจ๋ ์ํ ์ฐธ์กฐ ๋ฐ์ ๋ฐฉ์ง๊ฐ ๋๋ค๊ณ ํ๋ค.
์ํ ์ฐธ์กฐ๋ , ๋ ํด๋์ค๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ ์ํฉ์ ๋งํ๋ค.
์๋ฅผ ๋ค๋ฉด ํด๋์ค A๋ ํด๋์ค B๋ฅผ ์ฐธ์กฐํ๊ณ , ํด๋์ค B๋ ํด๋์ค A๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
ํด๋์ค A์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ํด๋์ค B์ ์ธ์คํด์ค๊ฐ ํ์ํ๊ณ , ํด๋์ค B์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ํด๋์ค A์ ์ธ์คํด์ค๊ฐ ํ์ํ ๊ฒฝ์ฐ์ด๋ค.
โ Reference
- ํด๋ฆฐ ์ํคํ ์ฒ (2019, Rober C. Martin)
'๊ฐ๋ฐ ๊ณต๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Pub/Sub Architecture (0) | 2023.11.28 |
---|---|
URI vs URN vs URL ์ฐจ์ด์ ? (0) | 2023.08.18 |
REST API์ URI ์ค๊ณ ๊ท์น (0) | 2023.08.11 |
DDD ์ค๊ณ, SQL ์ค์ฌ ์ค๊ณ (0) | 2023.08.03 |
[๊ฐ์ ์ ๋ฆฌ] ์ค์ ๋ก ์ปดํจํฐ๋ผ๋ฆฌ๋ IP์ฃผ์๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค (0) | 2023.05.20 |