๐Ÿค—2.Dagger๋ฅผ ์ด์šฉํ•œ ์ฃผ์ž… ๊ธฐ๋ฒ• -2

Jamezz Devยท2020๋…„ 7์›” 11์ผ
0

android-Architecture

๋ชฉ๋ก ๋ณด๊ธฐ
3/8
post-thumbnail

๐Ÿ˜ฌ5. ์ฒซ ๋ฒˆ์งธ ์˜์กด์„ฑ ์ฃผ์ž… ๊ตฌํ˜„ํ•˜๊ธฐ

@Module
public class MyModule{
  @Provides
  String provideHelloWorld(){
 	return "Hello World";
  }
}

dagger๋Š” ์ปดํŒŒ์ผ ํƒ€์ž…์˜ ์˜์กด์„ฑ ์ฃผ์ž…์— ํ•„์š”ํ•œ ์• ๋…ธํ…Œ์ด์…˜์„ ์ฝ๊ณ  ์˜์กด์„ฑ ์ฃผ์ž…์— ํ•„์š”ํ•œ ํด๋ž˜์Šค ํŒŒ์ผ๋“ค์„ ์ƒ์„ฑํ•œ๋‹ค
Dagger๋Š” @Module๊ณผ @Provides ์• ๋…ธํ…Œ์ด์…˜์„ ์ฝ๊ณ  ์˜์กด์„ฑ ์ฃผ์ž…์— ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์„ ์ƒ์„ฑํ•œ๋‹ค.

@Module : ์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์— ๋ถ™์ธ๋‹ค.
@Provides : ์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ๋ถ™์ธ๋‹ค.

MyModule ํด๋ž˜์Šค ํ•˜๋‚˜๋งŒ์œผ๋กœ ๋ณ„๋„์˜ ํด๋ž˜์Šค ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ชจ๋“ˆ์„ ์ฐธ์กฐํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†๊ธฐ๋•Œ๋ฌธ์ด๋‹ค.

@Component(modules = MyModule.class)
public interface MyComponent{
    String getString();
    // ํ”„๋กœ๋น„์ „ ๋ฉ”์„œ๋“œ, ๋ฐ”์ธ๋“œ๋œ ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ ์˜์กด์„ฑ์„ ์ œ๊ณต
}

@Component๊ฐ€ ๋ถ™์€ MyComponent์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์—์„œ๋Š” Component๊ฐ€ ์ฐธ์กฐ๋œ ๋ชจ๋“ˆ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์˜์กด์„ฑ์„ ์ œ๊ณต๋ฐ›๋Š”๋‹ค.

๋ฐ”์ธ๋“œ๋œ ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ๋ฐ˜ํ™˜ํ˜•์„ ๊ฐ–๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Dagger๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— @Component๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ด๋•Œ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์€ 'Dagger'๋ผ๋Š” ์ ‘๋‘์–ด๊ฐ€ ๋ถ™๋Š”๋‹ค.
ex) MyComponent > DaggerMyComponent

public class ExampleUnitTest{
  @Test
  public void testHelloWorld(){
      MyComponent myComponent = DaggerMyComponent.create();
      System.out.println("result="+myComponent.getString());
  }
}

๐Ÿคง6. ๋ชจ๋“ˆ

๋ชจ๋“ˆ์€ ์ปดํฌ๋„ŒํŠธ์— ์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. @Module์„ ํด๋ž˜์Šค์— ๋ถ™์ด๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ชจ๋“ˆ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค.

๐Ÿค–ํ”„๋กœ๋ฐ”์ด๋”

๋ชจ๋“ˆ ํด๋ž˜์Šค ๋‚ด์— ์„ ์–ธ๋˜๋Š” ๋ฉ”์„œ๋“œ์—๋Š” @Provides ์• ๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋Š”๊ฒƒ์œผ๋กœ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ”์ธ๋“œ๋œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์ƒ์„ฑํ•œ๋‹ค

๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ํ˜•์„ ๋ณด๊ณ  ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์˜์กด์„ฑ์ด ๊ด€๋ฆฌ๋˜์–ด ์ค‘๋ณต๋˜๋Š” ํƒ€์ž…์ด ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ์กด์žฌํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

ex) ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ๋™์ผํ•œ String ๋ฐ˜ํ™˜ํ˜•์„ ๊ฐ–๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ 2๊ฐœ ์ด์ƒ ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์—๋Ÿฌ ๋ฐœ์ƒํ•œ๋‹ค.

@Module
class DuplicationModule{
    @Provides
    String provideHelloWorld(){
      return "hello World";
    }

    @Provides
    String provideCharles(){
      return "Charles"; // ๋™์ผํ•œ ํƒ€์ž…์ด 2๊ฐœ ์กด์žฌ ํ•˜๋ฏ€๋กœ ์—๋Ÿฌ 
    }
}

์ปดํฌ๋„ŒํŠธ ๋‚ด ๋ฐ”์ธ๋“œ๋œ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ํ˜•์€ @Provides ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž

@Module
public class MyModule{
  
  @Provides
  String provideName(){// ์ด๋ฆ„ ์ œ๊ณต 
  	return "Charles";
  }

  @Provides
  int provideAge(){ // ๋‚˜์ด ์ œ๊ณต
  	return 100;
  }

  @Provides
  Person providePerson(String name,int age){//์ด๋ฆ„ ,๋‚˜์ด ์ œ๊ณต๋ฐ›์Œ 
  	return new Person(name,age);// name=Charles, age = 100
  }
  
}

๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์— ๋งž๋Š” ์˜์กด์„ฑ์ด ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ๋ฐ”์ธ๋“œ๋œ ๋ชจ๋“ˆ์— ์—†๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋ชจ๋“ˆ ํด๋ž˜์Šค๊ฐ€ ์ถ”์ƒํด๋ž˜์Šค์ธ ๊ฒฝ์šฐ @Provices ๋ฉ”์„œ๋“œ๋Š” static ๋ฉ”์„œ๋“œ์—ฌ์•ผ ํ•œ๋‹ค

  @Module
  public abstract class MyModule{
    
    @Provides
    static String provideName(){
    	return "Charles";
    }
}

๐Ÿ‘Š๐ŸฝNull์˜ ๋น„ํ—ˆ์šฉ

@Provides ๋ฉ”์„œ๋“œ๋Š” Null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œํ•œํ•œ๋‹ค. @provides ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— null ์ธ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉํ•˜๋ ค๋ฉด @Nullable์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

@Provides ๋ฉ”์„œ๋“œ์— @Nullable์ด ๋ถ™์—ˆ๋‹ค๋ฉด ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ถ€๋ถ„์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ @Nullable์„ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

@Module
public class MyModule{
    ...
    @Provides
    @Nullable// Null ์„ ๋ฐ˜ํ™˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”๊ฒฝ์šฐ
    Integer provideInteger(){
    	return null;
    }
}

@Component(modules = MyModule.class)
public class MyComponent{
    @Nullable// ์ด ์• ๋…ธํ…Œ์ด์…˜์ด ์—†์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    Integer provideInteger();
}

๐Ÿ˜ฝ๋ชจ๋“ˆ์˜ ์ƒ์†

@Module ์• ๋…ธํ…Œ์ด์…˜์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์ค‘ includes ๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. includes์— ๋‹ค๋ฅธ ๋ชจ๋“ˆ ํด๋ž˜์Šค๋“ค์˜ ๋ฐฐ์—ด์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ @Provides ๋ฉ”์„œ๋“œ์˜ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค

Ex)Module A ์™€ Module B๊ฐ€ ์กด์žฌํ•˜๊ณ  Module B ๊ฐ€ Module A ๋ฅผ ์ƒ์†ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

@Module
public class ModuleA{
    @Provides
    A ProvieA(){
    	return new A();
    }
}

@Module(includes = ModuleA.class)
public class ModuleB{
    @Provides
    B ProvideB(){
    	return new B();
    }
}

์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ• ๋•Œ ModuleB๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ ModuleA๋ฅผ ์ƒ์†ํ•ด A ํƒ€์ž…์˜ ๊ฐ์ฒด๋„ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ์ค‘๋ณต๋˜๋Š” ํƒ€์ž…์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์•ˆ๋œ๋‹ค.

profile
๐Ÿ’ป๋””์ง€ํ„ธ ๋…ธ๋งˆ๋“œ๋ฅผ ๐Ÿš€๊ฟˆ๊พธ๋Š” ๐Ÿ‡ฏ๐Ÿ‡ฒ์ž๋ฉ”์ฆˆ ๐Ÿฅ๊ฐœ๋ฐœ์ž ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€