๐น ์์กด์ฑ ์ฃผ์ (Dependency Injection, DI)
DI๋ ์ธ๋ถ์์ ๋ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฒฐ์ ํด ์ฃผ๋ ๋์์ธ ํจํด์ผ๋ก, ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ด์ ๋์ด ํด๋์ค ๋ ๋ฒจ์์๋ ์์กด๊ด๊ณ๊ฐ ๊ณ ์ ๋์ง ์๋๋ก ํ๊ณ ๋ฐํ์ ์์ ๊ด๊ณ๋ฅผ ๋์ ์ผ๋ก ์ฃผ์ ํ์ฌ ์ ์ฐ์ฑ์ ํ๋ณดํ๊ณ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๊ฒ ํด์ค๋ค.
์์กด์ฑ์ด๋ ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ์์กด์ฑ์ด ์๋ค๊ณ ํ๋ค.
public class Store {
private Book book;
}
์๋ฅผ ๋ค์ด, ์์ ๊ฐ์ด Store ๊ฐ์ฒด๊ฐ Book ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒฝ์ฐ์ Store ๊ฐ์ฒด๊ฐ Book ๊ฐ์ฒด์ ์์กด์ฑ์ด ์๋ค๊ณ ํํํ๋ค.
Book book = new Book();
Store store = new Store(book);
๊ทธ๋ฆฌ๊ณ ๋ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๊ฒ์ ์์กด์ฑ ์ฃผ์ ์ด๋ผ ํ๋ค.
์์กด์ฑ ์ฃผ์ ๋ฐฉ๋ฒ์๋ ์์ฑ์ ์ฃผ์ , ํ๋ ์ฃผ์ , ์์ ์(setter) ์ฃผ์ , ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์ ์ด ์๋ค.
Spring 4๋ถํฐ๋ ์์ฑ์ ์ฃผ์ ์ ๊ฐ๋ ฅํ ๊ถ์ฅํ๊ณ ์๋ค.
[ ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ ์ด์ ]
์๋ฅผ ๋ค์ด, ์ฑ ๊ณผ ์ฑ ์ ํ๋งคํ๋ Store ํด๋์ค๊ฐ ์๋ค๊ณ ํ์.
public class Store {
private Book book;
public Store() {
this.book = new Book();
}
}
์์ ๊ฐ์ ์์ ํด๋์ค๋ ํฌ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค.
1. ๋ ํด๋์ค๊ฐ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์๋ค.
์์ ๊ฐ์ Store ํด๋์ค๋ ํ์ฌ Book ํด๋์ค์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์๋ค๋ ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค.
๋ ํด๋์ค๊ฐ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์์ด ๋ง์ฝ Store์์ Book์ด ์๋ Pen๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ํ์ ํ๋งคํ๊ณ ์ ํ๋ค๋ฉด Store ํด๋์ค์ ์์ฑ์ ๋ณ๊ฒฝ์ด ํ์ํ๋ค. ์ฆ, ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค. ๊ฐ๊ฐ์ ๋ค๋ฅธ ์ํ๋ค์ ํ๋งคํ๊ธฐ ์ํด ์์ฑ์๋ง ๋ค๋ฅด๊ณ ๋๋จธ์ง๋ ์ค๋ณต๋๋ Store ํด๋์ค๋ค์ด ํ์๋๋ ๊ฒ์ ์ข์ง ๋ชปํ๋ค. ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ผ๋ก ์์์ ๋ ์ฌ๋ฆด ์ ์์ง๋ง, ์์์ ์ ์ฝ์ด ๋ง๊ณ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ฏ๋ก ํผํ๋ ๊ฒ์ด ์ข๋ค.
2. ๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ์๋ ํด๋์ค ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ ธ ์๋ค.
์์ Store์ Book์ ๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ์๋๋ผ ํด๋์ค๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ ธ ์๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
์ฌ๋ฐ๋ฅธ ๊ฐ์ฒด์งํฅ์ ์ค๊ณ๋ผ๋ฉด ๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ ธ์ผ ํ๋ค. ๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ก๋ค๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ ํ ์์ง ๋ชปํ๋๋ผ๋ ์ธํฐํ์ด์ค์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
๊ฒฐ๊ตญ ์์ ๊ฐ์ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋ ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ Store์์ ๋ถํ์ํ๊ฒ ์ด๋ค ์ ํ์ ํ๋งคํ ์ง์ ๋ํ ๊ด์ฌ์ด ๋ถ๋ฆฌ๋์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
Spring์์๋ DI๋ฅผ ์ ์ฉํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ์๋ค.
[ ์์กด์ฑ ์ฃผ์ ์ ํตํ ๋ฌธ์ ํด๊ฒฐ ]
์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐ์ ๋คํ์ฑ์ด ํ์ํ๋ค.
Book, Pen ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ์ ํ์ ํ๋๋ก ํํํ๊ธฐ ์ํด์๋ Product๋ผ๋ Interface๊ฐ ํ์ํ๋ค.
์ฐ์ Book์์ Product ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ํ์.
public interface Product {
}
public class Book implements Product {
}
์ด์ Store์ Book์ด ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์๋ ๋ถ๋ถ์ ์ ๊ฑฐํด์ผ ํ๋ค.
์ด๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ์ธ๋ถ์์ ์ํ์ ์ฃผ์ (Injection) ๋ฐ์์ผ ํ๋ค. ๊ทธ๋์ผ Store์์ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ์ง ์๊ฒ ๋๋ค.
public class Store {
private Product product;
public Store(Product product) {
this.product = product;
}
}
์ด๋ฌํ ์ด์ ๋ก ์ฐ๋ฆฌ๋ ์คํ๋ง์ด๋ผ๋ DI ์ปจํ ์ด๋๋ฅผ ํ์๋ก ํ๋ ๊ฒ์ด๋ค.
Store์์ Product ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๊ธฐ ์ํด์๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ํ์ํ ๊ฐ์ฒด(Bean)๋ฅผ ์์ฑํด์ผ ํ๋ฉฐ, ์์กด์ฑ์ด ์๋ ๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด ํ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ฃผ์ ์์ผ์ผ ํ๋ค.
๋ค์๊ณผ ๊ฐ์ด Book์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๊ฐ์ฒด๋ฅผ Store๋ก ์ฃผ์ ์์ผ ์ฃผ๋ ์ญํ ์ ์ํด DI ์ปจํ ์ด๋๊ฐ ํ์ํ ๊ฒ์ด๋ค.
public class BeanFactory {
public void Store() {
// Bean ์์ฑ
Product book = new Book();
// ์์กด์ฑ ์ฃผ์
Store store = new Store(book);
}
}
์ด๋ฌํ ๋ถ๋ถ์ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์๋ฒฝํ๊ฒ ์ง์์ ํด์ค๋ค.
์คํ๋ง์ ํน์ ์์น๋ถํฐ ํด๋์ค๋ฅผ ํ์ํ๊ณ , ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๊ฐ์ฒด๋ค์ ๊ด๊ณ๊น์ง ์ค์ ํด ์ค๋ค. ์ด๋ฌํ ์ด์ ๋ก ์คํ๋ง์ DI ์ปจํ ์ด๋๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๊ฐ๋ ์ ์ ์ด์ ์ญ์ (Inversion of Control, IoC)๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค. ์ด๋ ํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ง์ ๋ํ ์ฑ ์์ ํ๋ ์์ํฌ์๊ฒ ๋์ด๊ฐ๊ณ , ์์ ์ ์๋์ ์ผ๋ก ์ฃผ์ ๋ฐ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
์์กด์ฑ ์ฃผ์ (Dependency Injection, DI)์ ๋ํด ์ ๋ฆฌํ์๋ฉด ์๋์ ๊ฐ๋ค.
- ๋ ๊ฐ์ฒด ๊ฐ์ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
- ๋ ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
- ๊ฐ์ฒด์ ์ ์ฐ์ฑ์ ๋์ธ๋ค.
- ํ ์คํธ ์์ฑ์ ์ฉ์ดํ๊ฒ ํ๋ค.
ํ ๊ฐ์ฒด๊ฐ ์ด๋ค ๊ฐ์ฒด(๊ตฌ์ฒด ํด๋์ค)์ ์์กดํ ๊ฒ์ธ์ง๋ ๋ณ๋์ ๊ด์ฌ์ฌ์ด๋ค.
์คํ๋ง์ ์์กด์ฑ ์ฃผ์ ์ ๋์์ฃผ๋ DI ์ปจํ ์ด๋๋ก์จ, ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ํด๋์ค๋ค์ ๋ถ๋ฆฌํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฒฐ์ ํด ์ค์ผ๋ก์จ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ์ฐ์ฑ์ ํ๋ณดํด ์ค๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์์๋ณด๋ค ํจ์ฌ ์ ์ฐํ๋ค.
๋จ, ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ผ๋ ค๋ฉด ๋ฐ๋์ DI ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋์ด์ผ ํ๋ค.
๐ reference
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Transaction(ํธ๋์ญ์ ) (0) | 2025.01.09 |
---|---|
[Spring] ๋ค์ํ ์์กด์ฑ ์ฃผ์ ๋ฐฉ๋ฒ๊ณผ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ (0) | 2025.01.04 |
[Spring] @Configuration ์์์ @Bean์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ (0) | 2024.12.31 |
[Spring] @Bean, @Configuration, @Component (0) | 2024.12.11 |
[Spring] @RequestParam, @RequestBody, @ModelAttribute (0) | 2024.12.09 |