0. ์ง๊ธ๊น์ง ํ ๊ฒ๋ค
์ง๊ธ๊น์ง๋ DI๋ผ๋ ์ปดํจํฐ ๋ณธ์ฒด์ ๋ด๋ถ๋ฅผ ๋ฏ์ด ๋ดค๋ค.
Main1์ Di์ ๊ฐ๋ : ์ธ๋ถ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์์ค์ฝ๋ ๋ด๋ถ๋ก ์ฃผ์ ํ๋ค๋ ๊ฒ ์ด๋ค ์๋ฏธ์ธ์ง ์์๋ณด์๋ค.
Config.txt๋ผ๋ ๋ฌธ์์ ๊ฐ์ฒด์ด๋ฆ = "ํด๋น ๊ฐ์ฒด ๊ตฌํํ๋ ํด๋์ค์ ๊ฒฝ๋ก์ฃผ์" ๋ก ๊ฐ๋ค์ ์ ์ฅํด๋๋๋ค.
๊ทธ๋ฌ๋ฉด Main1 ๋ด๋ถ์ ํจ์๊ฐ ๋ฌธ์ ๋ด์ฉ์ ๋ฐ์์์, ๊ฒฝ๋ก์ฃผ์๋ฅผ ReflectionApi๋ฅผ ์ด์ฉํด ๋ฉํ๋ฐ์ดํฐ๋ก ์ง์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ค.
์ฐ๋ฆฌ๋ new ์ ์ธ ์์ด ํด๋น ๋งค์๋๋ง์ ์ด์ฉํด ๊ฐ์ฒด ์์ฑ์ด ๊ฐ๋ฅํด์ก๋ค.
Main2๋ ๊ฐ์ฒด ์ ์ฅ์๋ผ๋ ๊ฐ๋ ์ ์๊ฐ ํ๊ณ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ๋ก์ง์ ์ค๋ช ํ๋ค.
๊ฐ์ฒด ์ ์ฅ์๋ Config.txt์ ๋ด์ฉ์ Map ํํ๋ก ์ผ๋จ ๋ฐ์์จ๋ค.
๊ทธ๋ฌ๋ฉด Key๋ ๊ฐ์ฒด์ด๋ฆ, Value๋ ํด๋น ๊ฐ์ฒด ๋ง๋๋ ํด๋์ค์ ๊ฒฝ๋ก์ฃผ์๋ก ๋ค์ด์จ๋ค.
์ด๋ Value๋ค์ loop ๋๋ ค์, Reflection APi๋ฅผ ์ด์ฉํด ์ง์ง ๊ฐ์ฒด๋ก ๋ง๋ค์ด ๋ค ๊ฐฑ์ ํ๋ค.
์ด์ ์ฐ๋ฆฌ๋ ๊ฐ์ฒด ์ ์ฅ์ Map์ ์ด์ฉํด ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ์ผ์ ์ฒ๋ฆฌํ๋ค.
Main3๋ ๋ ์ด์ ์ธ๋ถ ๋ฌธ์์ธ Config.txt๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , @Component๋ฅผ ์ด์ฉํด ๊ฐ์ฒด ์ ์ฅ์์ ๊ฐ์ฒด๋ฅผ ์ฑ์ฐ๋ ๋ฒ์ ์ค๋ช ํ๋ค.
ํจํค์ง ๋ด์ @Component๊ฐ ๋ถ์ ํด๋์ค๋ค์ด ์๋์ง ์ ์์กฐ์ฌ๋ฅผ ํ๋ค.
@Component๊ฐ ๋ถ์ ํด๋์ค๋ค์ ํด๋น ํด๋์ค์ ์ฒซ๊ธ์๋ฅผ ์๋ฌธ์๋ก ๋ฐ๊พผ ์ด๋ฆ์ ๊ฐ์ฒด์ ์ฅ์์ Key๋ก ๋ฃ๋๋ค.
ํด๋น ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ค์ด Value๋ก ๋ฃ๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ ์ธ๋ถ ๋ฌธ์ ์์ด๋ @Component๋ง ์ฐ๋ฉด Spring์ด ์์ ๋์๋ค์ ์๋์ผ๋ก ํด์ฃผ์ด ์ด๋ฏธ ์์ฑ๋ ๊ฐ์ฒด๋ค์ ํ์ ์๋ง๋ค ๊บผ๋ด ์ธ ์ ์๊ฒ ๋๋ค.
Main4๋ Aํด๋์ค์ iv๋ก B,C ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์์ ๊ฒฝ์ฐ, A์ iv๋ก ์์ฑ๋ B,C์ ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ์ฐ๊ฒฐ์ํค๋์ง์ ๋ํด ์ค๋ช ํ๋ค. ์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด @AutoWired์ @Resource์๋ค.
์์ @Component๋ฅผ ํตํด ์ด๋ฏธ ๊ฐ์ฒด ์ ์ฅ์์ Map ํํ๋ก ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋์ด ์๋ค๊ณ ๊ฐ์ ํ์.
๊ทผ๋ฐ ๋ง์ฝ Aํด๋์ค์ iv๊ฐ ๊ฐ๊ฐ B,C ํด๋์ค์ ๊ฐ์ฒด์ผ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ฒด๋ค์ @AutoWired๋ @Resource๋ฅผ ๋ฏธ๋ฆฌ ๋ถ์ฌ ๋๋๋ค.
๊ทธ๋ฌ๋ฉด Spring์ด ํด๋น ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋ ์๊ณผ ๊ฐ์ ํ์ ์ ๊ฐ์ฒด(@AutoWired ์ผ์ ์), ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ฒด(@Resource ์ผ์ ์)๊ฐ Map์์ ์๋์ง ์ฐพ์๋ณด๊ณ ์์ผ๋ฉด ์๋์ผ๋ก iv ๊ฐ์ฒด๋ค์ ๋์ ์ํจ๋ค.
ํด๋น ์ด๋ ธํ ์ด์ ์ ์ด์ฉํ๋ฉด, ์ฐ๋ฆฌ๊ฐ ์๋์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๋ค๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ธํ์ง ์์๋ ๋๋ค. ์ธ๋ถ์์ ๋ค ํด์ฃผ๊ธฐ ๋๋ฌธ.
2. ์ฝ๋๋ฆฌ๋ทฐ
์ด์ ํด๋น ์ด๋ ธํ ์ด์ ๋ค์ ์ค์ ์์ ๋ฐ๋ก ์จ๋ณด๊ฒ ๋ค.
A. Main2์ ์๋ฆฌ (๊ฐ์ฒด ์ ์ฅ์๋ฅผ ๋ง๋ค์ด ์ธ๋ถ ๋ฌธ์์ ๋ด์ฉ์ ๋ถ๋ฌ๋ค์ฌ ๊ฐ์ฒด๋ค์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ณ ๊บผ๋ด ์ฐ๋ ๊ฒ)๋ ์ค์ ์์ ์ฐ์ธ๋ค.
Logic์ ๋ค์๊ณผ ๊ฐ๋ค.
(1) Spring ํ๊ฒฝ ์ค์ ํ์ผ์ ์์ Config.txt ์ฒ๋ผ ๋ง๋ค์ด์ ๊ฐ์ฒด์ด๋ฆ = "ํด๋น ๊ฐ์ฒด ๊ตฌํํ ํด๋์ค์ ๊ฒฝ๋ก์ฃผ์"๋ค์ ์ ์ฅํ๋ค.
(2) ๊ฐ์ฒด ์ ์ฅ์๋ฅผ SpringFrameWork๋ก๋ถํฐ ์์ ํ๋ค. ๊ฐ์ฒด ์ ์ฅ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์๊น ๋ง๋ ํ๊ฒฝ์ค์ ํ์ผ์ ๋ก๋ ํ๋ค.
๊ทธ๋ฌ๋ฉด Spring์ด ์๋์ผ๋ก <๊ฐ์ฒด์ด๋ฆ, ๊ฐ์ฒด>์ Map ์ ์ฅ์๋ฅผ ๋ง๋ค์ด์ค๋ค.
(3) ๊ฐ์ฒด ์ ์ฅ์ ๋ด์ฅ ๋งค์๋์ธ getBeans()๋ฅผ ์ด์ฉํ์ฌ, ๊ฐ์ฒด ์ ์ธ ์ ์ด๋ฏธ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๊ฑฐ๊ธฐ์ ๋์ ์์ผ์ค๋ค.
-----๋ก์ง ์ธ๋ถ ์ค๋ช -----
(1)ํ๊ฒฝ ์ค์ ํ์ผ ๋ง๋ค๊ธฐ
์์์ Spring Config๋ฅผ ๋๋ฅด์. ์ด๋ Spring ํ๊ฒฝ์ค์ ํ์ผ์ ๋ง๋๋ ๊ฒ์ด๋ค.
(1-1) Bean์ ๋ฑ๋ก
์ฐ๋ฆฌ๊ฐ Di ํ๋ด๋ผ๋, txt ํ์ผ์ ์์ ๊ฐ์ด Map ํ์์ผ๋ก ์ ์ด ๋์๊ณ , ์ด๊ฑธ ๋ถ๋ฌ๋ค์ฌ์ ๊ฐ์ฒด ์ ์ฅ์์ Map์ ์ฑ์๋ฃ์ ์ ์ด ์์๋ค.
ํด๋น ๊ณผ์ ์ ์ค์ ์์๋ ํ๊ฒฝ์ค์ ํ์ผ (XML configuration file)์ Bean์ผ๋ก ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฒด ์ ์ฅ์์ ์ ์ฅํ ๋ด์ฉ๋ค์ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์๋ค. <๊ฐ์ฒด์ด๋ฆ, ํด๋์ค ๊ฒฝ๋ก์ฃผ์>๋ผ๋ ํ์์์ ๋งค์ฐ ์ ์ฌํ๋ค.
(2)๊ฐ์ฒด ์ ์ฅ์ SpringFrameWork์์ ๊ฐ์ ธ์ค๊ธฐ, ๋ด์ฅ ํจ์ getBeans ์ด์ฉํด ์ ์ธ๋ ๊ฐ์ฒด์ ๋ง๋ค์ด์ง ๊ฐ์ฒด ๋์
GenericXmlApplicationContext๋ฅผ ์จ์ผ ํ๊ฒฝ์ค์ ํ์ผ์ ๋ก๋ํด์ ์ธ ์ ์๋ค.
๊ฐ์ฒด ์ ์ฅ์์ ๋ด์ฅ ๋งค์๋์ธ getBean๋ ๋ฆฌํด ํ์ ์ด Object์์ผ๋ก ํ๋ณํ์ด ํญ์ ํ์ํ๋ค.
ํ์ง๋ง ๋ ๋ฒ์งธ ์ธ์๋ก ํด๋น ๊ฐ์ฒด์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ํ๋ณํ์ ๋งค์๋ ๋ด๋ถ์์ ํด์ฃผ์ด์ ๋ฐ๋ก ํ๋ณํ ํ ํ์๊ฐ ์๋ค.
๊ทธ๋ฌ๋ฉด ์์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฒ ๋ณด์.
Car์ Car2๊ฐ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์์์ ์ ์ ์๋ค. ์ด๋ Beans๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก Sington์ ์งํฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Sington์ด๋ ํ๋์ ํด๋์ค์ ํ๋์ ๊ฐ์ฒด๋ง ์์ฑํ๋ค๋ ์์น์ผ๋ก, ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ๋ฒ ์์ฒญํ๋ฉด ํด๋น ์์ฒญ๋ค ํ๋ํ๋ ๋ฐ๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋์ํ์ง ๋ง๊ณ , ํ๋์ ๊ฐ์ฒด๋ง ๋ง๋ค์ด ๊ณ์ ์ฌํ์ฉํ์ฌ ๋์ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด๋ ์ฉ๋ ํจ์จ์ ๋์ธ๋ค.
ํ์ง๋ง ์ด๋ค ์ํฉ์์๋ Car์ Car2๊ฐ ์์ ํ ๋ค๋ฅธ ๊ฐ์ฒด์ฌ์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ด ๊ฒฝ์ฐ Beans์ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ์ถ๊ฐ๋ก ๊ฑธ์ด์ค๋ค.
scope ="prototype" ์ผ๋ก ๊ฑธ์ด๋๋ฉด, "car" ํน์ Car type์ ๋ํ ์์ฒญ์ด ์ฌ๋ฌ ๋ฒ ์ค๋ฉด ๋งค๋ฒ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ค.
๋ฐ์ scope="singleton" ์ด๋ ์์ฑ๋ ๊ฑธ์ด๋จ๋๋ฐ ์ด๋ bean์ default ๊ฐ์ด์ด์ ๊ตณ์ด ๋ฐ๋ก ์ ์ธ ์ํด๋ ๋๋ค.
์์ ์ค์ ํ์ผ๋ก ์คํ ๊ฒฐ๊ณผ ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ ์ ์ ์๋ค.
B. ํ๊ฒฝ ์ค์ ํ์ผ์ Bean์ ์ด์ฉํด์ A ํด๋์ค ๋ด๋ถ์ B,C ํด๋์ค์ ๊ฐ์ฒด iv์ ๊ฐ์ฒด ์ ์ฅ์ Map์ ์์ฑ๋ ๊ฐ์ฒด๋ค์ ์ฐ๊ฒฐ ์์ผ ์ฃผ๋ ๋ฒ
(1) ๋จผ์ Car ๋ด๋ถ๋ฅผ ๊ธฐ๋ณธํ๊ณผ ์ฐธ์กฐํiv๋ค๋ก ์ฑ์ฐ์. (test ์ํด)
(2) ์๋์ผ๋ก ์ด๊ธฐํ ์์ผ๋ณด๊ธฐ (์๋์ผ๋ก ์ฐ๊ฒฐ)
(3) property๋ผ๋ Bean ๋ด๋ถ ํ๊ทธ๋ฅผ ์ด์ฉํด iv ์ด๊ธฐํ
(4) Constructor-arg๋ผ๋ ํ๊ทธ๋ฅผ ์ด์ฉํด iv ์ด๊ธฐํ
------- ์ธ๋ถ ์ค๋ช -------
(1)
class Car {
String color ;
int oil;
Engine engine;
Door doors[];
public void setColor(String color) {
this.color = color;
}
public void setOil(int oil) {
this.oil = oil;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public void setDoors(Door[] doors) {
this.doors = doors;
}
@Override
public String toString() {
return "Car{" +
"color='" + color + '\'' +
", oil=" + oil +
", engine=" + engine +
", doors=" + Arrays.toString(doors) +
'}';
}
}
**toString์ ์ญํ **
toString() ๋งค์๋๋ ์๋ ๋ชจ๋ ํด๋์ค์ ์กฐ์ Object ํด๋์ค์ ๋งค์๋๋ก ํด๋น ๊ฐ์ฒด ์์ฒด๋ฅผ ์ถ๋ ฅํ ์์ ์๋ํ๋ ๋งค์๋ ์ด๋ค.
์ฐ๋ฆฌ๊ฐ toString ๋งค์๋๋ฅผ ์ฌ์ ์ํด์ฃผ์ง ์์ ์ฑ Car ๊ฐ์ฒด๋ฅผ ์ถ๋ ฅํ๋ฉด ๋ฐ๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
์ด๋ ๋ด์ฉ๋ฌผ์ด ๋ญ์ง ๋ณด๊ธฐ ์ด๋ ต๋ค.
์์ ์ฝ๋์ฒ๋ผ toString์ ์ฌ์ ์ ํ๋ฉด car ๊ฐ์ฒด ์์ฒด๋ฅผ ์ถ๋ ฅํ ์ ๋ฐ๊ณผ ๊ฐ์ด ์ถ๋ ฅํ๋ค.
(2) ์๋์ผ๋ก iv ์ด๊ธฐํ
** ๊ฒฐ๊ณผ **
Doors์ ๋ฐฐ์ด์ ์์๋ค์ด ๋ค ๊ฐ์ ๊ฐ์ฒด์ธ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ Bean ์์ฑ์์ scope="prototype"์ผ๋ก ๋ฐ๊พธ๋ฉด ๋๋ค.
(3) Beans์ ์์ฑ ์ด์ฉํด, ๊ฐ์ฒด๋ค์ ์ ์ธ๋ง ํด๋ ์๋์ผ๋ก ์ด๊ธฐํ ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ
property ํ๊ทธ ์ด์ฉ.
๊ทธ๋ฌ๋ฉด Car ๊ฐ์ฒด ๋ด์ iv์ธ engine๊ณผ door ์ ๊ฐ์ type์ ๊ฐ์ฒด ์ ๋ณด๊ฐ Beans์ ๋ฑ๋ก๋์ด ์๋์ง ๋ณด๊ณ ์๋ค๋ฉด, ๊ฐ์ฒด์ ์ฅ์์ ๊ทธ ์ ๋ณด๊ฐ ๊ตฌํ๋ ํด๋น ๊ฐ์ฒด๋ค๊ณผ iv๋ฅผ ์ฐ๊ฒฐ์์ผ์ค.
๊ธฐ๋ณธํ์ value๋ก ์ด๊ธฐํ / ์ฐธ์กฐํ์ ref๋ก ์ด๊ธฐํ / ๋ฐฐ์ด์ array๋ผ๋ ํ๊ทธ๊ฐ ํ๋ฒ ๋ ํ์ํจ.
ํด๋น Property๋ ํ๊ทธ๋ ํด๋์ค ๋ด๋ถ์ setter ๋งค์๋๋ฅผ ์ด์ฉํ๋ค.
๋ฐ๋ผ์ Car ํด๋์ค ๋ด๋ถ์ ๊ฐ iv์ ๋ํ Setter๋ฅผ ๊ตฌํํด๋์ง ์๋๋ค๋ฉด Property๊ฐ ์๋ํ์ง ์์์ iv๊ฐ ์ด๊ธฐํ ๋์ง ์๋๋ค.
(4) property๊ฐ class์ setter ๋งค์๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, constructor-arg๋ class์ constructor ๋ฅผ ์ฌ์ฉํ์ฌ iv๋ค์ ์ด๊ธฐํ ํ๋ค.
์ธ์ ๋ฃ์ด์ ์ค์ ํ์ฉํ๋ ์์ฑ์ ๋ง๊ณ , ๊ทธ๋ฅ ๋น ๊ธฐ๋ณธ ์์ฑ์๋ ๋ง๋ค์ด๋์ผ ์ค๋ฅ๊ฐ ์ ๋ฌ๋ค.
์ ๋์จ๋ค.
C. Bean์ ์๋ ๋ฑ๋กํ์ง ์๊ณ , ComponentScan์ด๋ ํ๊ทธ ์ด์ฉํด์ ์๋ ๋ฑ๋กํ๊ธฐ
์ง๊ธ๊น์ง ํ๊ฒฝ์ค์ ํ์ผ (configuration.xml)์ ์ง์ Bean์ ์์ฑํ์ฌ ๋ฑ๋กํ๋ค.
Bean์๋ id = "๊ฐ์ฒด์ด๋ฆ" , class= "ํด๋น ๊ฐ์ฒด ๊ตฌํํ๋ ํด๋์ค์ ๊ฒฝ๋ก์ฃผ์"๋ก ์ ์ฅ์ด ๋์ด ์์๊ณ ,
์์ค์ฝ๋๋ด์ ์ ์ธํ ๊ฐ์ฒด ์ ์ฅ์๊ฐ ํด๋น ์ ๋ณด๋ฅผ ๋ฐ์๊ฐ์ ์์ค์ฝ๋ ๋ด์ <๊ฐ์ฒด์ด๋ฆ, ๊ฐ์ฒด>์ Map์ ๋ง๋ค์๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ค.
์ด์ ComponentScan ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ํ๊ฒฝ์ค์ ํ์ผ์ bean์ ๋ฑ๋กํด ๋ณด๊ฒ ๋ค.
(1) Bean ์๋ ๋ฑ๋กํ๋ ๊ฑฐ ๋ค ์ง์ฐ๊ณ @Component ์ด๋ ธํ ์ด์ ๋ฌ๋ฆฐ ํด๋์ค๋ค ์๋์ผ๋ก ํ๊ฒฝ ์ค์ ํ์ผ์ bean์ผ๋ก ๋ฑ๋กํด์ฃผ๋ ComponentScan ์ฐ๊ธฐ
(2) ๊ฒฐ๊ณผ ํ์ธ ์๋ฌ
why? ์์ ์ ๋ค๋ฅธ diCopy ํด๋์์ ์ฐ์ตํ๊ธฐ ์ํด ์ผ๋ Car๋ผ๋ ํ์ผ์ด ๋๊ฐ์ด ๋ ์๊ธฐ ๋๋ฌธ์.
๊ทธ๋ ๋ค๋ฉด ํด๋น ํด๋๋ค์ ํด๋์ค๋ค์ ์ ์ธํ๊ณ ๋๋จธ์ง ๋ค bean์ ๋ฑ๋กํ๋ผ๋ ๋ช ๋ น์ด๋?
(3) @Component ๋ถ์ ํด๋์ค ๋ฑ๋กํ ๋ id ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด?
default๋ก ์์ฑ๋๋ id(๊ฐ์ฒด ์ด๋ฆ)์ ํด๋์ค์ ์ ๊ธ์ ์๋ฌธ์๋ก ๋ฐ๊พผ ๊ฒ,
๋ฐ๊พธ๋ ค๋ฉด?
(4)Engine์ ์์ ํด๋์ค ๋ง๋ค๊ณ , ๊ฐ์ฒด ์ ์ฅ์์ Engine ๊ณ์ด ํด๋์ค ๋ชจ๋ ๋ฑ๋กํ ๋ค, Car์ iv์ ์ฐ๊ฒฐ
- ac.getBean ๋งค์๋(๊ฐ์ฒด ์ ์ฅ์ ๋ด๋ถ ๋งค์๋) ์ด์ฉ์ ์ค๋ฅ
- @AutoWired ์ฌ์ฉ ์ ํด๋น ์ค๋ฅ๋ ์ก์์ง๋ง, ๋ ์ค๋ฅ ๋๋ ์ํฉ์ด ์์.
- @AutoWired์ ์ค๋ฅ๋ฅผ ๊ทน๋ณตํ๋ ๋ฐฉ๋ฒ
(1)
xml ํ๊ฒฝ ์ค์ ํ์ผ ๋ด๋ถ
์์ค์ฝ๋ ๋ด๋ถ์ Bean ๋ฑ๋กํ ํด๋์ค๋ค์ ์ด๋ ธํ ์ด์ ๋ถ์ด๊ธฐ
run ํ๊ธฐ
(2)
์ค๋ฅ ๋ฐ์. ์ด์ ๋ ๊ฒฝ๋ก ์ฃผ์ ๋ด์ Car๋ผ๋ ํด๋์ค๊ฐ @Component ์ด๋ ธํ ์ด์ ์ ๋ถ์ ์ฑ ์ค๋ณต๋์ด ์กด์ฌํ๋ค.
๊ทธ๋์ Spring์ ๋ญ ์ด์ฉํด์ ๊ฐ์ฒด ์ ์ฅ์์ ๊ฐ์ฒด ๋ง๋ค์ด ์ ์ฅํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ ๊ฒ์ด๋ค.
<ํด๊ฒฐ๋ฐฉ์ - ํด๋น ch3.diCopy ํด๋๋ค์ ๋ค์ง์ง ๋ง๋ผ>
ํด๋น ํ๊ทธ ์ถ๊ฐ
<๋ค์ run>
์ด์ ์ค๋ฅ๋ ์ ๋์ง๋ง ๊ฐ๋ค์ด ๋ค Null ์
์ด์ ๋ ๊ฐ์ฒด ์์ฑ๋ง ํ์ง, ๊ฐ์ฒด๋ค๊ฐ์ ๊ด๊ณ๋ฅผ ์ฐ๊ฒฐ์ ์ํ๋ค.
์ฌ๊ธฐ์๋ Car์ iv ๊ฐ์ผ๋ก engine๊ณผ doors๋ฅผ ๋ฃ์ด์ฃผ์ง ์์๋ค.
a. ์๋์ผ๋ก ๋ฃ๊ธฐ. Car ํด๋์ค์ setter๋ฅผ ์ด์ฉํด ์๋์ผ๋ก ๋ฃ๊ธฐ
<๊ฒฐ๊ณผ>
์ฌ๊ธฐ์ door ๋ฐฐ์ด ๋ด์์ ๊ฐ์ฒด๊ฐ ๊ฐ์์ ์ ์ ์๋ค.
์ด๊ฑด ์ปดํฌ๋ํธ ์ค์บ์ผ๋ก ์ฐ๋ฉด ๊ณ ์น ์ ์๋ ๋ถ๋ถ์ด๋ค. ์๋๋ property ํ๊ทธ์ scope๋ฅผ prototype์ผ๋ก ํด์,
๊ฐ์ฒด ์์ฑ ์์ฒญ์ด ์์ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
์ด์ ๊ทธ๋ฌ๋ฉด, setter ์จ์ ์ฌ์ฉ์๊ฐ ์ง์ ๊ฐ๋ค์ ์ฐ๊ฒฐ ์ง๋ ๋ฐฉ๋ฒ ๋ง๊ณ , Spring์ด ์ด๋ฅผ ์๋์ผ๋ก ํด์ฃผ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์. ์ฐ๋ฆฌ๊ฐ Di ํ๋ด๋ด๊ธฐ์์๋ ๋ฐฐ์ ๋ฏ์ด 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. ํ๋๋ ๊ฐ์ฒด ์ ์ฅ์ Map์์ Value(๊ฐ์ฒด๋ค์ type)์ ๋ค์ ธ์
Class์ iv์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐ์์ผ ์ฃผ๋ @AutoWired ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ Map์์ Name (๊ฐ์ฒด ์ด๋ฆ)์ผ๋ก ์ฐพ๋ @Resource๊ฐ ์๋ค.
๋จผ์ @AutoWried๋ฅผ ๋จผ์ ์จ๋ณด๊ฒ ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ฅ ํ ์คํธ๋ฅผ ์ํ์ฌ Engine์ ์์ ํด๋์ค๋ค์ ๋ง๋ค๊ณ @Component๋ฅผ ๋ง๋ค์ด ๊ฐ์ฒด ์ ์ฅ์์ ์ถ๊ฐํ๋ค.
์ด์ ๊ฐ์ฒด์ ์ฅ์ ac์ Map์ ๋๋ต ์ด๋ฐ ํํ์ผ ๊ฒ์ด๋ค.
Key (๊ฐ์ฒด์ด๋ฆ) | Value (๊ฐ์ฒด) |
car | Car ๊ฐ์ฒด |
engine | Engine ๊ฐ์ฒด |
superengine | SuperEngine ๊ฐ์ฒด |
turboengine | TurboEngine ๊ฐ์ฒด |
door | Door ๊ฐ์ฒด |
** ์ฐธ๊ณ ํ ์ **
์ฐ๋ฆฌ๋ ac.getBean์ด๋ผ๋ ๊ฐ์ฒด ์ ์ฅ์ ๋ด์ฅ ํจ์๋ฅผ ํตํด ์ ์ธ๋ ๊ฐ์ฒด์ ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ค์ ๋์ ํด ์์๋ค.
(3)
@Component ("Map์ ํค๋ก ๋ฃ๊ณ ์ถ์ ๊ฐ์ฒด์ ์ด๋ฆ") ํด๋์ค ์ด๋ฆ.
์ด๋ ๊ฒ ์ ์ด์ฃผ๋ฉด ๊ฐ์ฒด ์ ์ฅ์์ <K, V>๋ก ๊ฐ์ด ์ ์ฅ๋ ๋, "" ์์ ๋ด์ฉ์ผ๋ก Key๊ฐ ์ ์ฅ๋๋ค.
์ด๋ฌํ ์ค์ ์ ๋ฐ๋ก ํด์ฃผ์ง ์๊ณ @Coponent ํด๋์ค ์ด๋ฆ์ ์ฐ๋ฉด
@Component ("ํด๋์ค ์ด๋ฆ ์ฒซ ๊ธ์ ์๋ฌธ์๋ก ํ ๊ฒ") ํด๋์ค ์ด๋ฆ๊ณผ ๊ฐ์ ์๋ฏธ์ด๋ค.
Engine์ ์์ ํด๋์ค๋ค์ ๋ ๋ง๋ค์ด ๊ฐ์ฒด ์ ์ฅ์์ ๋ฑ๋กํ๊ธฐ ์ ๊น์ง๋ ac.getBean์ ์ธ์๋ฅผ "๊ฐ์ฒด์ด๋ฆ"์ผ๋ก ํ๋ ์ง ์๋๋ฉด Engine.class ์ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ(๊ฐ์ฒด์ type)์ ๋ฃ๋ ์ง ์๋ฌด ์๊ด์ด ์์๋ค.
ํ์ง๋ง ์ด์
์ด๋ ๊ฒ ๋ฃ์ผ๋ฉด ์๋ฌ๊ฐ ๋๋ค.
์ด๋ฐ ์๋ฌ๊ฐ ๋ํ๋๋ ์ด์ ๋ฅผ ํฐ๋ฏธ๋์์ ์ค๋ช ํด ์ฃผ์๋ค.
Engine.class๋ type๊ณผ ์ผ์นํ๋ ๊ฐ์ฒด๊ฐ 3๊ฐ๋ ์์ด์ ๋ฌด์์ ๊ฐ์ฒด ์ ์ธ๋ถ์ ์ฐ๊ฒฐํด์ค์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ ๊ฒ์ด๋ค.
ํด๋์ค ํ์ ์ผ๋ก ๊ฐ์ฒด ์ ์ฅ์์ value๋ฅผ ๋ค์ ธ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ํด๋น ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์ค๋ณต ์์ฑ๋์ด ์๊ฑฐ๋, ํด๋น ํด๋์ค์ ์์ ํด๋์ค ๊ฐ์ฒด๊ฐ ์ ์ฅ์ ๋ด์ ์๋ ๊ฒฝ์ฐ, ์ ์ธ๋ถ์ ์ฐ๊ฒฐํ ๊ฐ์ฒด๋ฅผ ํน์ ํ์ง ๋ชปํด์ ์๋ฌ๊ฐ ๋๋ค.
๋ฐ๋ผ์ ๊ฐ์ฒด ์ด๋ฆ์ผ๋ก ์ ํํ๊ฒ ์ง์ ํ์ฌ ๊ฐ์ฒด ์ ์ธ๋ถ์ ์ด์ด ์ค์ผ ํ๋ค.
๋ค์ ๋์์์ @AutoWired๋ฅผ Car ํด๋์ค์ iv์๋ค๊ฐ ๋ฑ๋กํด๋ณด๊ฒ ๋ค.
์ฐธ๊ณ ๋ก ๊ธฐ๋ณธํ iv์ ๊ฐ์ ์ฐ๊ฒฐํด์ฃผ๋ ค๋ฉด Value("์ํ๋ ๊ฐ")์ผ๋ก ์ด๋ ธํ ์ด์ ์ ๊ฑธ์ด์ฃผ๋ฉด ๋๋ค.
๊ธฐ๋ณธํ ํ์ ์ด ๋ญ๋ ์ง ๊ฐ์ Value์ ์ธ์๋ String์ด๋ค. Spring์ด String ์ธ์๋ฅผ ๋ฐ์๋, ๊ธฐ๋ณธํ ํ์ ์ ๋ง๊ฒ ํ๋ณํ ํด์ฃผ๋๊น ๊ฑฑ์ ์ํด๋ ๋๋ค.
์ด ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๊ฐ ์ ์์ ์ผ๋ก ๋์จ๋ค.
AutoWired๋ฅผ ์ฐ๋ฉด ๋ฐฐ์ด์ ํ๋์ ์์ ๋ฐ์ ๋ชป ๋ฃ๋๋ค๋ ๋จ์ ์ด ์๋ค.
๊ทผ๋ฐ AutoWired๋ ๋ถ๋ช Class type์ผ๋ก Value๋ฅผ ๋ค์ ธ ์ผ์นํ๋ ๋ ์์ iv์ ์ฐ๊ฒฐ ์์ผ์ฃผ๋๋ฐ, ์ด์ํ๊ฒ ac.getBeans(Class.type)๊ณผ ๋ฌ๋ฆฌ ์๋ฌ๊ฐ ๋์ง ์์๋ค.
๊ทธ๋ฌ๋ฉด AutoWired๋ ์ด๋ป๊ฒ ๊ฐ์ ํด๋์ค ๊ณ์ด์ธ Engine, SuperEngine, TurboEngine ๊ฐ์ฒด๋ค ์ฌ์ด์์ Engine์ ๊ณจ๋์๊น?
@AutoWired๋ ๋จผ์ ํด๋์ค ํ์ ์ผ๋ก Value๋ฅผ ๊ฒ์ํ ๋ค, ๊ฐ์ ํด๋์ค ํ์ ์ด ์ฌ๋ฌ ๊ฐ์ด๋ฉด, ๊ทธ ์ค์์ ํ์ฌ ์ด๋ ธํ ์ด์ ๊ฑธ๋ฆฐ iv์ ํด๋์ค (์ฌ๊ธฐ์ Engine)์ ์ ๊ธ์๋ฅผ ์๋ฌธ์๋ก ๋ฐ๊พผ ๊ฐ์ฒด ์ด๋ฆ์ด Map์ Value๋ค ์ฌ์ด์ ์๋์ง ์ฐพ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ค๋ฉด ๊ทธ ๋ ์์ ์ฐ์ ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ์ Engine์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด ์ ์ฅ์์์ ์ ์ธํด๋ณด์!
@Component ํ๊ทธ๋ฅผ ์ง์ฐ๋ฉด Bean ๋ฑ๋ก์ด ์๋ ๊ฒ์ด๊ณ , ๊ทธ๋ฌ๋ฉด ac์๋ ๋ค์ด๊ฐ์ง ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ค๋ฅ๊ฐ ๋๋ค. ์๋๋ฉด ํด๋น ์ํฉ์ @AutoWired๊ฐ ๊ฐ์ฒด๋ฅผ ์ฐพ๋ ์ฐ์ ์์ ๋ฉ๋ด์ผ์ ์๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ด๋ค!
@AutoWired๋ SuperEngine ๊ฐ์ฒด์ TurboEngine ๊ฐ์ฒด ์ฌ์ด์ ๋ญ ๊ณ ๋ฅผ์ง ๋ชฐ๋ผ์ ์๋ฌ๋ฅผ ๋ด๋ณด๋ธ๋ค.
์ด ๊ฒฝ์ฐ @Qualifier("๊ฐ์ฒด์ด๋ฆ")๋ผ๋ ์ด๋ ธํ ์ด์ ์ ์ด์ฉํ์ฌ, ํด๋น ํด๋์ค type์ด ์ฌ๋ฌ ๊ฐ์ผ ์ ๋ญ ์ ํํด์ ์จ์ค์ผ ํ ์ง ๊ณจ๋ผ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด ํด๋น engine์ด๋ iv๋ ์ ์ฅ์์ ์๋ superEngine์ ๊ฐ์ฒด์ ์ฐ๊ฒฐ์ด ๋๋ค.
** ์ฐธ๊ณ **
@AutoWired ๋ถ๋ถ ์งํํ๋ฉด์, ๋ฐ์ Engine๊ณผ Door ์ ์ธ๋ถ๋ค์ ์ฃผ์์ฒ๋ฆฌ ํ๋ค.
ํด๋น ๋ด์ฉ๋ค์ engine,door ๋ ๊ฐ์ฒด ์ ์ธํ๊ณ ๊ฐ์ฒด ์ ์ฅ์์ ์ด๋ฏธ ์๋ Engine๊ณผ Door์ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐ ์์ผ์ฃผ๋ ๋ด์ฉ์ด๋ค.
ํ์ง๋ง ์ด์ ์ฐ๋ฆฌ๋ Car ๊ฐ์ฒด ๋ด iv ์ฐ๊ฒฐ๋ง ์ ๊ฒฝ ์ฐ๋ฉด ๋๋ฏ๋ก ํ์ ์๋ ๋ด์ฉ์ด๋ค. Car๋ง ๊ฐ์ฒด ์์ฑ ํด์ฃผ๋ฉด ๋๋ค.
์ฌ์ค Resource๋ก ํ๋ฉด ์์ ๊ณผ์ ์ด ํ๋ฒ์ ํด๊ฒฐ๋๋ค.
ํ์ง๋ง ๋์ ๋ก์ง์ ๋ค๋ฅด๋ค. @AutoWired์ @Qualifier("๊ฐ์ฒด์ด๋ฆ")๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ, ์ฒ์์๋ class type์ผ๋ก ์ฐพ์์ ๊ฐ์ ๊ณ์ด์ ๊ฐ์ฒด๋ค์ ๋ฝ์ ๋ค์ ๊ทธ ์ค์์ ๊ฐ์ฒด ์ด๋ฆ์ผ๋ก ์ฐพ๋ ๊ฒ์ด๋ค.
@Resource(name="๊ฐ์ฒด์ด๋ฆ")์ ์ฒ์๋ถํฐ Map ์ ์ฅ์์ Key(๊ฐ์ฒด์ด๋ฆ)์ ๋ค์ ธ์ ๊ฐ์ ๊ฑธ ์ฐพ๋๋ค.
์ค๋ฌด์์๋ ์ ์๊ฐ ๋ ๋ง์ด ์ฐ์ธ๋ค. ํด๋์ค ํ์ ์ ์ ๋ฐ๋์ง ์์ง๋ง, ๊ฐ์ฒด์ด๋ฆ์ ๋ณ๋์ฑ์ด ์๋์ ์ผ๋ก ํฌ๊ธฐ ๋๋ฌธ์ด๋ค.
3. ์ค์ค๋ก ํด๋ณด๊ธฐ
์์ ํด์์ ํ๋ฉฐ ์ ๊ณผ์ ๋ด๊ฐ ๋ค ํด๋ณด์๋ค .