#1 ์ด์ ๊ธ
[Android] Dagger2 - @Provides
#1 ์ด์ ๊ธ [Android] Dagger2 - ๊ธฐ์ด#1 ์ด์ ๊ธ ์์กด์ฑ ์ฃผ์ (Dependency Injection)#1 ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ด๋?#1-1 Dependent์ Dependencyfun main() { val car = Car() car.startCar() } class Car { private val engine = Engine
kenel.tistory.com
์ ๊ฒ์๊ธ์ ์์ฑ๋ ์ฑ์ ์ผ๋ถ ์์ ํด์, @Provides ๋๋ @Module์ด ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๊ฒ ๋ง๋ค์ด๋ณธ๋ค.
Dagger ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๋ ํ๋ก์ ํธ์์ @Provides ๋๋ @Module์ ์ธ์๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด์๋ ๋จผ์ dagger์ ์ํด ์์ฑ๋๋ ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณผ ํ์๊ฐ ์๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์.
#2 Component ํด๋์ค์ ๊ทธ ๋น๋ ํด๋์ค
#2-1 dagger์์์ ์์กด์ฑ ์ฃผ์ ์ค๋น๋ ์ปดํ์ผ ๋ ์ด๋ค์ง๋ค
...
class MainActivity : AppCompatActivity() {
override fun onCreate(savedState: Bundle?) {
super.onCreate(savedState)
setContentView(R.layout.activity_main)
/*
val crankshaft = Crankshaft()
val cylinder = Cylinder()
val piston = Piston(crankshaft, cylinder)
val engine = Engine(piston)
val airbag = Airbag()
val battery = Battery()
val car = Car(engine, airbag, battery)
*/
val car = DaggerCarComponent.create().getCar()
car.startCar()
}
}
์๋์ ์์กด์ฑ ์ฃผ์ (์ฃผ์ ์ฒ๋ฆฌ๋ ์ฝ๋)๊ณผ dagger์ ์์กด์ฑ ์ฃผ์ ์ ์ฐจ์ด๋ '์์กด์ฑ ์ฃผ์ ์ ์์์ฑ'๋ฟ๋ง์ด ์๋๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ก, Dependency๋ค์ ๋ชจ์์ ์ต์ข ์ ์ธ Dependent๋ฅผ ๋ง๋๋ ๊ฒ์ฆ ๊ณผ์ ์ด ๋ฐํ์์ด ์๋ ์ปดํ์ผ ์์ ์ ์ด๋ค์ง๋ค๋ ๊ฒ์ด๋ค. ์ฃผ์ ์ฒ๋ฆฌ๋ ์ฝ๋์์ Car ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ Dependency๋ค์ ์ธ์คํด์ค๋ค์ ๋จ๊ณ์ ์ผ๋ก ์์ฑํด๋๊ฐ๊ณ ์๋ค. ์ด ๊ณผ์ ์ ๋ฐํ์์์ ์งํ๋๋ค.
๋ฐ๋ฉด, dagger์์๋ ์ด๋ค๊ฐ? ์ฃผ์ ์ฒ๋ฆฌ๋ ์ฝ๋ ๋ถ๋ถ์ ๊ณผ์ ์ ์ปดํ์ผ ์์ ์ ๊ฒ์ฆ ๋ฐ ์ ์ฅํ๊ณ , ์ต์ข Dependent์ธ Car ์ธ์คํด์ค๋ฅผ getCar() ๋ฉ์๋๋ฅผ ํตํด ๋ฐ๋ก ์ป์ด๋ด๊ณ ์๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์.
#2-2 ์์ฑ๋ @Component ํด๋์ค ์ดํด๋ณด๊ธฐ (DaggerCarComponent.java)
// Generated by Dagger (https://dagger.dev).
package com.example.parameter;
import dagger.internal.DaggerGenerated;
import dagger.internal.Preconditions;
@DaggerGenerated
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast"
})
public final class DaggerCarComponent {
private DaggerCarComponent() {
}
public static Builder builder() {
return new Builder();
}
public static CarComponent create() {
return new Builder().build();
}
public static final class Builder {
private MyModule myModule;
private Builder() {
}
public Builder myModule(MyModule myModule) {
this.myModule = Preconditions.checkNotNull(myModule);
return this;
}
public CarComponent build() {
if (myModule == null) {
this.myModule = new MyModule();
}
return new CarComponentImpl(myModule);
}
}
private static final class CarComponentImpl implements CarComponent {
private final MyModule myModule;
private final CarComponentImpl carComponentImpl = this;
private CarComponentImpl(MyModule myModuleParam) {
this.myModule = myModuleParam;
}
private Piston piston() {
return new Piston(new Crankshaft(), new Cylinder());
}
private Engine engine() {
return new Engine(piston());
}
private Airbag airbag() {
return new Airbag(MyModule_ProvidesAirbagManufacturerFactory.providesAirbagManufacturer(myModule));
}
private Battery battery() {
return new Battery(MyModule_ProvidesBatteryManufacturerFactory.providesBatteryManufacturer(myModule));
}
@Override
public Car getCar() {
return new Car(engine(), airbag(), battery());
}
}
}
์ด ํด๋์ค๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฑํ @Component ์ธํฐํ์ด์ค์ ๊ธฐ๋ฐํด ์ปดํ์ผ ์์ ์ dagger๊ฐ ์๋์ผ๋ก ์์ฑํ @Component ํด๋์ค๋ค. dagger๋ ์ปดํ์ผ ์์ ์ ๋ง๋จ Dependency๊น์ง์ ๋ชจ๋ ์์กด์ฑ ์ฃผ์ ์ ๊ฒ์ฆํ๊ณ , ๊ทธ ์ฃผ์ ๊ฒฐ๊ณผ๋ฅผ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ํด๋ฆญ์ผ๋ก ์ป์ ์ ์๋ ๋ฉ์๋(getCar())๋ฅผ ์์ฑํ๋ค. ์ ์ฝ๋์์ ํด๋น ๋ฉ์๋๊ฐ ์ํ ํด๋์ค์ธ CarComponentImpl์ ๊ทธ ๋น๋ ํด๋์ค(์ดํ Component Builder)๋ฅผ ํ์ธํ ์ ์๋ค.
#2-3 ๋งค๊ฐ๋ณ์ ํ ๋น ํ์ด๋ฐ
๋ง๋จ Dependency์์ ์์ํด ์ฐจ๊ณก์ฐจ๊ณก ๋จ๊ณ๋ฅผ ๋ฐ์ ์ฌ๋ผ๊ฐ๋ ์๋์ ์์กด์ฑ ์ฃผ์ ์ ๋ฐํ์์ ์ด๋ฐ์ ๋ฐ ๋งค๊ฐ๋ณ์๋ฅผ ํ๋ก๊ทธ๋๋จธ ์ ๋ง๋๋ก ์ ์ฝ๊ฒ ํ ๋นํ ์ ์๋ค. ๋ฐ๋ฉด, dagger์ ๊ฒฝ์ฐ๋ ๊ตฌ์กฐ์ ๊ทธ๋ด ์ ์๋ค. ComponentImpl ํด๋์ค๋ ์ปดํ์ผ ์์ ์ ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์, ์ฐ๋ฆฌ๋ ComponentImpl ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋น๋ ํด๋์ค๋ฅผ ํตํด ๋งค๊ฐ๋ณ์๋ฅผ ์ฝ์ ํ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ก ๋งค๊ฐ๋ณ์๊ฐ ์ฝ์ ๋ ๋ฒ์ ์ ComponentImpl์ด ์ป์ด์ง๋ ๊ฑธ ๋ชฉํ๋ก ๋์ด์ผ ํ๋ค.
#3 ์ฝ๋ ์์ - @Module ํด๋์ค์ ์์ฑ์ ๋งค๊ฐ๋ณ์๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ
#3-1 MyModule.kt
...
@Module
class MyModule(private val countryOfManufacture: String) {
@Provides
@Named("Airbag")
fun providesAirbagManufacturer(): String {
return "KENEL" + " (MADE IN ${countryOfManufacture})"
}
@Provides
@Named("Battery")
fun providesBatteryManufacturer(): String {
return "TISTORY" + " (MADE IN ${countryOfManufacture})"
}
}
MyModule ํด๋์ค์ ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๊ณ , init { ... }์ ๋งค๊ฐ๋ณ์ ํ์ธ์ฉ Log.i( ... )๋ ๋ฃ์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ [Build] - [Rebuild Project]ํ๋ค. ์๋ฌ๊ฐ ๋๋ค๋ฉด, MainActivity์์ ์ฃผ์ ์๋์ชฝ ์ฝ๋๋ฅผ ์ง์ฐ๊ณ ๋ค์ ์๋ํด๋ณธ๋ค.
#3-2 @Component ์ธํฐํ์ด์ค
// package com.example.parameter
import dagger.BindsInstance
import dagger.Component
import javax.inject.Named
@Component(modules = [MyModule::class])
interface CarComponent {
fun getCar(): Car
@Component.Builder
interface Builder {
fun setMyModule(myModule: MyModule): Builder
fun build(): CarComponent
}
}
๋น๋ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค. ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง๋ฉด, dagger๊ฐ ์์์ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
#3-3 ์์ฑ๋ @Component ํด๋์ค ์ดํด๋ณด๊ธฐ (DaggerCarComponent.java)
// Generated by Dagger (https://dagger.dev).
package com.example.parameter;
import dagger.internal.DaggerGenerated;
import dagger.internal.Preconditions;
@DaggerGenerated
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast"
})
public final class DaggerCarComponent {
private DaggerCarComponent() {
}
public static CarComponent.Builder builder() {
return new Builder();
}
private static final class Builder implements CarComponent.Builder {
private MyModule myModule;
@Override
public Builder setMyModule(MyModule myModule) {
this.myModule = Preconditions.checkNotNull(myModule);
return this;
}
@Override
public CarComponent build() {
Preconditions.checkBuilderRequirement(myModule, MyModule.class);
return new CarComponentImpl(myModule);
}
}
private static final class CarComponentImpl implements CarComponent {
private final MyModule myModule;
private final CarComponentImpl carComponentImpl = this;
private CarComponentImpl(MyModule myModuleParam) {
this.myModule = myModuleParam;
}
private Piston piston() {
return new Piston(new Crankshaft(), new Cylinder());
}
private Engine engine() {
return new Engine(piston());
}
private Airbag airbag() {
return new Airbag(MyModule_ProvidesAirbagManufacturerFactory.providesAirbagManufacturer(myModule));
}
private Battery battery() {
return new Battery(MyModule_ProvidesBatteryManufacturerFactory.providesBatteryManufacturer(myModule));
}
@Override
public Car getCar() {
return new Car(engine(), airbag(), battery());
}
}
}
Builder().build()๋ฅผ ๋ฐํํ๋ #2-2์ create() ๋ฉ์๋๊ฐ ์ฌ๋ผ์ก๋ค. ๋, #2-2์๋ myModule์ ์ธ์คํด์ค๊ฐ null์ด๋ฉด ์๋์ผ๋ก myModule์ ์ธ์คํด์ค๋ฅผ ๋ฃ๋ ๋์์ด ์ ์๋์ด์์๋๋ฐ ์ด๊ฒ์ด ์ญ์ ๋์๋ค. ๊ฒ๋ค๊ฐ #3-2์์ ๋ง๋ค์๋ ์ถ์ ๋ฉ์๋์ธ setMyModule()์ ๊ตฌํ ๋ฉ์๋๊ฐ myModule์ด null์ธ์ง๋ฅผ checkNotNull()์ด๋ผ๋ ๋ฉ์๋๋ก ๊ฒ์ฌํ๊ณ ์๋ค. ์ด ๋ฉ์๋๋ ์ธ์๋ก ๋ฐ์ ๊ฐ์ฒด๊ฐ null์ด๋ฉด java.lang.NullPointerException ์๋ฌ๋ฅผ ์ผ์ผํจ๋ค. ํ๋ง๋๋ก, myModule์ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐ๋์ ๋ช ์ํ์ฌ Builder ํด๋์ค์๊ฒ ๋๊ฒจ์ฃผ๋๋ก ์ ๋ํ๊ณ ์๋ค. ์ด์ MainActivity์์ ์ ๋๋ฐ์(?)๋๋ก ์ฝ๋๋ฅผ ์ง๋ณด๊ฒ ๋ค.
#3-4 MainActivity.kt
...
class MainActivity : AppCompatActivity() {
override fun onCreate(savedState: Bundle?) {
super.onCreate(savedState)
setContentView(R.layout.activity_main)
/*
...
*/
val car = DaggerCarComponent
.builder()
.setMyModule(MyModule("KOREA"))
.build()
.getCar()
car.startCar()
}
}
#3-5 ์๋ ํ์ธ (๋ก๊ทธ ๋ฉ์์ง)
Crankshaft is ready
Cylinder is ready
Piston is ready
Engine is ready
Airbag is ready
Airbag made by KENEL (MADE IN KOREA)
Battery is ready
Battery made by TISTORY (MADE IN KOREA)
Car is ready
#4 ์ฝ๋ ์์ - @Provides ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ
#4-1 MyModule.kt
...
@Module
class MyModule {
@Provides
@Named("Airbag")
fun providesAirbagManufacturer(@Named("material") material: String): String {
return "KENEL" + " (์ฌ์ง: ${material})"
}
@Provides
@Named("Battery")
fun providesBatteryManufacturer(@Named("type") type: String): String {
return "TISTORY" + " (์ข
๋ฅ: ${type})"
}
}
์ด๋ฒ์ @Provides ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ค. ์์ ํ [Build] - [Rebuild Project]ํ๋ค. ์๋ฌ๊ฐ ๋๋ค๋ฉด, MainActivity์์ ์ฃผ์ ์๋์ชฝ ์ฝ๋๋ฅผ ์ง์ฐ๊ณ ๋ค์ ์๋ํด๋ณธ๋ค.
#4-2 @Component ์ธํฐํ์ด์ค
// package com.example.parameter
import dagger.BindsInstance
import dagger.Component
import javax.inject.Named
@Component(modules = [MyModule::class])
interface CarComponent {
fun getCar(): Car
@Component.Builder
interface Builder {
@BindsInstance
fun setMaterialOfProvides(@Named("material") country: String): Builder
@BindsInstance
fun setTypeOfProvides(@Named("type") type: String): Builder
fun build(): CarComponent
}
}
@Named๊ฐ ์ฐ์ธ ์ด์ ๋, MyModule์ ๋ ํจ์์ ์์ฑ์ ์ธ์์ ์ข ๋ฅ์ ๊ฐฏ์๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ฝ ๋ ๋ค String์ ์ธ์๋ก ๋ฐ๋๊ฒ ์๋๋ผ, ์ด๋ ํ ์ชฝ์ String์ด๊ณ ๋ฐ๋์ชฝ์ Int์๋ค๋ฉด @Named๊ฐ ์์ด๋ ์ ์์๋ํ๋ค. dagger ์ ์ฅ์์ ์ด๋ @BindInstance ๋ฉ์๋๊ฐ ์ด๋ @Provide ๋ฉ์๋์ ์ฐ๊ฒฐ๋๋์ง ๋ช ํํ ํ๋จํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋, #3-2์์์๋ ๋ฌ๋ฆฌ ์ถ์ ๋ฉ์๋์ @BindInstance ์ด๋ ธํ ์ด์ ์ด ๋ถ์๋ค. @BindsInstance๋ Component Builder์ ์ํด ๋ง๋ค์ด์ง๋ ComponentImpl๋ฅผ ์์ฑํ๊ธฐ ์ํด ํ์ํ ํน์ ์ธ์คํด์ค, ๋ฐ๋ก ๊ทธ ํน์ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋ ๋ฉ์๋์ ๋ถ๋๋ค. ๊ทธ๋ ๋ค๋ฉด, ์ด์งธ์ #3-2์์๋ @BindInstance๊ฐ ์์๋๊ฐ? MyModule ๋ํ ComponentImpl๋ฅผ ์์ฑํ ๋ ํ์ํ์ง ์์๊ฐ?
@Module์ ์ญํ ์ ์ฒซ์งธ๋ก๋ @Provides ๋ฉ์๋๋ฅผ ๋ด๋ ์ฉ๊ธฐ๋ค. ๋์งธ๋ก๋ @Component ์ด๋ ธํ ์ด์ ์ modules ์์ฑ์ ๋ช ์์ ์ผ๋ก ๋ฑ๋ก๋จ์ผ๋ก์จ, Dagger์๊ฒ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ ๊ณตํ๋์ง (@Provides ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๋ฐ์ดํฐ ํ์ ๋ค์ ํตํด) ์๋ฆฌ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ MyModule ํด๋์ค๊ฐ ComponentImpl์ ์์ฑํ๋ ๋ฐ ํ์ํ ๊ฒ์ ๋ถ๋ช ๋ง๋ค. ํ์ง๋ง #3-2์ setMyModule()์ ComponentImpl์๊ฒ(= ์์กด์ฑ ๊ทธ๋ํ ์์์) ์ง์ ์ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์๋, MyModule์ ๋ฉค๋ฒ ๋ฉ์๋์๊ฒ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ @BindInstance๊ฐ ์ฌ์ฉ๋์ง ์์ ๊ฒ์ด๋ค.
#4-3 ์์ฑ๋ @Component ํด๋์ค ์ดํด๋ณด๊ธฐ (DaggerCarComponent.java)
// Generated by Dagger (https://dagger.dev).
package com.example.parameter;
import dagger.internal.DaggerGenerated;
import dagger.internal.Preconditions;
@DaggerGenerated
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava",
"cast"
})
public final class DaggerCarComponent {
private DaggerCarComponent() {
}
public static CarComponent.Builder builder() {
return new Builder();
}
private static final class Builder implements CarComponent.Builder {
private String setMaterialOfProvides;
private String setTypeOfProvides;
@Override
public Builder setMaterialOfProvides(String country) {
this.setMaterialOfProvides = Preconditions.checkNotNull(country);
return this;
}
@Override
public Builder setTypeOfProvides(String type) {
this.setTypeOfProvides = Preconditions.checkNotNull(type);
return this;
}
@Override
public CarComponent build() {
Preconditions.checkBuilderRequirement(setMaterialOfProvides, String.class);
Preconditions.checkBuilderRequirement(setTypeOfProvides, String.class);
return new CarComponentImpl(new MyModule(), setMaterialOfProvides, setTypeOfProvides);
}
}
private static final class CarComponentImpl implements CarComponent {
private final MyModule myModule;
private final String setMaterialOfProvides;
private final String setTypeOfProvides;
private final CarComponentImpl carComponentImpl = this;
private CarComponentImpl(MyModule myModuleParam, String setMaterialOfProvidesParam,
String setTypeOfProvidesParam) {
this.myModule = myModuleParam;
this.setMaterialOfProvides = setMaterialOfProvidesParam;
this.setTypeOfProvides = setTypeOfProvidesParam;
}
private Piston piston() {
return new Piston(new Crankshaft(), new Cylinder());
}
private Engine engine() {
return new Engine(piston());
}
private String namedString() {
return MyModule_ProvidesAirbagManufacturerFactory.providesAirbagManufacturer(myModule, setMaterialOfProvides);
}
private Airbag airbag() {
return new Airbag(namedString());
}
private String namedString2() {
return MyModule_ProvidesBatteryManufacturerFactory.providesBatteryManufacturer(myModule, setTypeOfProvides);
}
private Battery battery() {
return new Battery(namedString2());
}
@Override
public Car getCar() {
return new Car(engine(), airbag(), battery());
}
}
}
#3-3๊ณผ ๊ฐ์ ๋งฅ๋ฝ์ผ๋ก #4-2์์ ๋ง๋ setMaterialOfProvides() ๋ฐ setTypeOfProvides()๊ฐ ๊ตฌํ๋ ๋ชจ์ต์ด๋ค.
#4-4 MainActivity.kt ์์
...
class MainActivity : AppCompatActivity() {
override fun onCreate(savedState: Bundle?) {
super.onCreate(savedState)
setContentView(R.layout.activity_main)
/*
...
*/
val car = DaggerCarComponent
.builder()
.setMaterialOfProvides("๋์ผ๋ก ")
.setTypeOfProvides("๋ฆฌํฌ์ด์จ")
.build()
.getCar()
car.startCar()
}
}
#4-5 ์๋ ํ์ธ (๋ก๊ทธ ๋ฉ์์ง)
Crankshaft is ready
Cylinder is ready
Piston is ready
Engine is ready
Airbag is ready
Airbag made by KENEL (์ฌ์ง: ๋์ผ๋ก )
Battery is ready
Battery made by TISTORY (์ข ๋ฅ: ๋ฆฌํฌ์ด์จ)
Car is ready
#5 ์ฝ๋ ์์ - @Module๊ณผ @Provides ๋ ๋ค ๋งค๊ฐ๋ณ์๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ
#3๊ณผ #4์ ํฉ์งํฉ์ผ๋ก ์ฝ๋๋ฅผ ์์ ํ๋ฉด ๋๋ค. ๋ณธ ๊ฒ์๊ธ์์ ์๋ตํ์ง๋ง, #3๊ณผ #4๊ฐ ํฉ์ณ์ง ์ฝ๋๋ #7์ ์ฌ๋ ค๋์๋ค.
#5-1 ์๋ ํ์ธ (๋ก๊ทธ ๋ฉ์์ง)
Crankshaft is ready
Cylinder is ready
Piston is ready
Engine is ready
Airbag is ready
Airbag made by KENEL (์ฌ์ง: ๋์ผ๋ก ) (MADE IN KOREA)
Battery is ready Battery made by TISTORY (์ข ๋ฅ: ๋ฆฌํฌ์ด์จ) (MADE IN KOREA)
Car is ready
#6 ์์ฝ
dagger๋ฅผ ์ธ ๋, ๋งค๊ฐ๋ณ์๋ฅผ Component Builder์๊ฒ ์ ๋ฌํ๋ค.
#7 ์์ฑ๋ ์ฑ
android-practice/dagger2/Parameter at master ยท Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Dagger2 - Activity์ Dependency ์ฃผ์ (0) | 2024.06.25 |
---|---|
[Android] Dagger2 - ์ธํฐํ์ด์ค ๊ตฌํ์ฒด ์ฃผ์ (@Binds) (0) | 2024.06.25 |
[Android] Dagger2 - @Provides (0) | 2024.06.24 |
[Android] Dagger2 - ๊ธฐ์ด (0) | 2024.06.24 |
[Android] WorkManager - ๋ณ๋ ฌ Chaining (0) | 2024.06.17 |