<๊ฐ์>
DI๋ Dependency Injection์ผ๋ก์ ์์กด์ฑ ์ฃผ์ ์ ๋ปํ๋ค.
์ด๋ ์ด๋ค ํด๋์ค์ ๊ฐ์ฒด๋ฅผ new ์ฐ์ฐ์๋ฅผ ํตํด ์์ค์ฝ๋ ๋ด๋ถ์์ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ, ํด๋น ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ธ๋ถ์์ ๋ง๋ค์ด์ ์์ค์ฝ๋ ๋ด๋ถ๋ก ์ฃผ์ ์ํค๋ ๊ฒ์ ๋งํ๋ค.
์ด๋ ๊ฒ ํ๋ ์ด์ ๋ ๋ณ๊ฒฝ์ ์ ๋ฆฌํ ์ฝ๋๋ฅผ ๋ง๋ค์ด, ๊ฐ๋ฐ์๊ฐ ํ ์ ์๋ ์ค์๋ฅผ ์ค์ด๊ณ , test ํ์๋ ์ค์ด๊ธฐ ์ํด์ ์ด๋ค.
๊ทธ๋ผ ๋ณ๊ฒฝ์ ์ ๋ฆฌํ ์ฝ๋๋ผ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์์๋ณด๊ณ , ์ด๋ฅผ ์ด๋ป๊ฒ ํํํด์ผํ๋์ง ์์๋ณด์.
0. ๊ฐ์
class Car{}
class SportsCar extends Car {}
class Truck extends Car {}
SportsCar car = new SportsCar ();
// (๋ฐ๊พธ๋ ค๋ ๊ฒ)
Truck car = new Truck();
๋จผ์ SprotsCar์ Truck์ Car์ ์์ ํด๋์ค ์ด๊ณ , ์ฐ๋ฆฌ๊ฐ ํ๋ ค๋ ๊ฒ์ ๊ฐ์ฒด car๋ฅผ SportsCar์ ๊ฐ์ฒด์์ Truck์ ๊ฐ์ฒด๋ก ์์ ํ๋ ค๋ ๊ฒ์ด๋ค.
1. ๋ณ๊ฒฝ์ ์ ๋ฆฌํ ์ฝ๋ (๋คํ์ฑ ์ด์ฉ, Method ์ด์ฉ)
(1)๋คํ์ฑ ์ด์ฉ
** ๋คํ์ฑ์ด๋?
ํ๋์ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ Type์ ๊ฐ์ง ์ ์๋ ๊ฒ์ ๋งํ๋ค.
์๋ฐ์์๋ ๋ถ๋ชจ ํด๋์ค์ ์ฐธ์กฐ๋ณ์๋ก ์์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๊ฒ์ผ๋ก ์คํํ๋ค.
Car car = new SprotsCar();
Car car = new Truck();
๋คํ์ฑ์ ์ด์ฉํ๊ธฐ ์ ์๋ ๊ฐ์ฒด์ ์๋ฃํ๊ณผ new ๋ค์ ๋์ ํ ๋น ๋ถ๋ถ์ผ๋ก ๊ณ ์ณํ ๊ณณ์ด 2 ๊ตฐ๋ฐ ์์ง๋ง,
๋คํ์ฑ์ ์ด์ฉํ๋ฉด, ๋์ ํ ๋น ๋ถ๋ถ๋ง ๊ณ ์น๋ฉด ๋์ด์ ์์ ๋ถ๋ถ์ด ๋ง์ด ์ค์๋ค.
ํ์ง๋ง Truck์ผ๋ก ์ ์ธ์ ์ฌ ์์ ํด์ผํ๋ ๊ฐ์ฒด๊ฐ N ๊ฐ ์์ ๊ฒฝ์ฐ, N๋ฒ์ ๊ฐ์ฒด ์ ์ธ ์์ ์ด ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
(2)Method ์ด์ฉ (๊ธฐ๋ฅ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌ)
Method์ด์ฉ์ ๋คํ์ฑ์ ์ด์ฉํ ๊ฒฝ์ฐ์ ๋จ์ ์ ๋ณด์ํ ์ ์๋ค.
๊ธฐ๋ฅ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌํ๋ฏ๋ก์ ๊ทธ๋ ๋ค.
๊ธฐ๋ฅ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌ๋ ๋์ ํ ๋นํ๋ ๋ถ๋ถ(๊ธฐ๋ฅ)๊ณผ ์ ์ธํ๋ ๋ถ๋ถ(์ฌ์ฉ)์ ๋๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
Car car = getCar();
// (์์ ์ )
static Car getCar() {
return new SportsCar();
}
// (์์ ํ)
static Car getCar(){
return new Truck();
}
์ด๋ ๊ฒ ๋ง๋ค๋ฉด Truck์ผ๋ก ์ฌ์์ ํด์ผํ๋ ๊ฐ์ฒด๊ฐ N ๊ฐ ์๋๋ผ๋ ์ ์ธ๋ถ๋ฅผ ๊ณ ์น ํ์๊ฐ ์๋ค.
ํจ์์ return ๋ถ๋ถ์ ํ ์ค๋ง ๊ณ ์น๋ฉด ๋์ ๋ณ๊ฒฝ์ ๋ ์ ๋ฆฌํ๋ค.
2. DI์ ์๋ฆฌ๋ฅผ ํ๋ด๋ด์ ๋ง๋ค์ด๋ณด๊ธฐ
์์ Method ์๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ๋ ๋ณ๊ฒฝ์ ์ ๋ฆฌํ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค.
Car car = getCar();
static Car getCar() throws Exception {
//Properties๋ <K,V>๋ฅผ ๊ฐ๊ฐ <String, String>์ผ๋ก๋ง ๋ฐ๋ Map์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค.
Properties p = new Properties();
// ํ์ผ์ ๋ด์ฉ ์ฝ์ด์์ Properties์ Key Value ํ์์ผ๋ก ์ ์ฅ
p.load(new FileReader("config.txt"));
// ํด๋น ๊ฒฝ๋ก์ฃผ์์ ์๋ ํด๋์ค์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ด์ Class ๊ฐ์ฒด clazz ์์ฑ
Class clazz = Class.forName(p.getProperty("car"));
// .newInstance()๋ clazz์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด Car์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , Object Type์ผ๋ก ๋ฐํ
return (Car)clazz.newInstance();
}
Properties ํด๋์ค๋ Map์ด๋ ๊ฑฐ์ ๋๊ฐ๋ค.
Properties ํด๋์ค๋ ๊ฐ์ Key = Value ํ์์ผ๋ก ๋ฐ๋๋ค.
๋ค๋ง ๋ค๋ฅธ ์ ์ Map์ <Key, Value> ์์ ๊ฐ๊ฐ Object๋ก ๋ฐ์ง๋ง, Properties๋ <String, String>์ผ๋ก ๋ฐ๋๋ค.
DI์ ์ข์ ์ .
๋งค์๋ ์ด์ฉ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ธธ ๊ฒฝ์ฐ, ๋งค์๋ ๋ด๋ถ๋ฅผ ์์ ํด์ค์ผ ํ๋ค.
DI๋ ์ด๋ณด๋ค ๋ ๋ณ๊ฒฝ์ ์ ๋ฆฌํ๋ค.
๊ทธ ์ด์ ๋ DI๋ ์์ ์ฌํญ์ด ์๊ธธ ๊ฒฝ์ฐ ๋ณ๊ฒฝํด์ผ ํ๋ ๋ด์ฉ์ด ์์ค์ฝ๋ ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ด๋ค!
๊ทธ๋์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ฒจ๋ ์์ค ์ฝ๋๋ฅผ ๋ฐ๊ฟ ํ์๊ฐ ์๊ณ , config.txt ๊ฐ์ด ๋ถ๋ฌ์ค๋ ๋ฌธ์์ ๋ด์ฉ์ ๋ฐ๊พธ๋ฉด ๋๋ค.
์์ค ์ฝ๋ ์์ฒด๋ฅผ ์ ๊ฑด๋๋ ค๋ ๋๋ค๋ ๊ฒ์ ์์ ์๋ง๋ค test๋ฅผ ํ ํ์๊ฐ ์๊ณ , ๋ณ๊ฒฝํ๋ฉฐ ํ ์ ์๋ ๊ฐ๋ฐ์์ ์ค์๋ฅผ ์ต์ํ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
** ์ฌํ **
์์ ์์ค์ฝ๋๋ getCar ๋งค์๋๊ฐ ์ค๋ก์ง Car์ ๊ฐ์ฒด ์ ์ธ์์๋ง ์ฌ์ฉํ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
๋ง์ฝ ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด ์ ์ธ ์์๋ ์์ ๊ฐ์ด ๋ณ๊ฒฝ์ ์ ๋ฆฌํ ์ฝ๋๋ฅผ ์ฐ๋ ค๋ฉด ํ๋ ๋ ๋ง๋ค์ด์ผ ํ๋ค.
์ด๋ฅผ ๋ณด์ํ ๊ฒ์ด ์ฌํ์ ๋ด์ฉ์ด๋ค.
static Object getObject(String key) throws Exception {
// <String, String> ๋ง ๋๋ map, Properties ๊ฐ์ฒด ์์ฑ
Properties p = new Properties();
// config.txt์ ๋ด์ฉ ์ฝ์ด์ p์ <K,V>์์ ๋ฃ๊ธฐ.
// config.txt ๋ํ K,V ํํ๋ก ์ ํ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์๋ค. config.txt์ K๋ ๊ฐ์ฒด ์ด๋ฆ, V๋ ํด๋น ๊ฐ์ฒด์ ํด๋์ค์ ๊ฒฝ๋ก ์ฃผ์
p.load(new FileReader("config.txt"));
// ์ด๋ค key ๊ฐ์ ๋์ํ๋ value๋ ํด๋์ค์ ๊ฒฝ๋ก ์ฃผ์์.
// Class ํด๋์ค์ forName ๋งค์๋๋ ์ด๋ค ํด๋์ค์ ์ ์ฒด ์ด๋ฆ(๊ฒฝ๋ก ์ฃผ์.ํด๋์ค์ด๋ฆ)์ ์ธ์๋ก ๋ฐ์,
// ๊ทธ ํด๋์ค์ class ๊ฐ์ฒด (๋ฉํ ๋ฐ์ดํฐ)๋ฅผ ๋ฐํํจ.
Class clazz = Class.forName(p.getProperty(key));
// ๋ฉํ๋ฐ์ดํฐ(์ค๊ณ๋)๋ฅผ ํตํด ์ง์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฐํ
return clazz.newInstance();
}
์์ ๋งค์๋๋ ๊ฐ์ฒด ์ ์ธ ์ ์ ์ธํ๋ ค๋ ํด๋์ค๊ฐ ๋ฌด์์ธ์ง ์ธ์๋ก ๋ฐ๊ฒ๋ ํ์๋ค.
์ด๋ฅผ forName์ ๊ฒฝ๋ก ์ด๋ฆ ์ฐพ์ ๋ ์ฌ์ฉํ์ฌ ๊ทธ์ ํด๋นํ๋ Class ํด๋์ค, ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋์๋ค.
์ด๋ฐ ์์ผ๋ก ์ฝ๋๋ฅผ ๋ฐ๊พธ๋ฉด, ์ด๋ค ํด๋์ค๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์๊ฐ ์๋ค.
์ฌ๊ธฐ์ ๋ณด๋ฉด ๋ฐํ ๊ฐ์ด object์ธ๋ฐ, return์๋ ์ด๋ ํ ํ ๋ณํ๋ ์ด๋ฃจ์ด์ ธ ์์ง ์๋ค.
public static void main(String[] args) throws Exception {
// ๊ฐ์ฒด๋ฅผ ์์ฑ ํ๋๋ฐ getObject๋ผ๋ ๋งค์๋ค๋ฅด ์ด์ฉ
Car car = (Car)getObject("car");
Engine engine = (Engine)getObject("engine");
// ๊ฐ์ฒด๊ฐ ์ ๋๋ก ์์ฑ ๋์๋์ง ํ์ธ
System.out.println("car = " + car);
System.out.println("engine = " + engine);
}
๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค. ๋งค์๋๋ก ๋ค์ด์ค๋ ๊ฐ๋ง๋ค ํ์ ์ด ์ฒ์ฐจ ๋ง๋ณ์ด๋ผ ๋งค์๋ ๋ด์์ ํ ๋ณํ ์ํค๊ธฐ๊ฐ ์ด๋ ต๋ค.
๋ฐ๋ผ์ ์ ์ธ๋ถ์์ ํ๋ณํ์ ํด์ค๋ค.
3. ์ค์ค๋ก ํด๋ณด๊ธฐ
package MyWork;
import java.io.FileReader;
import java.util.Properties;
class Lunch {}
class KoreanFood extends Lunch {}
class JapanFood extends Lunch {}
public class mainWork {
public static void main(String[] args) throws Exception{
Lunch today = (Lunch) getObject("KR");
Lunch yesterday = (Lunch) getObject("JPN");
System.out.println("today = " + today);
System.out.println("yesterday = " + yesterday);
}
static Object getObject (String key) throws Exception{
Properties p = new Properties();
p.load(new FileReader("config.txt"));
Class clazz = Class.forName(p.getProperty(key));
return clazz.newInstance();
}
}
config.txt ์ ์
KR = MyWork.KoreanFood
JPN = MyWork.JapanFood
๊ฒฝ๋ก๊ฐ ๋ถ์ ํํ๋ฉด ํด๋์ค์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ป์ด์ฌ ์๊ฐ ์์ด์ ์๋ฌ๊ฐ ๋๋ค.