-์์กด์ฑ : ๊ฐ์ฒด์งํฅ์์ ๋ ํด๋์ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๋งํ๋๊ฒ์ผ๋ก ์ผ๋ฐ์ ์ผ๋ก ๋ ์ค ํ๋๊ฐ๋ค๋ฅธ ํ๋๋ฅผ ํ์๋ก ํ๋ค.
-์ฃผ์
: ์ธ๋ถ๋ก๋ถํฐ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ๋ ๊ฒ์ ์๋ฏธํ๋ค.
-์์กด์ฑ ์ฃผ์
: ์์กด ๊ด๊ณ์ ์๋ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ธ๋ถ๋ก๋ถํฐ ์์ฑํ์ฌ ์ฃผ์
๋ฐ๋๋ค.
public class Computer{
private CPU cpu;
public void setCPU(CPU cpu){
this.cpu = cpu;
}
}
๋ค์ํ๋ฒ ์ปดํจํฐ์ cpu์ ๊ด๊ณ๋ฅผ ํ์ธํด ๋ณธ๋ค. Computer ๋ CPU๋ผ๋ ํ๊ฐ์ง ํ์
์ ์์กดํ๋ค. ํ์ง๋ง ์ฌ์ฉ์๋ ๋ค์ํ CPU๋ฅผ ์ฌ์ฉํ๋๊ฒ์ ์ํ ์ ์๋ค. ๋ฐ๋ผ์ CPU๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋๋ค๋ฉด Computer ํด๋์ค์ ์์ฑ์๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
-> CPU์ ๋ณ๊ฒฝ์ผ๋ก ๋ค๋ฅธ ์์กด ๊ด๊ณ๊น์ง ๋ณ๊ฒฝ์ฌํญ์ด ์ ์ด๋๋ค.
public class Computer{
private A_CPU cpu; //๋ณ๊ฒฝ๋จ
private Computer(){
cpu = new A_CPU;//๋ณ๊ฒฝ๋จ
}
}
CPU์ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ค๋ฅธ ์์กด๊ด๊ณ๊ฐ ๋ณ๊ฒฝ๋๋๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํ๊ฒ์ CPU๋ฅผ ์ถ์ํ ํ๋ ๋ฐฉ๋ฒ์ด๋ค
public interface CPU{...}
public class A_CPU implements CPU{...}
public class Computer{
private CPU cpu;
public Computer(){
cpu = new A_CPU();
//cpu = new I_CPU();
}
}
์ด๋ ํ ์ผ์ ์ํํ๋๋ก ๋ง๋ค์ด์ง ํ๋ ์์ํฌ์ ์ ์ด๊ถ์ ์์ํจ์ผ๋ก์จ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
public class Computer{
private CPU cpu;
public Computer(){}
public Computer(CPU cpu){
this.cpu;
}
public void setCPU(CPU cpu){
this.cpu = cpu;
}
}
public static void main(){
CPU cpu = new I_CPU;
Computer computer1 = new Computer(cpu);
//๋๋
Computer computer2 = new Computer();
computer2.setCPU(cpu);
}
๊ฐ์ ๋ ์ฝ๋์์๋ CPU ๊ฐ์ฒด์ ์์ฑ ๋ฐ ๊ด๋ฆฌ๋ฅผ ์ธ๋ถ์ ์์ํ๋ค. ์ด๋ฅผ ์ ์ด์ ์ญ์ ์ด๋ผ๊ณ ํ๋ค ์ด๋ฅผ ํตํด ๊ฒฐํฉ๋๋ฅผ ์ฝํ๊ฒ ๋ง๋ค์๊ณ Computer๋ CPU์ ๋ณ๊ฒฝ์ฌํญ์ ๋ํด ๋ด๋ถํ๋๋ ๋งค์๋ ๋งค๊ฐ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๋์๋ค.
์์กด์ฑ ์ฃผ์ ์ ์ฅ์
1) ์ฃผ์ ํ๋ ์ฝ๋๋ง ๋ฐ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ฌ์ ๋ฆฌํฉํ ๋ง์ด ์์ํ๋ค
2) ์ฃผ์ ์ ์ฌ์ฉํ๋ ๊ฒฐ๊ณผ๋ก stub๋ mock๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ ํ ์คํธ๋ฅผ ํ๊ธฐ๊ฐ ๋์ฑ ์ฌ์์ง๋ค.
3) ํด๋์ค๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋์จํ๊ฒ ํ๋ค.
์์กด์ฑ ์ฃผ์ ์ ๋จ์
1) ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๋๋ ๋ฒ๊ฑฐ๋กญ๋ค.
2) ์์กด์ฑ ์ฃผ์ ์ ๋์๊ณผ ๊ตฌ์ฑ์ ๋ถ๋ฆฌํด ์ฝ๋๋ฅผ ์ถ์ ํ๊ธฐ ์ด๋ ต๊ฒ ํ๊ณ ๊ฐ๋ ์ฑ์ ๋จ์ดํธ๋ฆด์ ์๋ค. ์ฆ ๊ฐ๋ฐ์๋ ๋ ๋ง์ ํ์ผ์ ์ฐธ์กฐํด์ผ ํ๋ค
3) ์ปดํ์ผ ํ์์ ์ ๋ ธํ ์ด์ ํ๋ก์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ์์ฑํ๊ธฐ์ ๋น๋์ ์๊ฐ์ด ์ข ๋ ์์๋๋ค.
Dagger 2๋ ์๋ฐ์ ์๋๋ก์ด๋๋ฅผ ์ํ ๊ฐ๋ ฅํ๊ณ ๋น ๋ฅธ ์์กด์ฑ ์ฃผ์ ํ๋ ์์ํฌ๋ค. ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ์ง ์๊ณ , ๋ฐํ์์ ๋ฐ์ดํธ ์ฝ๋๋ ์์ฑํ์ง ์๋ ๊ฒ์ด ํน์ง์ด๋ค. ์ปดํ์ผ ํ์์ ์ ๋ ธํ ์ด์ ํ๋ก์ธ์์ ์ํด ์์กด์ฑ ์ฃผ์ ๊ณผ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ์๋ฐ ์์ค ์ฝ๋๋ฅผ ์์ฑํ๋ค .
Dagger์ ์ฅ์
1) ์์ ๊ณต์ ์ ๋จ์ํ : ์ง์ ๋ ๋ฒ์์ ์๋ช ์ฃผ๊ธฐ ๋ด์์ ๋์ผ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋ค.
2) ๋ณต์กํ ์์กด์ฑ์ ๋จ์ํ๊ฒ ์ค์ : ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปค์ง์๋ก ๋ง์ ์์กด์ฑ์ ๊ฐ๋๋ฐ ์ด๋ฅผ ์ฝ๊ฒ ์ ์ดํด ์ค๋ค.
3) ์ ๋ํ ์คํธ๋ฅผ ์ฝ๊ฒ ๋์์ค๋ค.
4) ์๋ ์ฝ๋ ์์ฑ, ์์ฑ๋ ์ฝ๋๋ ๋ช ํํ๊ณ ๋๋ฒ๊น ์ด ๊ฐ๋ฅํ๋ค.
5) Dagger2๋ ๋๋ ํ ๋ฌธ์ ๊ฐ ์๋ค. : ๊ธฐ์กด์ dagger1 ์ ๋ฆฌํ๋ ์ ์ฌ์ฉ์ผ๋ก ๋ฐํ์์ ์ฑ๋ฅ ๋ฐ ๋๋ ํ์ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
6) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๊ธฐ๊ฐ ์๋ค.
์๋๋ก์ด๋ ์คํ๋์ค ํ๋ก์ ํธ์์ Dagger ๋ฅผ ์ ์ฉํ๋ ค๋ ๋ชจ๋์ build.gradle์ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
app/build.gradle
dependencies{
implementation 'com.google.dagger:dagger-android:2.27'
implementation 'com.google.dagger:dagger-android-support:2.27'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.27'
annotationProcessor 'com.google.dagger:dagger-compiler:2.27'
}
์ฝํ๋ฆฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์๋ annotationProcesor๋ฅผ kapt๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
์ต์ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ๊ถ์ฅํ๋ฉฐ 2020๋ 03์ 14์ผ ๊ธฐ์ค์ผ๋ก 2.27์ด ์ต์ ๋ฒ์ ์ด๋ค. dagger2 ์ ๋ํ ์ต์ ์ ๋ณด๋ฅผ ์ป์ผ๋ ค๋ฉด https://github.com/google/dagger ๋ฅผ ์ฐธ์กฐํ๋ค.
๋ง์ฝ ์๋๋ก์ด๋ ๋ฐ์ดํฐ ํ์ธ๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ javac์ ์ํด ์ค๋ฅ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค. ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๊ณผ dagger๋ฅผ ์ฌ์ฉํ๋ฉด dagger์ ๊ด๋ จ๋ ์ค๋ฅ๋ฐ์์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๋ํ ์ปดํ์ผ์ด ๋ฉ์ถ๊ณ ์ค๋ฅ ๋ฉ์์ง ๋ํ 100์ค์ด์ ์ถ๋ ฅ๋๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐ๋ก ์ค์ ํด์ผ ํ๋ค
android{
...
gradle.projectsEvaluated{
tasks.withType(JavaCompile){
options.compilerArgs << "-Xmaxerrs" << "500"
}
}
}