์์กด๊ด๊ณ
"A๊ฐ B๋ฅผ ์์กดํ๋ค"
์์ ๋ป์ ์์กด์ ๋์์ธ B๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด, ํด๋น ๋ณ๊ฒฝ์ ์ํฅ์ด A์๋ ์ํฅ์ ๋ฏธ์น๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์๋ ์์๋ฅผ ๋ณด๋ฉฐ ์์ธํ ์ดํดํด๋ณด๊ฒ ์ต๋๋ค.
public class Barista {
private IceVanillaLatteRecipe iceVanillaLatteRecipe;
public Barista() {
iceVanillaLatteRecipe = new IceVanillaLatteRecipe();
}
}
์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์์ต๋๋ค.
"๋ฐ๋ฆฌ์คํ๋ ์์ด์ค ๋ฐ๋๋ผ ๋ผ๋ผ ๋ ์ํผ์ ์์กดํ๋ค."
์์กด๊ด๊ณ๊ฐ ๋ฐ์ํ๋ ์ํฉ
A๊ฐ B๋ฅผ ์์กดํ๋ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- B๊ฐ A์ ํ๋
- B๊ฐ A ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ
- B๊ฐ A์ ๋ก์ปฌ ๋ณ์
- B๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋
์์กด๊ด๊ณ๋ฅผ ์ธํฐํ์ด์ค๋ก ์ถ์ํํ๊ธฐ
ํ์ฌ ๋ฐ๋ฆฌ์คํ๋ IceVanillaLatteRecipe๋ง์ ๋ง๋ค ์ ์์ต๋๋ค.
๋ฐ๋ฆฌ์คํ๊ฐ ๋ค์ํ ์ปคํผ๋ฅผ ๋ง๋ค ์ ์๋๋ก ์ฝ๋๋ฅผ ๋ฐ๊พธ์ด๋ณด๊ฒ ์ต๋๋ค
public class Barista {
private CoffeeRecipe coffeeRecipe;
public Barista(CoffeeRecipe coffeeRecipe) {
this.coffieRecipe = coffieRecipe;
}
}
interface CoffeeRecipe {
}
class IceVanillaLatteRecipe implements CoffeeRecipe {
}
์ด์ฒ๋ผ ์์กด๊ด๊ณ๋ฅผ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ถ์ํ์ํค๋ฉด, ๋ค์ํ ์์กด ๊ด๊ณ๋ฅผ ๋งบ์ ์ ์์ต๋๋ค.
์ฆ ์ค์ ๊ตฌํ ํด๋์ค์์ ๊ด๊ณ๊ฐ ๋์จํด์ง๊ณ , ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋๋ค.
์์กด๊ด๊ณ์ ์ข ๋ฅ
์์กด๊ด๊ณ์ ์ข ๋ฅ๋ก๋ ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ์, ๋์ ์ธ ๊ฐ์ฒด ์์กด๊ด๊ณ๊ฐ ์์ต๋๋ค.
์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ
import ์ฝ๋๋ง ๋ณด๊ณ ์์กด๊ด๊ณ๋ฅผ ํ์ ํ ์ ์๋ ์์กด๊ด๊ณ์ ๋๋ค.
์์ ์์์์ Barista๋ CoffieRecipe์ ์์กดํ๋ค๋๊ฒ์ ์ฝ๋๋ง ๋ด๋ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ํด๋์ค ์์กด๊ด๊ณ ๋ง์ผ๋ก๋, ์ด๋ค CoffieRecipe๊ตฌํ๊ฐ์ฒด๊ฐ Barista์ ์ฃผ์
๋ ์ง ์ ์ ์์ต๋๋ค.
๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด ๊ด๊ณ
์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ์ค์ ์์ฑ๋ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ ์ฐ๊ฒฐ๋ ์์กด ๊ด๊ณ์ ๋๋ค.
์์ ์์์์ ์ ํ๋ฆฌ์ผ์ด์
์คํ ์์ ์ Barista์ ์์ฑ์๋ก IceVanillaLatteRecipe๋ฅผ ์ฃผ์
ํจ์ผ๋ก์จ ์์กด๊ด๊ณ๋ฅผ ํ์ฑํ ์ ์์ต๋๋ค.
์์กด๊ด๊ณ ์ฃผ์ - DI(Dependency Injection)
์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ์์กดํ๋ ํด๋์ค๋ค์ ํด๋น ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐ(์ฃผ์ )ํด ์ฃผ๋ ๊ฒ์ DI(์์กด๊ด๊ณ ์ฃผ์ )๋ผ ํฉ๋๋ค.
์์ ์ฝ๋์ ์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์์ง๋๋ค.
public class Application {
public static void main(String [] args) {
CoffeeRecipe recipe = new IceVanillaLatteRecipe();
Barista b = new Barista(recipe); //DI, ์์กด๊ด๊ณ ์ฃผ์
// ...
}
}
์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํจ์ผ๋ก์จ, ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ์ ๋ณ๊ฒฝ ์์ด ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ํ ๋น์ ์คํ๋ง์์๋ ๋ค์ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ์์ ์ ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๊ณ ์ค๋ช ํฉ๋๋ค.
- ํด๋์ค ๋ชจ๋ธ์ด๋ ์ฝ๋์๋ ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๊ฐ ๋๋ฌ๋์ง ์๋๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ธํฐํ์ด์ค๋ง ์์กดํ๊ณ ์์ด์ผ ํ๋ค.
- ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๋ ์ปจํ ์ด๋๋ ํฉํ ๋ฆฌ ๊ฐ์ ์ 3์ ์กด์ฌ๊ฐ ๊ฒฐ์ ํ๋ค.
- ์์กด๊ด๊ณ๋ ์ฌ์ฉํ ์ค๋ธ์ ํธ์ ๋ํ ๋ ํผ๋ฐ์ค๋ฅผ ์ธ๋ถ์์ ์ ๊ณต(์ฃผ์ )ํด์ค์ผ๋ก์จ ๋ง๋ค์ด์ง๋ค.
์ ์ด์ ์ญ์ - IoC(Inversion of Control)
ํ๋ก๊ทธ๋ ์ ์ ์ด ํ๋ฆ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์คํ๋ง์ ์ฌ์ฉํ์ฌ ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋, ๊ฐ๋ฐ์๋ ์๋ฌด๋ฐ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋๋ฐ๋ ์คํ๋ง์ด ๋ด๋ถ์ ์ผ๋ก ๋ค์ํ ์์ ๋ค์ ์งํํฉ๋๋ค.
์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ด์ฅ ํฐ์ผ์ ๋์ด๋ค๊ฑฐ๋ ํ๋ ๋ฑ์ ํ์๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ์คํํฉ๋๋ค.
์ด๋ ๋ฏ ํ๋ก๊ทธ๋ ์ ์ ์ด ํ๋ฆ์ด ๊ฐ๋ฐ์๊ฐ ์๋ ์ธ๋ถ์ ์๋ ๊ฒ์ ์ ์ด์ ์ญ์ (IoC)๋ผ ํฉ๋๋ค.
์ฝ๊ฒ ์๊ฐํ๋ฉด ํ๋ก๊ทธ๋จ์ ์งํ ํ๋ฆ์ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์์ผ๋ฉฐ, ๊ทธ ์ฌ์ด์ ๊ฐ๋ฐ์์ ์ฝ๋๊ฐ ์ถ๊ฐ๋๋ ๊ฒ์ด๋ผ ์๊ฐํ ์ ์์ต๋๋ค.
์ ์ด์ ์ญ์ ์์๋ ๊ฐ์ฒด๊ฐ ์์ ์ด ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ค์ค๋ก ์ ํํ์ง๋, ์์ฑํ์ง๋ ์์ต๋๋ค.
์ฌ์ง์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๊ณ , ์ด๋์ ์ฌ์ฉ๋๋์ง๋ ๋ชจ๋ฆ ๋๋ค.
๋ชจ๋ ์ ์ด ๊ถํ์ ์์ ์ด ์๋ ๋ค๋ฅธ ๋์์๊ฒ ์์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ ์ปคํผ ๋ ์ํผ์ ๋ฐ๋ฆฌ์คํ๋ฅผ ์ข ๋ ๋ฐ์ ์์ผ IoC๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
public class BaristaFactory {
public Barista barista() {
CoffeeRecipe recipe = new IceVanillaLatteRecipe();
Barista b = new Barista(recipe); //DI, ์์กด๊ด๊ณ ์ฃผ์
return b;
}
}
public class Application {
public static void test(String [] args) {
Barista b = new BaristaFactory().barista(); //IoC ์ ์ด์ ์ญ์
}
}
์ ์ฝ๋์์ Barista์ BaristaFactory์ ์ ์ด์ ์ญ์ ์ด ์ ์ฉ๋์ด ์์ต๋๋ค.
์๋ Barista๊ฐ CoffieRecipe๋ฅผ ๊ฒฐ์ ํ๊ณ ์์ฑํ๋ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์์์ผ๋, ์ง๊ธ์ BaristaFactory์๊ฒ ์์ต๋๋ค.
์์ ์ด ์ด๋ค CoffieRecipe๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉํ ์ง๋ฅผ ๊ฒฐ์ ํ ๊ถํ์ BaristaFactory์๊ฒ ๋๊ฒผ๊ธฐ์, Barista๋ ์ด์ ์๋์ ์ธ ์กด์ฌ๊ฐ ๋์์ต๋๋ค.
BaristaTest๋ BaristaFactory๊ฐ ๋ง๋ค๊ณ ์ด๊ธฐํํด์ ์์ ์๊ฒ ์ฌ์ฉํ๋๋ก ๊ณต๊ธํด์ฃผ๋ CoffieRecipe๋ฅผ ์ฌ์ฉํ ์๋ฐ์ ์์ต๋๋ค.
๋ฐ๋ก ์ด๊ฒ์ด ์ ์ด์ ์ญ์ ์ ๋๋ค.
ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ด๊ฐ ์์ฑํ ์ฝ๋์ ์ ์ด๊ถ์ด ์ธ๋ถ์ ์์ผ๋ฉฐ, ์ธ๋ถ์์ ๋์ ์ฝ๋๋ฅผ ๋์ ์คํํ๋ค๋ฉด ๊ทธ๊ฒ์ ํ๋ ์์ํฌ์ ๋๋ค.
๊ทธ๋ฌ๋ ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ง์ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ๋ด๋นํ๋ค๋ฉด ๊ทธ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์ฝ๊ฒ ์ค๋ช ํ๋ฉด ํ๋ ์์ํฌ๋ ๋ด ์ฝ๋๊ฐ ๋๊ตฌ๊ฐ ๋์ด ํ๋ ์์ํฌ์์ ์ฌ์ฉ๋๋ ๊ฒ์ด๊ณ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋๊ตฌ๊ฐ ๋์ด ๋ด ์ฝ๋์์ ์ฌ์ฉ๋์ด์ง๋ ๊ฒ์ ๋๋ค.
Reference
'๐๏ธ Spring > ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] @ComponentScan (0) | 2021.12.11 |
---|---|
[Spring] @Configuration (0) | 2021.12.11 |
[Spring] ์ฑ๊ธํค (feat. ์ฑ๊ธํค์ ๊ตฌํํ๋ ์ฌ๋ฌ ๋ฐฉ์) (2) | 2021.12.11 |
[Spring] ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) | 2021.12.11 |
[Spring] ์คํ๋ง์ด๋? (0) | 2021.12.11 |