ํ ๋น์์คํ๋ง 1์ฅ ๊ธ์ ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด ์ผ์ ์ํ(๊ฐ๊ตฌ๋ง๋ค๊ธฐ)์ IoC๋ฅผ ์ ์ฉํด๋ดค์ต๋๋ค. ๊ธ์๋ Commit์ ํ์คํ ํ์ํด๋จ์ผ๋, ๊ธ๊ณผ ์ปค๋ฐ์ ๋งค์นญ์ํค๋ฉฐ ๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋จผ์ ์ํฉ์ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๊ฐ๊ตฌ๋ฅผ ๋ง๋๋ ค๋ฉด ์ผ๋จ ๊ฐ๊ตฌ๋ฅผ ๋ง๋ค ์ ์๋ ๊ธฐ์ ์(์ดํ FurnitureMaker)๊ฐ ์์ด์ผ๊ฒ ์ฃ . ๋ค์๊ณผ ๊ฐ์ด ์ ์ํด๋ณด๊ฒ ์ต๋๋ค. Commit - feat: ํ์ํ ๊ฐ์ฒด ์ ์
class FurnitureMaker {
private final String name;
FurnitureMaker(String name) {
this.name = name;
}
}
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ตฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ชฉ์ฌ(์ดํ Wood)์ ์ ๋ง์น(์ดํ IronHammer)๋ ํ์ํ ๊ฒ์ ๋๋ค.
class Wood {}
class IronHammer {}
๋ ๋ค ํ์ฌ ๋ฑํ ๊ธฐ๋ฅ์ด ์๊ฐ๋์ง๋ ์๊ณ , ํ๋๋ ์๊ฐ์ด ์๋์ ์ ์๋ง ํด๋์์ต๋๋ค. ์์ง๊ณ ๋ชป์ง๊ณ ๋ฅผ ๋ ๋, ์ค๋ช ์ ์ํด ํ์ํ ๊ฐ์ฒด๋ฅผ ์ ์ํ ๊ฒ ๋ฟ์ด๋ ์กฐ๊ธ ์์ํด๋ ๋์ด๊ฐ์ฃผ์ธ์...!^^;
์ด์ ๊ฐ๊ตฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ค๋น๊ฐ ๋๋ฌ์ต๋๋ค. ์์(์ดํ Chair)๋ฅผ ๋ง๋ค์ด๋ด ์๋ค. Chair๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ์ ์ด๋ Wood 5๊ฐ๋ ํ์ํ๋ค๊ณ ํฉ๋๋ค. Commit - feat: 1 - ์ด๋๊ฐ FurnitureMaker - makeChair(), makeDesk()
class Chair {
static final int WOOD_AMOUNT = 5;
Chair(List<Wood> woods) {
if (woods.size() != WOOD_AMOUNT) {
throw new IllegalArgumentException(String.format("์์๋ฅผ ๋ง๋ค๊ธฐ ์ํด %d๊ฐ์ ๋๋ฌด๊ฐ ํ์ํฉ๋๋ค.", WOOD_AMOUNT));
}
}
}
๋ค์์ FurnitureMaker๊ฐ Chair๋ฅผ ๋ง๋๋ ์ฝ๋์ ๋๋ค.
// FurnitureMaker.java
Chair makeChair() {
List<Wood> woods = new ArrayList<>();
for (int i = 0; i < Chair.WOOD_AMOUNT; i++) {
woods.add(new Wood());
}
IronHammer ironHammer = new IronHammer();
return ironHammer.makeChair(woods);
}
์ค์ ๋ก FurnitureMaker๊ฐ Chair๋ฅผ ์ ๋ง๋๋ ์ง ํ์ธํด๋ณผ๊น์?
class FurnitureMakerTest {
@Test
void makeChair() {
FurnitureMaker furnitureMaker = new FurnitureMaker("root");
Chair chair = furnitureMaker.makeChair();
assertThat(chair).isNotNull();
}
}
ํ ์คํธ๊ฐ ํต๊ณผํ๋ค์. FurnitureMaker๋ Chair๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด ์ฝ๋์๋ ๋ง์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๋ค ๋ฌธ์ ์ผ๊น์? ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ makeChair() ๋ฉ์๋ ํ๋์ ์ฌ๋ฌ๊ฐ์ง ๊ด์ฌ์ฌํญ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. makeChair() ํจ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ด์ฌ์ฌ๊ฐ ์์ต๋๋ค.
makeChair()์ ๊ด์ฌ์ฌํญ
- ํ์ํ ์์ Wood๋ฅผ ์ค๋น(์์ฑ)ํ๋ ๊ฒ
- ํ์ํ IronMaker๋ฅผ ์ค๋น(์์ฑ)ํ๋ ๊ฒ
- ์ค๋น๋ฌผ(Wood, IronMaker)๋ฅผ ํ์ฉํ์ฌ Chair๋ฅผ ๋ง๋๋ ๊ฒ
๋ง์ ๊ด์ฌ์ฌ๊ฐ ์๋ค๋ ๊ฒ ์ฒซ๋ฒ์งธ ๋ฌธ์ ์ ๋๋ค. ํนํ, 1๋ฒ์ด๋ 2๋ฒ์ ์ค๋ณต ๊ฐ๋ฅ์ฑ์ด ๋ง๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, FurnitureMaker๊ฐ Chair ๋ง๊ณ ๋ Desk๋ ๋ง๋ ๋ค๊ณ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
// FurnitureMaker.java
Desk makeDesk() {
List<Wood> woods = new ArrayList<>();
for (int i = 0; i < Desk.WOOD_AMOUNT; i++) {
woods.add(new Wood());
}
IronHammer ironHammer = new IronHammer();
return ironHammer.makeDesk(woods);
}
Desk๋ฅผ ๋ง๋ค ๋๋ Wood์ IronHammer๋ฅผ ์ค๋นํด์ผ ํฉ๋๋ค. ์ผ๋จ ์ด ์ค๋ณต๋ถํฐ ์์ ๋ด ์๋ค. Commit - feat: 2 - ๋ฉ์๋ ์ถ์ถ(getWoods(), getIronHammer())์ ํตํ ์ค๋ณต ์ ๊ฑฐ
// FurnitureMaker.java
private List<Wood> getWoods(int woodAmount) {
List<Wood> woods = new ArrayList<>();
for (int i = 0; i < woodAmount; i++) {
woods.add(new Wood());
}
return woods;
}
// FurnitureMaker.java
private IronHammer getIronHammer() {
return new IronHammer();
}
์ด์ Chair, Desk ๋ฟ ์๋๋ผ, ์ฅ๋กฑ์ ๋ง๋ค๋ ์ท์ฅ์ ๋ง๋ค๋ ํด๋น ํจ์์์ getWoods()์ getIronHammer๋ฅผ ํธ์ถํ๋ฉด ๋๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด์ ์ค๋ณต์ ์์ด์ก์ต๋๋ค.
์ด์ ๋งจ ์ฒ์ ์ฝ๋๋ณด๋ค๋ ์ข์์ก๋ค๊ณ ํ ์ ์์ง๋ง, ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- ์์๋ ์ด๋ค ๋ชฉ์ฌ๋ฅผ ์ฐ๋๋์ ๋ฐ๋ผ ๊ทธ ํ์ง์ด ๋ฌ๋ผ์ง๋ค๊ณ ํฉ๋๋ค. ๋ชฉ์ฌ๊ฐ ์ด๋ ํ๋์ด๊ฒ ์ต๋๊น? ์ง๋๊ฐ๋ค ๊ตด๋ฌ๋ค๋๋ ๋ชฉ์ฌ๋ ์์ ๊ฒ์ด๊ณ , ์ฒ๋ ๋ฌต์ ๊ทํ ๋ชฉ์ฌ๋ ์์ ๊ฒ์ ๋๋ค. ์ง๊ธ์ ํ์ค ์ธ๊ณ์ ๋ค๋ฅด๊ฒ, Wood๋ผ๋ ๊ฐ์ฒด ํ๋ ๋ฟ์ ๋๋ค.
- ์ฅ์ธ์ ๋๊ตฌ๋ฅผ ํํ์ง ์๋๋ค๋ ๋ง๋ ์์ง ์์ต๋๊น? ์ง๊ธ FurnitureMaker๋ IronHammer ๋ฐ์ ๋ชป์๋๋ค. ๋ง์น๊ฐ ๊ผญ ์ ์ฌ์ผ ํฉ๋๊น? ๋๋ง์น, ๋๋ฌด๋ง์น, ์ฌ์ง์ด ๊ณ ์๋ ๋ฟ ๋ง์น๋ก๋ ์์๋ฅผ ๋ง๋ค ์ ์์ ๊ฒ์ ๋๋ค. ์ง๊ธ์ ํ์ค ์ธ๊ณ์ ๋ค๋ฅด๊ฒ, ๋ง์น๋ IronHammer๋ผ๋ ๊ฐ์ฒด ํ๋ ๋ฟ์ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋จผ์ Wood์ Hammer๋ฅผ interface๋ฅผ ํ์ฉํ์ฌ ์ถ์ํํด๋ด ์๋ค. ์ด์ฐจํผ Wood๋ Hammer๋ ์ธํฐํ์ด์ค๋ก ์ถ์ํํ๋ค๋ ๊ฑด ๋๊ฐ๊ธฐ ๋๋ฌธ์ Hammer ์ฝ๋๋ง ์ ์ด๋๊ฒ ์ต๋๋ค. Commit - feat: 3 - Wood, Hammer ์ถ์ํ
interface Hammer {
Chair makeChair(List<Wood> woods);
Desk makeDesk(List<Wood> woods);
}
class IronHammer implements Hammer {
@Override
public Chair makeChair(List<Wood> woods) {
return new Chair(woods);
}
@Override
public Desk makeDesk(List<Wood> woods) {
return new Desk(woods);
}
}
์ฌ๊ธฐ์์ ๋ค์์ ์ ์ ์์ต๋๋ค.
์ถ์ํ๋ฅผ ํ๋ฉด ๋ฐ๊ฟ ์ ์๋ค.
์ฌ์ค ์ด ๋ฌธ๊ตฌ๋ ์ด์ฐ๋ณด๋ฉด ์ด๋ฒ ํฌ์คํธ์ ๊ฐ์ฅ ํต์ฌ์ด ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๋์ค์ ์ ์ผ๋ ค๊ณ ํ๋๋ฐ ์๋์น ์๊ฒ ๋ฒ์จ ์ถ์ํ๊ฐ ๋์๋ฒ๋ ธ๋ค์... ํ ๋น์ ์คํ๋ง์๋ ์ด๋ฏธ Connection์ด ์ถ์ํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ด ์๋์์๋๋ฐ์. ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ค๋ณด๋๊น ๋ฒ์จ ์ถ์ํํด์ผํ์ต๋๋ค... ์์ฝ์ง๋ง ๊ณ์ ์งํํ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ ์ง๋ฌธ!
๋ญ ๋ฐ๊ฟ ์ ์๋๊ณ ์? ์ ๋ต์ "๊ตฌํ์ฒด๋ฅผ ๋ฐ๊ฟ ์ ์๋ค" ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ๋ง์น๋ ๋ฟ ๋ง์น๋ ๋ ๋ค ๋ง์น์ฃ ? ๊ทธ๋๊น ๋ง์น๋ผ๊ณ ์ถ์ํํ๋ฉด(๋ญ๋ฑ๊ทธ๋ฆฌ๋ฉด), FurnitureMaker๊ฐ ์ ๋ง์น๋ ๋ฟ ๋ง์น๋ ๋ค ์ธ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ ํ!
ํ์ฌ "๋ง์น"๋ก ์ถ์ํํ์ฃ . ์ ๋ง์น, ๋ฟ ๋ง์น์ ๊ณตํต์ ์ ์ถ๋ ค์ ๋ง์ ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ค ์ฅ์ธ์ ๋ง์น๊ฐ ์๋๋๋ผ๋, ๋๋ฉฉ์ด๋ก๋ ์์๋ฅผ ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํด๋ด ์๋ค. ์ด์ฉ๋ฉด ๊ตด๋ฌ๋ค๋๋ ์ปคํผ์บ์ผ๋ก๋ ์์๋ฅผ ๋ง๋ค ์๋ ์๊ฒ ์ฃ . ๊ทธ๋ฌ๋ฉด ๋ง์น, ๋๋ฉฉ์ด, ์ปคํผ์บ๋ ๊ณตํต์ ์ด ์๋ค๊ณ ๋ณผ ์ ์๊ฒ ์ฃ ? ์๋ฅผ ๋ค์ด, '๋จ๋จํ๋ค'์ ๊ฐ์ ๊ณตํต์ ์ด ์๋ค๊ณ ์๊ฐํ ์ ์์ฃ . ์ด ์ฅ์ธ์ ์ง์ง ๋๊ตฌ๋ ๊ฐ๋ฆฌ์ง ์๊ณ , ๋ญ๋ง ์๊ธฐ๋ง ํ๋ฉด ์์๋ฅผ ๋ง๋ค ์ ์๋๋ด ๋๋ค. ๋ฐ๋ผ์, ๋ง์น๋ ๋๋ฉฉ์ด๋ ์ปคํผ์บ์ด๋ ์๊ด์์ด ๋๊ตฌ๋ฉด ๋๋, "๋๊ตฌ"๋ผ๊ณ ์ถ์ํํด๋ด ์๋ค. "๋ง์น"๋ ์ด์ฐ๋ณด๋ฉด ์ถ์ํ์ ๊ฒฐ๊ณผ๋ฌผ์ด์๋๋ฐ, "๋ง์น"๋ฅผ ๋ ์ถ์ํํด์ "๋๊ตฌ"๊ฐ ๋๋ค์? ์ด๋ด ๋ ํ ๋จ๊ณ ๋ ์ถ์ํํ๋ค๋ ํํ์ ์ฐ๋ ๊ฒ ๊ฐ์์. ๊ทธ๋ฆฌ๊ณ ๋ง์น๋ก ์ถ์ํํ์ ๋๋ณด๋ค ๋๊ตฌ๋ก ์ถ์ํํ์ ๋ ๋ "๊ณ ์์ค์ ์ถ์ํ์ด๋ค"๋ผ๊ณ ํํํ๋๋ผ๊ณ ์.
FurnitureMaker์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
class FurnitureMaker {
private final String name;
FurnitureMaker(String name) {
this.name = name;
}
Chair makeChair() {
List<Wood> woods = getWoods(Chair.WOOD_AMOUNT);
Hammer hammer = getHammer();
return hammer.makeChair(woods);
}
Desk makeDesk() {
List<Wood> woods = getWoods(Desk.WOOD_AMOUNT);
Hammer hammer = getHammer();
return hammer.makeDesk(woods);
}
private List<Wood> getWoods(int woodAmount) {
List<Wood> woods = new ArrayList<>();
for (int i = 0; i < woodAmount; i++) {
woods.add(new CheapWood());
}
return woods;
}
private Hammer getHammer() {
return new IronHammer();
}
}
makeChair(), makeDesk() ํจ์๋ค์์ ์ถ์ํ๋ Wood์ Hammer๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฑธ ๋ณด์ค ์ ์์ต๋๋ค.
์์์ "์ถ์ํํ๊ธฐ ๋๋ฌธ์ ๋ฐ๊ฟ ์ ์๋ค"๋ผ๊ณ ํ๋๋ฐ์. ์ด ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ค์ ๋ก ๋ฐ๊ฟ ์ ์์ต๋๊น? ๋ญ... ๊ฐ๋ฅ์ ํฉ๋๋ค๋ง, ์ถ์ํ์ ๊ฐ์น๋ฅผ ์ด๋ฆฌ์ง ๋ชปํ์ต๋๋ค. ๋ค์ ๋งํ๋ฉด, ๋ฐ๊ฟ ์ ์์ง๋ง ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, new CheapWood(), new IronHammer() ๋๋ฌธ์ ๋๋ค. ๋ค๋ฅธ Wood, Hammer๋ฅผ ์ฐ๊ณ ์ถ์ผ๋ฉด FurnitureMaker์ ์ฝ๋๋ฅผ ์ง์ ๋ฐ๊ฟ์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ ์ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๊ฐ๋ฐ์ ์ผ๋ก ์ ๊ทผํ๋ฉด ์ค๋ช ํ๊ธฐ๊ฐ ์กฐ๊ธ ์ด๋ ค์์, ์ค์ํ์ ๋น๋์ด ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค. ๋ง์ฝ์ ์ข์ Wood๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ FurnitureMaker์ ํต์ฌ์ญ๋์ด๋ผ๊ณ ํด๋ด ์๋ค. ๊ทธ๋ฌ๋ฉด FurnitureMaker๋ ์ด๊ฑธ ๋น๋ฐ๋ก ํ๊ณ ์ถ๊ฒ ์ฃ . ํ์ง๋ง ์ค์์ ์ด๋ค๊ฐ์? FurnitureMaker๋ฅผ ์๋ ์ฌ๋(FurnitureMaker์ ์ฝ๋๋ฅผ ๋ณผ ์ ์๋ ์ฌ๋)์ ์ด ์ฌ๋์ด ์ด๋ป๊ฒ Wood๋ฅผ ๊ฐ์ ธ์ค๋ ์ง, ์ด๋ค Hammer๋ฅผ ๊ฐ์ ธ์ค๋ ์ง ์ ์ ์์ฃ . ์ด๋ฐ ์ํ๋ก FurnitureMaker๋ ๋ค๋ฅธ ์ฌ๋์ด ๋ ธํ์ฐ๋ฅผ ๋ฒ ๊ปด์ ์ซ๋ฑ ๋งํ ๊ฒ์ ๋๋ค. ๋ํ ๋๋ฌด ํฌ๋ช ํด์ ์ฌ๊ธฐ๋ฅผ ์น๊ณ ์ถ์ด๋ ์น ์๋ ์์ด์. ์๋ฅผ ๋ค์ด, ๋์ ์ฌ๋ํํ ๋ ์ผ ๋ชฉ์ฌ๋ฅผ ๊ฐ์ ธ๋ค๊ฐ ๋น์ผ ์์๋ผ๊ณ ์์ฌ์ ํ๊ณ , ์ฐฉํ ์ฌ๋ํํ ๋ ๋น์ผ ๋ชฉ์ฌ๋ฅผ ์ด๋ค๊ณ ํฉ์๋ค. Chair๋ฅผ ์ฌ๋ ์ฌ๋์ด Furniture๊ฐ ์ด๋ค Wood๋ฅผ ์ฐ๋ ์ง, ์ด๋ค Hammer๋ฅผ ์ฐ๋ ์ง ์๊ธฐ ๋๋ฌธ์ ์์ผ ์๊ฐ ์์ฃ . ์ค๋ น FurnitureMaker๊ฐ ๊ณตํํ๊ณ , ์๋ ํฌ๋ช ํด์ ์ฌ๊ธฐ์น์ง ์๋๋ค๊ณ ํด๋ ์ฌ์ ํ ๋ฌธ์ ์ ๋๋ค. ๋ถ์๊ฐ ์์, "์ ๋น์ผ ๋ชฉ์ฌ๋ฅผ ์จ์ฃผ์ธ์"๋ผ๊ณ ํ๋ฉด, FurnitureMaker๋ "์ ์๋ง์! ์ง๊ธ getWood ์ฝ๋์์ ์ผ ๋ชฉ์ฌ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์์ด์์. ๊ธ๋ฐฉ ๋ฐ๊ฟ์ค๊ฒ์!" ๋ผ๊ณ ํด์ผ ํ ๊ฒ์ ๋๋ค. ๋ค์ ์๋์ด ์ผ ๋ชฉ์ฌ๋ฅผ ์ํ๋ค๋ฉด? ๋ ์ฝ๋๋ฅผ ๋ฐ๊ฟ์ค์ผ ํ ๊ฒ์ ๋๋ค. ์ฆ, ๊ตฌํ์ฒด๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด FurnitureMaker.java์์ ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ค๋ ๊ฒ ์์ฒด๋ก ๋ณํ์ ๋์ํ๊ธฐ๊ฐ ์ด๋ ต๊ฒ ๋ฉ๋๋ค. getWood, getHammer์ ๊ฐ์ ์ฝ๋๋ฅผ ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น์?
๋ฌผ๋ก ์์ต๋๋ค. FurnitureMaker์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๋ฉด ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ FurnitureMaker๋ฅผ ๋ถ๋ฆฌํ๋ค๋ ๊ฒ์ "์ฌ์ฅ์ด ํผ์ ๊ฐ๊ฒ๋ฅผ ์ด์ํ๋ค๊ฐ, ์น๊ตฌ๋ฅผ ์์ ํ๋ ๊ฒ"์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฌ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ณ ๊ฐ์ ๋ฐ๋ผ ๋ฐ๋๋ ํจ์๋ค์ ์ถ์ ๋ฉ์๋๋ก ๋ง๋ญ๋๋ค. Commit - feat: 4 - ์์์ ํตํ ํ์ฅ
abstract class FurnitureMaker {
...
public abstract List<Wood> getWoods(int woodAmount);
public abstract Hammer getHammer();
}
์ด์ ๊ฐ๊ตฌ๋ฅผ ์ฌ๋ ๊ณ ๊ฐ์ Furniture.java ์ฝ๋๋ง ๋ด์๋ ์ด๋ค Wood๋ฅผ ์ฐ๋ ์ง ์ ์ ์๊ฒ ๋๊ธฐ ๋๋ฌธ์, ํต์ฌ์ญ๋์ ๊ฐ์ถ ์ ์์ ๋ฟ ์๋๋ผ ๊ณ ๊ฐ์ ๋ฐ๋ผ ์ฝ๊ฒ ๋์ํ ์๋ ์๊ฒ ๋ฉ๋๋ค. ๋ถ์๊ฐ ์๋ค? ์ฌ์ฅ์ด ์๋ํฉ๋๋ค.
public class FurnitureMakerForRich extends FurnitureMaker {
FurnitureMakerForRich(String name) {
super(name);
}
@Override
public List<Wood> getWoods(int woodAmount) {
List<Wood> woods = new ArrayList<>();
for (int i = 0; i < woodAmount; i++) {
woods.add(new ExpensiveWood());
}
return woods;
}
@Override
public Hammer getHammer() {
return new IronHammer();
}
}
๋ ์๋ ์ฌ๋์ด ์๋ค? ์์ ํ ์น๊ตฌ๊ฐ ์๋ํฉ๋๋ค.
public class FurnitureMakerForPoor extends FurnitureMaker {
FurnitureMakerForPoor(String name) {
super(name);
}
@Override
public List<Wood> getWoods(int woodAmount) {
List<Wood> woods = new ArrayList<>();
for (int i = 0; i < woodAmount; i++) {
woods.add(new CheapWood());
}
return woods;
}
@Override
public Hammer getHammer() {
return new IronHammer();
}
}
๊ธฐ์กด์๋ ๊ฐ์ ํด๋์ค ๋ด์ ๋ค๋ฅธ ๋ฉ์๋๋ก ๋ถ๋ฆฌ๋๋ getWood, getHammer๋ผ๋ ๊ด์ฌ์ ์์์ ํตํด ์๋ธํด๋์ค๋ก ๋ถ๋ฆฌํ ๊ฒ์ ๋๋ค. ๋๋ถ์ FurnitureMaker์ ํต์ฌ ๊ธฐ๋ฅ์ด๋ผ๊ณ ํ ์ ์๋ makeChair(), makeDesk(), ์ฆ ์ค์ ๋ก ๊ฐ๊ตฌ๋ฅผ ๋ง๋๋ ์ฝ๋(FurnitureMaker)์ ์ด๋ค ์ค๋น๋ฌผ(Wood, Hammer ๋ฑ)์ ์ด๋ป๊ฒ ๊ฐ์ ธ์ฌ ์ง ๋ฑ์ ๊ด์ฌ์ฌ๋ฅผ ๋ค๋ฃจ๋ ํด๋์ค(FurnitureMakerForPoor, FurnitureMakerForRich)๋ฅผ ๋ถ๋ฆฌํ์ต๋๋ค. ์ด์ FurnitureMaker์ ์ฝ๋๋ ์์ ํ์ง ์์๋ Wood๋ฅผ ๋ฐ๊ฟ ์ ์๊ฒ ๋์ต๋๋ค. ์๋ก์ด ๋์ฆ๋ฅผ ๋ฐ๊ฒฌํ์ฌ ํน๋ณํ ๊ณ ๊ฐ์ด ์ค๋๋ผ๋, FurnitureMaker๋ฅผ ์์ํ์ฌ ๊ทธ ๊ณ ๊ฐ์ ๋ง์ถ๋ฉด ๋ฉ๋๋ค(์ฆ ํ์ฅํ ์ ์์ต๋๋ค).
ํ์ง๋ง ์ด๋ฌํ ์์ ๋ฐฉ์์๋ ๋จ์ ์ด ์์ต๋๋ค. ์ฒซ์งธ๋ก, ๋ง์ฝ ํ์ํด๋์ค๊ฐ ์ด๋ฏธ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ํ๊ณ ์๋ค๋ฉด, ์ํ๋ ์ํผํด๋์ค๋ฅผ ์์ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, FurnitureMakerForPoor๊ฐ ๊ฐ๊ตฌ ๋ฟ ์๋๋ผ ๋ถ์ ์ผ๋ก ์ปดํจํฐ๋ ๋ง๋ค์ด์ค๋ค๊ณ ํฉ์๋ค. ํ์ง๋ง FurnitureMakerForPoor๋ FurnitureMaker์ ComputerMaker ๋ ๋ค ์์ํ ์ ์์ต๋๋ค. ๋์งธ๋ก ์์์ ํ๋ฉด ์ํ์ ํด๋์ค์ ๊ด๊ณ๊ฐ ๋๋ฌด ๋ฐ์ ํด์ง๋ค๋ ๊ฒ์ ๋๋ค. ์ํผํด๋์ค๊ฐ ์์ ๋๋ฉด ํ์ํด๋์ค๋ ์ต์ง๋ก ๋ฐ๋ผ ๋ณํ๊ฒ ๋๊ณ , ํ์ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ ์ํผํด๋์ค๊ฐ ๋ด๊ฐ ์ํ๋๋๋ก ๊ธฐ๋ฅ๊ตฌํํ๋ ์ง ํ์คํ ์์์ผ ํฉ๋๋ค. ์ฆ, ์บก์ํ๊ฐ ๊นจ์ง๊ฒ ๋ฉ๋๋ค. ์ ์งธ๋ก ์ํผํด๋์ค๋ฅผ ์์ํ์ง ์๋, ์๋ธํด๋์ค์ ์ ์ฌํ ์ฑ๊ฒฉ์ ์ฝ๋์๋ ์ ๋ง๋ค์ด๋์ ๋ฉ์๋๋ฅผ ์ฌํ์ฉํ ์ ์๋ค๋ ๊ฒ๋ ๋ฌธ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ComputerMakerForPoor๋ FurnitureMaker๋ฅผ ์์ํ์ง ์๊ฒ ์ฃ . ํ์ง๋ง ComputerMaker๋ Hammer๊ฐ ํ์ํ๋ค๊ณ ํฉ๋๋ค. ์ด ๋ ๊ธฐ์กด์ ๊ตฌํํด๋์ getHammer๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์๋กญ๊ฒ getHammer๋ฅผ ์ ์ํด์ผ ํด์ ์ค๋ณต์ด ์๊ธฐ๊ฒ ์ฃ . ๊ฒฐ๊ตญ ๋ณํ์ ๋์ํ๊ธฐ ์ํด ์์์ ์ฌ์ฉํ ๊ฒ ๋ถํธํฉ๋๋ค...
์ง๊ธ๊น์ง ์ฑ๊ฒฉ์ด ๋ค๋ฅธ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ์์ ์ ์งํํ์ต๋๋ค. ์ฒ์์๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ ๋ถ๋ฆฌํ๊ณ , ๋ค์์๋ ์ํ์ ํด๋์ค๋ก ๋ถ๋ฆฌํ์ต๋๋ค. ์ด๋ฒ์๋ ์์ ์์๊ด๊ณ๋ ์๋ ์์ ํ ๋ ๋ฆฝ์ ํ ํด๋์ค๋ก ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ๋ฐฉ๋ฒ์ getWood(), getHammer()์ ์๋ธํด๋์ค๊ฐ ์๋๋ผ, ์์ ๋ณ๋์ ํด๋์ค์ ๋ด๋ ๊ฒ์ ๋๋ค. ์ค๋น๋ฌผ์ ์์ด๋ก ๋ฒ์ญํด๋ณด๋ Material์ด๋ผ MaterialMaker๋ผ๊ณ ํ๊ณ , get๋ณด๋ค๋ make์ด ๋ ์ ํฉํ ํจ์๋ช ์ธ ๊ฒ ๊ฐ์ ํจ์๋ช ๋ ๋ฐ๊ฟ๋ดค์ต๋๋ค. Commit - feat: 5 - ์์์ ํ์ง ์๋, ๋ ๋ฆฝ๋ ํด๋์ค๋ก ๊ธฐ๋ฅ ๋ถ๋ฆฌ
public class MaterialMakerForPoor {
public List<Wood> makeWoods(int woodAmount) {
List<Wood> woods = new ArrayList<>();
for (int i = 0; i < woodAmount; i++) {
woods.add(new CheapWood());
}
return woods;
}
public Hammer makeHammer() {
return new IronHammer();
}
}
๊ทธ๋ฌ๋ฉด FurnitureMaker๋ ๋์ด์ ์ถ์๋ฉ์๋๋ฅผ ๊ฐ์ง ํ์๊ฐ ์๊ฒ ๋ฉ๋๋ค.
class FurnitureMaker {
private final String name;
FurnitureMaker(String name) {
this.name = name;
}
Chair makeChair() {
MaterialMakerForPoor materialMakerForPoor = new MaterialMakerForPoor();
List<Wood> woods = materialMakerForPoor.getWoods(Chair.WOOD_AMOUNT);
Hammer hammer = materialMakerForPoor.getHammer();
return hammer.makeChair(woods);
}
Desk makeDesk() {
MaterialMakerForPoor materialMakerForPoor = new MaterialMakerForPoor();
List<Wood> woods = materialMakerForPoor.getWoods(Desk.WOOD_AMOUNT);
Hammer hammer = materialMakerForPoor.getHammer();
return hammer.makeDesk(woods);
}
}
์ด์ FurnitureMaker๋ ์์ ์์ด๋ getWood(), getHammer()์ ๊ตฌํ์ ๋ชฐ๋ผ๋ ๋ฉ๋๋ค! ๊ทธ๋ฐ๋ฐ ์ฌ์ ํ ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋จผ์ , new MaterialMakerForPoor() ๋ถ๋ถ์ด ์ค๋ณต๋๋ ๊ฒ ๋ง์์ ๋ค์ง ์์ต๋๋ค. ์ค๋ณต์ด ๋ง์์ ์๋๋ ๊ฒ ๋ฟ ์๋๋ผ, ์์์ ์ผ๋ก๋ ์ด์ํฉ๋๋ค. ์ฌ์ค MaterialMakerForPoor๋ฅผ ์ ์ฉํ๊ธฐ ์ ์๋ ์์์ ์ผ๋ก ์ด์ํ๋๋ฐ์. ๋งจ ์ฒ์ ์ฝ๋๋ฅผ ๋ค์ ๋ด๋ด ์๋ค.
// FurnitureMaker.java
Chair makeChair() {
List<Wood> woods = new ArrayList<>();
for (int i = 0; i < Chair.WOOD_AMOUNT; i++) {
woods.add(new Wood());
}
IronHammer ironHammer = new IronHammer();
return ironHammer.makeChair(woods);
}
์ด ์ฝ๋๋ฅผ ํ์ค ์ธ๊ณ์์ ์ดํดํด๋ณด๋ฉด, ๋๊ตฐ๊ฐ FurnitureMaker์๊ฒ ์์๋ฅผ ๋ง๋ค์ด๋ฌ๋ผ๊ณ ๋ถํํ์ ๋ FurnitureMaker๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ํ ๊ฒ์ ๋๋ค. "์ ๊น๋ง! ์์๋ฅผ ๋ง๋ค๊ธฐ ์ ์ ๋ชฉ์ฌ๋ถํฐ ๋ง๋ค๊ณ . ์ ๊น๋ง! ํ์ํ ๋ชฉ์ฌ๋ ๋ง๋ค์์ง๋ง ๋ง์น๋ ๋ง๋ค์ด์ผ ํด". ์ด์ํ์ง ์๋์? ์์ ๋ง๋ค์ด๋ฌ๋ผ๊ณ ํ๋๋ ๋ง์น๋ถํฐ ๋ง๋ค์ด์ผ ํ๋ต๋๋ค. ์ฌ์ค ๋ชฉ์ฌ๋ฅผ ์ค๋นํ๊ณ , ๋ง์น๋ฅผ ์ค๋นํ๋ ๊ฒ FurnitureMaker์ ์ต๋ ๊ด์ฌ์ฌ๋ผ๊ณ ํ๊ธฐ์ ๋ฌด๋ฆฌ๊ฐ ์์ฃ . ๋ชฉ์ฌ์ ๋ง์น๋ฅผ ๊ฐ์ง๊ณ , "์์๋ฅผ ๋ง๋๋ ๊ฒ"์ด FurnitureMaker์ ๊ด์ฌ์ฌ์ ๋๋ค. MaterialMakerForPoor๋ฅผ ์ ์ฉํด๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์์๋ฅผ ๋ง๋ค์ด๋ฌ๋ผ๊ณ ํ๋๋, "์ ๊น๋ง! MaterialMakerForPoor๋ถํฐ ๋ง๋ค๊ณ " ๋ผ๊ณ ํ๋ ๊ฒ ์ด์ํฉ๋๋ค. ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ก ์์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. Commit - feat: 6 - ์์กด ๋์(MaterialMakerForPoor)์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์
// FurnitureMaker.java
Chair makeChair(MaterialMakerForPoor materialMakerForPoor) {
List<Wood> woods = materialMakerForPoor.makeWoods(Chair.WOOD_AMOUNT);
Hammer hammer = materialMakerForPoor.makeHammer();
return hammer.makeChair(woods);
}
์๊น๋ณด๋ค ๋ซ๋ค์. ์ด์ "์ ๊น๋ง! MaterialMakerForPoor๋ถํฐ ๋ง๋ค๊ณ "์ ๊ณผ์ ์์ด, MaterialMakerForPoor๋ฅผ ๋ฐ์ผ๋ฉด, MaterialMakerForPoor๊ฐ ์์์ ์ค๋น๋ฌผ์ ๋ง๋ค์ด์ค๋๋ค. FurnitureMaker๋ ์ค๋น๋ฌผ๋ก ์์๋ฅผ ๋ง๋ค๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ์ ํ ์ด์ํฉ๋๋ค. Desk๋ฅผ ๋ง๋ค์ด๋ฌ๋ผ๊ณ ํ๋๋ ๋ MaterialForPoor๋ฅผ ์ ๋ฌํด๋ฌ๋ผ๊ณ ํฉ๋๋ค.
// FurnitureMaker.java
Desk makeDesk(MaterialMakerForPoor materialMakerForPoor) {
List<Wood> woods = materialMakerForPoor.makeWoods(Desk.WOOD_AMOUNT);
Hammer hammer = materialMakerForPoor.makeHammer();
return hammer.makeDesk(woods);
}
FurnitureMaker์๊ฒ ์ผ ์ํค๊ธฐ๊ฐ ์ฝ์ง ์๋ค์. "์๊น ์คฌ์์? ์ ๋ ํ์ํด?" ๋ผ๊ณ ๋ฌผ์๋๋ "๊ทธ๊ฑฐ ๋ฒ๋ ธ๋๋ฐ?"๋ผ๋ ๋ต์ด ์ต๋๋ค. ํ์ค ์ธ๊ณ๋ผ๋ฉด ์ด์ด๊ฐ ์๋ ์ํฉ์ด์ฃ . ํ์ค์ธ๊ณ์์ FurnitureMaker๊ฐ ์ด๋ฏธ ์ค๋น๋ฌผ๋ค์ ๊ฐ์ง๊ณ ์๊ฒ ์ฃ . ๊ทธ๋ ๊ฒ ๋ฐ๊ฟ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. Commit - feat: 7 - ์์กด ๋์(MaterialMakerForPoor)์ ์์ฑ์์์ ๋ฐ์
class FurnitureMaker {
private final String name;
private final MaterialMakerForPoor materialMakerForPoor;
FurnitureMaker(String name, MaterialMakerForPoor materialMakerForPoor) {
this.name = name;
this.materialMakerForPoor = materialMakerForPoor;
}
Chair makeChair() {
List<Wood> woods = materialMakerForPoor.makeWoods(Chair.WOOD_AMOUNT);
Hammer hammer = materialMakerForPoor.makeHammer();
return hammer.makeChair(woods);
}
Desk makeDesk() {
List<Wood> woods = materialMakerForPoor.makeWoods(Desk.WOOD_AMOUNT);
Hammer hammer = materialMakerForPoor.makeHammer();
return hammer.makeDesk(woods);
}
}
ํจ์ฌ ๋ซ๋ค์. ๊ทธ๋ฐ๋ฐ ์์ํ์ ๋ ์๋ ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค. ์์์ผ๋ก, "๋ฐ๊ฟ ์ ์๊ฒ" ํ์ง ์์์ต๋๊น? ๊ทธ๋ฐ๋ฐ ์ฝ๋๋ฅผ ๋ณด๋ฉด FurnitureMaker๋ ์ด์ ๋ถ์๋ค์ ์๋๋ ๋ชปํฉ๋๋ค. ๋ ์๋ ์ฌ๋๋ค๋ง ์๋ํ ์ ์๊ฒ ์ฝ๋ฉ๋ผ์๊ณ , ๋ง์ฝ์ ๋ฐ๊พธ๋ ค๋ฉด ๋ "์ ์ ๊น๋ง์, ํ์ฌ Wood๊ฐ ์ผ ๊ฑฐ๋ผ์์. ๊ธ๋ฐฉ ์ฝ๋ ๋ฐ๊ฟ๋๋ฆด๊ฒ์" ์ ๊ฐ์ ์ํฉ์ด ์๊น๋๋ค. ์ด๋ฌํ ์ํฉ์ ํด๊ฒฐํ๊ณ , ์ ์ฒ๋ผ ์์ ๋กญ๊ฒ ํ์ฅํ๋ ค๋ฉด ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
์ฒซ์งธ๋ ๋ฐ๊ฟ ์ ์๋ ๊ฒ๋ค์ ๋ฉ์๋ ๋ช ์ด ๋ค๋ฅด๋ฉด ์์ ํด์ผ ํ ์ฝ๋๊ฐ ์์ฒญ๋๊ฒ ๋ง์์ง๋ค๋ ๊ฒ์ ๋๋ค. ๋ง์ฝ์ ๋ถ์๋ฅผ ์๋ํ๊ธฐ ์ํด MaterialForRich๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ๋ฉด ์ด๋ค ์ํฉ์ด ํผ์ณ์ง๊น์?
class MaterialMakerFoorRich {
List<Wood> createWoods(int woodAmount) {
List<Wood> woods = new ArrayList<>();
for (int i = 0; i < woodAmount; i++) {
woods.add(new ExpensiveWood());
}
return woods;
}
Hammer createHammer() {
return new IronHammer();
}
}
์ฌ๊ธฐ์์ ์ฃผ๋ชฉํด์ผ ํ ๊ฑด ํจ์๋ช ์ ๋๋ค. create๋ make๋ ์๋ฏธ๋ ์ ์ฌํ์ง๋ง, ์ด์จ๋ ๋ค๋ฅด์ฃ . FurnitureMaker๊ฐ ๋ถ์๋ฅผ ์๋ํ๊ธฐ ์ํด ๊พธ์ญ๊พธ์ญ MaterialForPoor๋ฅผ MaterialForRich๋ก ์์ ํ๋ค๊ณ ์นฉ์๋ค.
class FurnitureMaker {
private final String name;
private final MaterialMakerForRich materialMakerForRich;
FurnitureMaker(String name) {
this.name = name;
this.materialMakerForRich = new MaterialMakerForRich();
}
Chair makeChair() {
List<Wood> woods = materialMakerForRich.makeWoods(Chair.WOOD_AMOUNT);
Hammer hammer = materialMakerForRich.makeHammer();
return hammer.makeChair(woods);
}
Desk makeDesk() {
List<Wood> woods = materialMakerForRich.makeWoods(Desk.WOOD_AMOUNT);
Hammer hammer = materialMakerForRich.makeHammer();
return hammer.makeDesk(woods);
}
}
๋ฐ๊ฟจ์ง๋ง, ํจ์๋ช ์ด ๋ฌ๋ผ ๋นจ๊ฐ ์ญ ์ซ ๋น๋๋ค. ๋ฐ๋ผ์ ๋น์ทํ ๊ฒ๋ค์ ํจ์๋ช ์ ํต์ผํด์ผ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋์งธ๋ FurnitureMaker๊ฐ MaterialMakerForPoor๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์์์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ์๊ธฐ ๋๋ฌธ์ ๋ถ์๋ฅผ ์๋ํ๊ธฐ ์ํด์ FurnitureMaker์ ์ฝ๋๋ฅผ ์ง์ ์์ ํด์ผ๋ง ํ์ฃ . ๊ทผ๋ณธ์ ์ผ๋ก, ์์กด๋์์ ๊ตฌํ์ฒด๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์๋ค๋ ๊ฒ ๋ฌธ์ ์ ๋๋ค.
์ด๋ฌํ ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋, ๋ฐ๋ก ์ธํฐํ์ด์ค๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ฌ ๋ ํด๋์ค๊ฐ ์๋ก ๊ธด๋ฐํ๊ฒ ์ฐ๊ฒฐ๋์ด ์์ง ์๋๋ก ์ค๊ฐ์ ์ถ์์ ์ธ ๋์จํ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ ๋๋ค. ์ธํฐํ์ด์ค๋ ์ด๋ค ์ผ์ ํ๊ฒ ๋ค๋ ๊ธฐ๋ฅ๋ง ์ ์ํด๋๊ณ , ์์ ์ ๊ตฌํํ ํด๋์ค์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ ๋ชจ๋ ๊ฐ์ถฐ ๋ฒ๋ฆฝ๋๋ค. ๊ฒฐ๊ตญ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ๋๋ฅผ ์ ํํด์ผ๊ฒ ์ง๋ง, ์ธํฐํ์ด์ค๋ก ์ถ์ํํด๋์ ์ต์ํ์ ํต๋ก๋ฅผ ํตํด ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ ์ชฝ์์๋ ๊ตฌํ ํด๋์ค๊ฐ ๋ฌด์์ธ์ง ๋ชฐ๋ผ๋ ๋ฉ๋๋ค. ์ด๋ฌํ ์ธํฐํ์ด์ค์ ์ฅ์ ์ ์๊ฐํด๋ณด๋ฉด ๋ ๋ฒ์งธ ๋ฌธ์ (๊ตฌํ์ฒด๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์๋ค๋ ๊ฒ)์ ํด๊ฒฐํ ์ ์์ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ํ, ์ธํฐํ์ด์ค๋ ๋์ผํ ์ด๋ฆ์ ํจ์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์, ์ฒซ๋ฒ์งธ ๋ฌธ์ (ํจ์๋ช ์ด ๋ค๋ฅด๋ฉด ์์ ํด์ผ ํ ์ฝ๋๊ฐ ๋ง์์ง๋ค)๋ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ฆ, ์ค์ ๊ตฌํ ํด๋์ค๋ฅผ ๋ฐ๊ฟ๋ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋ฉ๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ์ถ์ถํด๋ณด๊ฒ ์ต๋๋ค. Commit - feat: 8 - ์ธํฐํ์ด์ค ์ ์ฉ
public interface MaterialMaker {
List<Wood> makeWoods(int woodAmount);
Hammer makeHammer();
}
๋น์ฐํ ๊ตฌํ์ฒด๋ค์ ์ด ์ธํฐํ์ด์ค๋ฅผ implements ํด์ผ๊ฒ ์ฃ . ์ธํฐํ์ด์ค๋ฅผ FunitureMaker์ ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
class FurnitureMaker {
private final String name;
private final MaterialMaker material;
FurnitureMaker(String name) {
this.name = name;
this.material = new MaterialMakerForPoor();
}
Chair makeChair() {
List<Wood> woods = material.makeWoods(Chair.WOOD_AMOUNT);
Hammer hammer = material.makeHammer();
return hammer.makeChair(woods);
}
Desk makeDesk() {
List<Wood> woods = material.makeWoods(Desk.WOOD_AMOUNT);
Hammer hammer = material.makeHammer();
return hammer.makeDesk(woods);
}
}
์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฒซ๋ฒ์งธ ๋ฌธ์ (๊ตฌํ์ฒด๋ง๋ค ํจ์๋ช
์ด ๋ค๋ฅด๋ฉด ๋ง์ ์์ ์ด ํ์ํ๋ค๋ ๊ฒ)๋ฅผ ๋ฐ๋ก ํด๊ฒฐํ ์ ์๊ฒ๋์ต๋๋ค. this.material = new MaterialMakerForPoor();
๋ฅผ this.material = new MaterialMakerForRich();
๋ก ๋ฐ๊พธ๊ธฐ๋ง ํ๋ฉด ๋ถ์๋ฅผ ์ํ ์ฝ๋๊ฐ ๋ฉ๋๋ค. ์ด์ ์๋ "์ ๊น๋ง์! ๋น์ผ ๋ชฉ์ฌ๋ฅผ ์ฐ๋ ค๋ฉด ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋๋ฐ์. ๊ทธ๋ฐ๋ฐ ๋ช ์ค์ ์์ ํด์ผํ์ง..." ์๋ค๋ฉด, ์ด์ ๋ "์ ๊น๋ง์! ๋น์ผ ๋ชฉ์ฌ๋ฅผ ์ฐ๊ธฐ ์ํด ์ฝ๋ ํ ์ค๋ง ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค!" ๋ผ๊ณ ๋งํ ์ ์๊ฒ ๋์ต๋๋ค.
ํ์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ์ด๋ค๊ณ ํด์ ๋๋ฒ์งธ ๋ฌธ์ (์์กด ๋์์ ๊ตฌ์ฒด์ ์ผ๋ก ์๋ค๋ ๊ฒ)๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ์๋๋๋ค. ๋ฐ๋ก this.material = new MaterialMakerForPoor();
์ด ์ฝ๋ ๋๋ฌธ์
๋๋ค. makeChair(), makeDesk() ์
์ฅ์์๋ material์ด ์ด๋ค ๋
์์ธ์ง ๊ตฌ์ฒด์ ์ผ๋ก ์์ง ๋ชปํ์ฃ . ํ์ง๋ง FurnitureMaker๋ ์์ฑ์์์ new MaterialMakerForPoor() ๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ฒด๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์๊ณ ์์ต๋๋ค. ์ฆ ๋ ๊ฐ์ ๊ด์ฌ์ฌ, (1) ์ค๋น๋ฌผ ๋ง๋ค๊ธฐ (2) ๊ฐ๊ตฌ ๋ง๋ค๊ธฐ๋ฅผ ์ ๋ถ๋ฆฌํ๋๋ฐ๋ ๋ ํด๋์ค๋ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์์ต๋๋ค. ์ด ๋๋ฌธ์(๋ค๋ฅธ ๊ด์ฌ์ฌํญ์ด ๊ณต์กดํ๊ธฐ ๋๋ฌธ์) FurnitureMaker๋ ์์ ๋กญ๊ฒ ํ์ฅํ์ง ๋ชปํ๊ฒ ๋์ฃ . new ๊ฐ์ฒด
ํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋
๋ฆฝ์ ์ธ ๊ด์ฌ์ฌ๋ผ๋ ๊ฒ์
๋๋ค. ์ด ํ ์ค์ ์ฝ๋๊ฐ FunitureMaker์ MaterialMaker์ ๊ด๊ณ๋ฅผ ์ค์ ํฉ๋๋ค. ์ด ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ง ์์ผ๋ฉด FurnitureMaker๋ ๊ฒฐ์ฝ ๋
๋ฆฝ์ ์ผ๋ก ํ์ฅ ๊ฐ๋ฅํ ํด๋์ค๊ฐ ๋ ์ ์์ต๋๋ค. ์ด "๊ด๊ณ์ค์ "์ด๋ผ๋ ๊ด์ฌ์ ์ด๋์ ๋ถ๋ฆฌํ ๊น์? ๋ฐ๋ก "FurnitureMaker์ ํด๋ผ์ด์ธํธ"๊ฐ ์ด ๊ด์ฌ์ ๋งก๊ธฐ์ ์ ์ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ผ๋ ๊ฒ ํน๋ณํ ๊ฒ ์๋๋ผ, FurnitureMaker์ ํจ์๊ฐ ์ด๋์์๋ ํธ์ถ๋์ง ์๊ฒ ์ต๋๊น? ๊ทธ ํธ์ถํ๋ ์ชฝ์ ํด๋ผ์ด์ธํธ๋ผ๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, FurnitureMaker.java๋ฅผ ํ
์คํธํ๋ FurnitureMakerTest.java๊ฐ FurnitureMaker์ ํจ์๋ฅผ ํธ์ถํ์ง ์์ต๋๊น? FurnitureMakerTest๋ FurnitureMaker์ ํด๋ผ์ด์ธํธ๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๊ด๊ณ์ค์ ์ ์ฑ
์์ ํด๋ผ์ด์ธํธ์ ๋๊ฒจ๋ฒ๋ฆฌ๋ฉด, FurnitureMaker๋ ๊ทธ์ ์์ผ MaterialMaker๋ก๋ถํฐ ์์ ๋ก์์ง ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ๋๊ฒ ์ฃ . Commit - feat: 9 - ๊ด๊ณ์ค์ ์ฑ
์์ ๋ถ๋ฆฌ
// FurnitureMaker.java
FurnitureMaker(String name, MaterialMaker materialMaker) {
this.name = name;
this.materialMaker = materialMaker;
}
FurnitureMaker์ ํด๋ผ์ด์ธํธ์ธ ํ ์คํธ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
// FurnitureMakerTest.java
@Test
void makeChair() {
MaterialMaker materialMaker = new MaterialMakerForPoor();
FurnitureMaker furnitureMaker = new FurnitureMaker("root", materialMaker);
Chair chair = furnitureMaker.makeChair();
assertThat(chair).isNotNull();
}
MaterialMaker materialMaker = new MaterialMakerForPoor();
๊ฐ ์ฌ๊ธฐ์ ๋ค์ด์๊ตฐ์! ์ด์ ๋ถ์๊ฐ ์๋, ๋ ์๋ ์ฌ๋์ด ์๋ FurnitureMaker๋ ์ ํ ์์ ํ์ง ์์๋ ๋์ํ ์ ์๊ฒ ๋์ต๋๋ค. ์ฆ, ๊ธฐ๋ฅ ํ์ฅ์๋ ์ด๋ ค์๊ณ , ์ฝ๋ ๋ณ๊ฒฝ์๋ ๋ซํ์๊ฒ ๋ฉ๋๋ค.
ํ์ฌ FurnitureMaker์ ํด๋ผ์ด์ธํธ๋ FurnitureMakerTest ์ ๋๋ค. ๊ทธ๋ฐ๋ฐ FurnitureMakerTest๋ ํ ์คํธ ํ๋ ค๊ณ ๋ง๋ ์ฝ๋ ์๋๋๊น? ํ ์คํธ๋ผ๋ ๊ด์ฌ ๋ง๊ณ ๊ด๊ณ์ค์ ์ ๊ด์ฌ์ ๋งก๊ฒ ๋์ผ๋, ํ ์คํธ์ฝ๋ ์ ์ฅ์์๋ ๋นํฉ์ค๋ฝ์ต๋๋ค. ๊ด๊ณ์ค์ ๋ง ๋ด๋นํด์ฃผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด๋ด ์๋ค. Commit - feat: 10 - ํฉํ ๋ฆฌ ํด๋์ค
class FurnitureMakerFactory {
FurnitureMaker createFurnitureMaker() {
MaterialMaker materialMaker = new MaterialMakerForPoor();
return new FurnitureMaker("root", materialMaker);
}
}
ํฉํ ๋ฆฌ๋ FurnitureMaker๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค ์ง, ์ด๋ป๊ฒ ์ค๋น์ํฌ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ฆ ์ค๋ธ์ ํธ๋ค์ ๊ตฌ์ฑํ๊ณ ๊ทธ ๊ด๊ณ๋ฅผ ์ ์ํฉ๋๋ค. ์ด๋ฐ ์์
์ด ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์ ๊ฑธ์ณ ์ผ์ด๋๋ค๋ฉด ๊ฐ์ฒด๋ค์ ์์กด๊ด๊ณ์ ๋ํ ์ค๊ณ๋์ ๊ฐ์ ์ญํ ์ ํ ๊ฒ์
๋๋ค. ํฉํ ๋ฆฌ ํด๋์ค์ ๊ฐ์น๋ ์ฌ๋ฟ ์๊ฒ ์ง๋ง ๊ทธ ์ค ์ผ๋ธ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ก์ง์ ๋ด๋นํ๋ ์ปดํฌ๋ํธ ์ญํ ์ ์ค๋ธ์ ํธ(FurnitureMaker, MaterialMaker)์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ ํ๋ ์ค๋ธ์ ํธ(FurnitureMakerFactory)๋ฅผ ๋ถ๋ฆฌํ๋ค๋ ๊ฒ์
๋๋ค. ์ด์ฉ๋ฉด "ํฉํ ๋ฆฌ๋ฅผ ์ฐ๋๋ผ๋, ๋ ์๋ ์ฌ๋์ ์ํ ์ฝ๋์์ ๋ถ์๋ฅผ ์ํ ์ฝ๋๋ก ๋ฐ๊พธ๋ ค๋ฉด ํฉํ ๋ฆฌ ๋ด์ MaterialMaker materialMaker = new MaterialMakerForPoor();
๋ฅผ MaterialMaker materialMaker = new MaterialMakerForRich();
๋ก ๋ฐ๊ฟ์ผ ํ์ง ์์ต๋๊น? ๊ฒฐ๊ตญ ์ฝ๋ ์์ ์ ํ๊ธด ํด์ผํ๋ค์! ์ด์ ์๋ ํ ์ค, ์ง๊ธ๋ ํ ์ค ์์ ํ๋๋ฐ ๋ญ๊ฐ ๊ฐ์ ๋๊ฑฐ์ฃ ?"๋ผ๊ณ ์๊ฐํ์ค ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ค์ํ ๊ฑด FurnitureMaker์ ์
์ฅ์
๋๋ค. FurnitureMaker๋ ์ด์ MaterialMakerForPoor๋ , MaterialMakerForRich๋ ์๊ด์ด ์์ด์ก์ด์. ์๊ธฐ ๊ด์ฌ์ธ "์ค๋น๋ฌผ๋ก ๊ฐ๊ตฌ๋ฅผ ๋ง๋ ๋ค"์ ์ง์คํ ์ ์๋ ๊ฒ์ด์ฃ . FurnitureMakerFactory์
์ฅ์์๋ ๊ด์ฐฎ์ต๋๋ค. ์ด์ ๊น์ง FurnitureMaker๊ฐ ์ต์ธํ๋ ์ด์ ๋ "๋ด๊ฐ ๋ณ๋ก ๊ด์ฌ๋ ์๋ ๊ฒ ๋๋ฌธ์ ๋ฐ๋์ด์ผํ๋?" ์์ต๋๋ค. ๊ทผ๋ฐ FurnitureMakerFactory๋ ๊ด๊ณ์ค์ ์ ํด์ฃผ๋ ๊ฒ ์๊ธฐ ์ผ์ด์์. ์ต์ธํ ๊ฒ ์์ฃ . ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ์์ ๋๋ ๋ค๋ฆ
๋๋ค. ํ์ฌ๋ ๋ ๋ค ํ ์ค๋ง ๋ฐ๊ฟ๋ ๋์ง๋ง, MaterialMaker๋ฅผ ๋ค๋ฅธ ์ ๋ค๋ ์ด๋ค๋ฉด? ์๋ฅผ ๋ค์ด, ComputerMaker๋ MaterialMaker๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ์๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋๋ค. ํฉํ ๋ฆฌ๋ฅผ ์ด๋ค๋ฉด ํ ์ค๋ก ๋ ๊ฒ์, ์ฐ์ง ์๋๋ค๋ฉด ๋ ์ค์ ์์ ํด์ผ๊ฒ ์ฃ .
์ ์ด์ ์ญ์ ์ด๋ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ ๊ตฌ์กฐ๊ฐ ๋ค๋ฐ๋๋ ๊ฒ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ main() ๋ฉ์๋์ ๊ฐ์ด ํ๋ก๊ทธ๋จ์ด ์์๋๋ ์ง์ ์์ ๋ค์์ ์ฌ์ฉํ ์ค๋ธ์ ํธ๋ฅผ ๊ฒฐ์ ํ๊ณ , ๊ฒฐ์ ํ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ณ , ๋ง๋ค์ด์ง ์ค๋ธ์ ํธ์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ๊ทธ ์ค๋ธ์ ํธ ๋ฉ์๋ ์์์ ๋ค์์ ์ฌ์ฉํ ๊ฒ์ ๊ฒฐ์ ํ๊ณ , ํธ์ถํ๋ ์์ ์์ ์ด ๋ฐ๋ณต๋ฉ๋๋ค. ์ ์ด๊ฐ ์ญ์ ๋์ง ์๋๋ค๋ฉด, ๋ชจ๋ ์ค๋ธ์ ํธ๊ฐ ๋ฅ๋์ ์ผ๋ก ์์ ์ด ์ฌ์ฉํ ํด๋์ค๋ฅผ ๊ฒฐ์ ํ๊ณ , ์ธ์ ์ด๋ป๊ฒ ๊ทธ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค ์ง ์ค์ค๋ก ๊ด์ฅํฉ๋๋ค. ๋ชจ๋ ์ข ๋ฅ์ ์์ ์ ์ฌ์ฉํ๋ ์ชฝ์์ ์ ์ดํ๋ ๊ตฌ์กฐ์ ๋๋ค. ๋ฐ๋๋ก ์ ์ด์ ์ญ์ ์ ์ด๋ฌํ ์ ์ด ํ๋ฆ์ ๊ฑฐ๊พธ๋ก ๋ค์ง์ต๋๋ค. ์ ์ด์ ์ญ์ ์์๋ ์ค๋ธ์ ํธ๊ฐ ์์ ์ด ์ฌ์ฉํ ์ค๋ธ์ ํธ๋ฅผ ์ค์ค๋ก ์ ํํ์ง ์์ต๋๋ค. ์์ฑํ์ง๋ ์์ต๋๋ค. ๋ ์์ ์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๊ณ ์ด๋์ ์ฌ์ฉ๋๋์ง๋ฅผ ์ ์ ์์ต๋๋ค. ๋ชจ๋ ์ ์ด ๊ถํ์ ์์ ์ด ์๋ ๋ค๋ฅธ ๋์์๊ฒ ์์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. main() ์ ์ ์ธํ๋ฉด ๋ชจ๋ ์ค๋ธ์ ํธ๋ ์์๋ฐ์ ์ ์ด ๊ถํ์ ๊ฐ๋ ํน๋ณํ ์ค๋ธ์ ํธ์ ์ํด ๊ฒฐ์ ๋๊ณ ๋ง๋ค์ด์ง๋๋ค. ์์์ ํ์ฉํ ํ์ฅ๋ ์ ์ด์ ์ญ์ ์ด ์ ์ฉ๋ ์์ ๋๋ค. ์๋ธํด๋์ค๋ ํ์ํ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง๋ง, ๊ทธ ๋ฉ์๋๊ฐ ์ธ์ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ง ์์ ์ ๋ชจ๋ฆ ๋๋ค. ์๋ธํด๋์ค์์ ๊ฒฐ์ ๋๋ ๊ฒ์ด ์๋๋ผ, ๊ธฐ๋ฅ๋ง ๊ตฌํํด๋์ผ๋ฉด ์ํผํด๋์ค์ ๋ฉ์๋๊ฐ ์๋ธํด๋์ค์ ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค. ํ๋ ์์ํฌ๋ ์ ์ด์ ์ญ์ ์ด ์ ์ฉ๋ ๊ธฐ์ ์ ๋๋ค. ํ๋ ์์ํฌ๋ ๋จ์ง ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ๋ฐ์ ํ์ด๋, ํ์ฅํด์ ์ฌ์ฉํ ์ ์๋๋ก ์ค๋น๋ ์ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์งํฉ์ด ์๋๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ฆ์ ์ง์ ์ ์ดํฉ๋๋ค. ๋จ์ง ๋์ํ๋ ์ค ํ์ํ ๊ธฐ๋ฅ์ด ์์ ๋ ๋ฅ๋์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ฟ์ ๋๋ค. ๋ฐ๋ฉด ํ๋ ์์ํฌ๋ ๊ฑฐ๊พธ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ํ๋ ์์ํฌ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ํ๋ ์์ํฌ๊ฐ ํ๋ฆ์ ์ฃผ๋ํ๋ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค. ํ๋ ์์ํฌ๋ ๋ถ๋ช ํ ์ ์ด์ ์ญ์ ๊ฐ๋ ์ด ์ ์ฉ๋์ด ์์ด์ผ ํฉ๋๋ค. ์์ ์ฝ๋๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์๋ FurnitureMaker๊ฐ MaterialMaker์ ๊ตฌํ์ฒด๋ฅผ ๊ฒฐ์ ํ๊ณ , ์์ฑํ์ฃ . ๊ทธ๋ฐ๋ฐ ๊ฐ์ ํ์๋ FurnitureMakerFactory๊ฐ ์ ์ด๊ถ์ ๊ฐ์ง๋๋ค. ์ฆ FurnitureMaker๋ ์์ ์ด ์ด๋ค ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ง๋ ๋ชจ๋ฅด๋, ์๋์ ์ธ ์กด์ฌ๊ฐ ๋์ต๋๋ค. MaterialMaker์ ์์ฑ ์ ์ด๊ถํ ๋ฟ ์๋๋ผ, FurnitureMaker ์๊ธฐ ์์ ์ ์์ฑ ๊ถํ๋ FurnitureMakerFactory์๊ฒ ๋งก๊น๋๋ค. ์ ์ด์ ์ญ์ ์์๋ ์์ ์ฝ๋์์์ ํฉํ ๋ฆฌ ํด๋์ค์ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ปดํฌ๋ํธ์ ์์ฑ๊ณผ ๊ด๊ณ์ค์ , ์ฌ์ฉ, ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ ๋ฑ์ ๊ด์ฅํ๋ ์กด์ฌ๊ฐ ํ์ํฉ๋๋ค.
์คํ๋ง์ ํต์ฌ๊ฐ์น ์ธ ๊ฐ์ง ์ค ํ๋๊ฐ IoC์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ IoC๋ฅผ ์ฝ๊ฒ, ์ ์ ์ฉํ ์ ์๋๋ก ์คํ๋ง์ด ๋์์ค๋ค๋ ๋ป์ ๋๋ค. ์คํ๋ง ๋ด๋ถ ๊ตฌํ์๋ IoC๊ฐ ์ ์ฉ๋์ด ์๊ธฐ๋ ํฉ๋๋ค. ์กฐ๊ธ ๋ ์ฝ๊ฒ ๋งํ์๋ฉด, ์คํ๋ง์ด FurnitureMakerFactory์ ์ญํ , ์ฆ ๊ฐ์ฒด ๊ฐ ๊ด๊ณ ์ค์ ์ ์ฑ ์์ ๋๋งก์์ค๋๋ค.
์์กดํ๊ณ ์๋ค๋ ๊ฑด ๋ฌด์จ ์๋ฏธ์ผ๊น์? A๊ฐ B์ ์์กดํ๋ค๋ ๊ฑด, B๊ฐ ๋ณํ๋ฉด ๊ทธ๊ฒ์ด A์ ์ํฅ์ ๋ฏธ์น๋ค๋ ๋ป์ ๋๋ค. ์ด์ ๊น์ง ๊ณต๋ถํ IoC๋ผ๋ ์ฉ์ด๋ ๋งค์ฐ ๋์จํ๊ฒ ์ ์๋ผ์ ํญ๋๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. ๋๋ฌธ์ ์คํ๋ง์ IoC ์ปจํ ์ด๋๋ผ๊ณ ๋ง ํด์๋ ์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ํน์ง์ ๋ช ํํ๊ฒ ์ค๋ช ํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋์ ์๋ก์ด ์ฉ์ด๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํ ์ฌ๋ฅ์ด ์๋ ๋ช๋ช ์ฌ๋์ ์ ์์ผ๋ก ์คํ๋ง์ด ์ ๊ณตํ๋ IoC ๋ฐฉ์์ ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๋, ์คํ๋ง IoC์ ํต์ฌ์ ์ง์ด์ฃผ๋ฉฐ ์ข ๋ ์๋๊ฐ ๋ช ํํ ๋๋ฌ๋๋ ์ด๋ฆ์ ์ฌ์ฉํ๊ธฐ ์์ํ์ต๋๋ค. ์คํ๋ง IoC ๊ธฐ๋ฅ์ ๋ํ์ ์ธ ๋์์๋ฆฌ๋ ์ฃผ๋ก ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค. ๋ฌผ๋ก ์คํ๋ง์ด ์ปจํ ์ด๋์ด๊ณ ํ๋ ์์ํฌ์ด๋ ๊ธฐ๋ณธ์ ์ธ ๋์์๋ฆฌ๊ฐ ๋ชจ๋ IoC ๋ฐฉ์์ด๋ผ๊ณ ํ ์ ์์ง๋ง, ์คํ๋ง์ด ์ฌํ ํ๋ ์์ํฌ์ ์ฐจ๋ณํ๋ผ์ ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ์ ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๋ ์๋ก์ด ์ฉ์ด๋ฅผ ์ฌ์ฉํ ๋ ๋ถ๋ช ํ๊ฒ ๋๋ฌ๋ฉ๋๋ค.
Dependency Injection์ ์ฌ๋ฌ๊ฐ์ ๋ง๋ก ๋ฒ์ญ๋๋๋ฐ, ๊ทธ ์ค ๊ฐ์ฅ ํํ ์ฌ์ฉ๋๋ ์ฉ์ด๊ฐ ์์กด์ฑ ์ฃผ์ ์ ๋๋ค. ํ์ง๋ง ์์กด์ฑ์ด๋ผ๋ ๋ง์ DI์ ์๋ฏธ๊ฐ ๋ฌด์์ธ์ง ์ ๋๋ฌ๋ด์ฃผ์ง ๋ชปํฉ๋๋ค. DI๋ ์ค๋ธ์ ํธ ๋ ํผ๋ฐ์ค๋ฅผ ์ธ๋ถ๋ก๋ถํฐ ์ ๊ณต(์ฃผ์ )๋ฐ๊ณ ์ด๋ฅผ ํตํด ์ฌํ ์ค๋ธ์ ํธ์ ๋ค์ด๋ด๋ฏนํ๊ฒ ์์กด๊ด๊ณ๊ฐ ๋ง๋ค์ด์ง๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค. ์ด๋ฌํ ๋ฉด์์ ์์กด๊ด๊ณ ์ค์ ์ด๋ผ๋ ๋ฒ์ญ๋ ๋์์ง ์์ต๋๋ค.
์ ๋ฆฌํ๋ฉด ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ์์ ์ ๋งํฉ๋๋ค.
- ํด๋์ค ๋ชจ๋ธ์ด๋ ์ฝ๋์๋ ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๊ฐ ๋๋ฌ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ธํฐํ์ด์ค์๋ง ์์กดํ๊ณ ์์ด์ผ ํฉ๋๋ค.
- ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๋ ์ปจํ ์ด๋๋ ํฉํ ๋ฆฌ ๊ฐ์ ์ 3์ ์กด์ฌ๊ฐ ๊ฒฐ์ ํฉ๋๋ค.
- ์์กด๊ด๊ณ๋ ์ฌ์ฉํ ์ค๋ธ์ ํธ์ ๋ํ ๋ ํผ๋ฐ์ค๋ฅผ ์ธ๋ถ์์ ์ ๊ณต(์ฃผ์ )ํด์ค์ผ๋ก์จ ๋ง๋ค์ด์ง๋๋ค.
์์กด๊ด๊ณ ์ฃผ์ ์ ํต์ฌ์ ์ค๊ณ ์์ ์๋ ์์ง ๋ชปํ๋ ๋ ์ค๋ธ์ ํธ์ ๊ด๊ณ๋ฅผ ๋งบ๋๋ก ๋์ธ์ฃผ๋ ์ 3์ ์กด์ฌ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ 3์ ์กด์ฌ๋ ๋ฐ๋ก ๊ด๊ณ์ค์ ์ฑ ์์ ๊ฐ์ง ์ฝ๋๋ฅผ ๋ถ๋ฆฌํด์ ๋ง๋ค์ด์ง ์ค๋ธ์ ํธ๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
DI๋ ์์ ์ด ์ฌ์ฉํ ์ค๋ธ์ ํธ์ ๋ํ ์ ํ๊ณผ ์์ฑ ์ ์ด๊ถ์ ์ธ๋ถ๋ก ๋๊ธฐ๊ณ ์์ ์ ์๋์ ์ผ๋ก ์ฃผ์ ๋ฐ์ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์์ IoC ์ ๊ฐ๋ ์ ์ ๋ค์ด๋ง์ต๋๋ค. ์คํ๋ง ์ปจํ ์ด๋์ IoC๋ ์ฃผ๋ก ์์กด๊ด๊ณ ์ฃผ์ ๋๋ DI๋ผ๋ ๋ฐ ์ด์ ์ด ๋ง์ถฐ์ ธ ์์ต๋๋ค. ๊ทธ๋์ ์คํ๋ง์ IoC ์ปจํ ์ด๋ ์ธ์๋ DI ์ปจํ ์ด๋ ๋๋ DI ํ๋ ์์ํฌ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
DI์ ๋์๋ฐฉ์์ ์ด๋ฆ ๊ทธ๋๋ก ์ธ๋ถ๋ก๋ถํฐ์ ์ฃผ์ ์ ๋๋ค. ํ์ง๋ง ๋จ์ง ์ธ๋ถ์์ ํ๋ผ๋ฏธํฐ๋ก ์ค๋ธ์ ํธ๋ฅผ ๋๊ฒจ์คฌ๋ค๊ณ ํด์, ์ฆ ์ฃผ์ ํด์คฌ๋ค๊ณ ํด์ ๋ค DI๊ฐ ์๋๋ผ๋ ์ ์ ์ฃผ์ํด์ผ ํฉ๋๋ค. ์ฃผ์ ๋ฐ๋ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๊ฐ ์ด๋ฏธ ํน์ ํด๋์ค ํ์ ์ผ๋ก ๊ณ ์ ๋์ด ์๋ค๋ฉด DI๊ฐ ์ผ์ด๋ ์ ์์ต๋๋ค. DI์์ ๋งํ๋ ์ฃผ์ ์ ๋ค์ด๋ด๋ฏนํ๊ฒ ๊ตฌํ ํด๋์ค๋ฅผ ๊ฒฐ์ ํด์ ์ ๊ณต๋ฐ์ ์ ์๋๋ก ์ธํฐํ์ด์ค ํ์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์ด๋ค์ ธ์ผ ํฉ๋๋ค.
์ง๊ธ๊น์ง ๊ธฐ์ ํ DI ๊ธฐ์ ์ ์ฅ์ ์ ์์ฝํ๋ฉด, ์ฝ๋์๋ ๋ฐํ์ ํด๋์ค์ ๋ํ ์์กด๊ด๊ณ๊ฐ ๋ํ๋์ง ์๊ณ , ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ฒฐํฉ๋๊ฐ ๋ฎ์ ์ฝ๋๋ฅผ ๋ง๋๋ฏ๋ก, ๋ค๋ฅธ ์ฑ ์์ ๊ฐ์ง ์ฌ์ฉ ์์กด๊ด๊ณ์ ์๋ ๋์์ด ๋ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋๋๋ผ๋ ์์ ์ ์ํฅ์ ๋ฐ์ง ์์ผ๋ฉฐ, ๋ณ๊ฒฝ์ ํตํ ๋ค์ํ ํ์ฅ ๋ฐฉ๋ฒ์๋ ์์ ๋กญ๋ค๋ ๊ฒ์ ๋๋ค.