{"id":1336,"date":"2019-06-09T20:38:34","date_gmt":"2019-06-09T11:38:34","guid":{"rendered":"https:\/\/www.charlezz.com\/?p=1336"},"modified":"2021-05-11T12:31:52","modified_gmt":"2021-05-11T03:31:52","slug":"dagger2%eb%a5%bc-%ec%95%8c%ec%95%84%eb%b3%b4%ec%9e%90-subcomponent","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=1336","title":{"rendered":"Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 \u2013 Subcomponent"},"content":{"rendered":"<p><a href=\"https:\/\/www.charlezz.com\/?p=1259\">Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; \uae30\ubcf8\ud3b8<\/a><br \/>\n<a href=\"https:\/\/www.charlezz.com\/?p=1289\">Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Scope<\/a>\u00a0<br \/>\n<a href=\"https:\/\/www.charlezz.com\/?p=1297\">Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Injection\uc758 \uc885\ub958<\/a>\u00a0<br \/>\n<a href=\"https:\/\/www.charlezz.com\/?p=1299\">Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Qualifier<\/a>\u00a0<br \/>\n<a href=\"https:\/\/www.charlezz.com\/?p=1313\">Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Binding<\/a>\u00a0<br \/>\n<a href=\"https:\/\/www.charlezz.com\/?p=1315\">Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Multibinding<\/a>\u00a0<br \/>\nDagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; SubComponent\u00a0(You&#8217;re here)<br \/>\n<a href=\"https:\/\/www.charlezz.com\/?p=1357\">Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Android<\/a><br \/>\nDagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Testing(\uc900\ube44\uc911)<br \/>\n<a href=\"https:\/\/www.charlezz.com\/?p=45066\">Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Dynamic Feature\uc5d0 \uc801\uc6a9\ud558\uae30<\/a><\/p>\n<hr \/>\n<h1>Subcomponent<\/h1>\n<p>\ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8(Subcomponent)\ub294 \uc0c1\uc704 \ucef4\ud3ec\ub10c\ud2b8(Component)\uc758 \uadf8\ub798\ud504\ub97c \uc0c1\uc18d\ud558\uace0 \ud655\uc7a5\ud558\ub294 \ucef4\ud3ec\ub10c\ud2b8 \uc785\ub2c8\ub2e4.\u00a0<\/p>\n<p><a href=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2019\/06\/www.charlezz.com-dagger2-subcomponent-1-sqrzhietcc6oiw2d6tn0vq.png\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2019\/06\/www.charlezz.com-dagger2-subcomponent-1-sqrzhietcc6oiw2d6tn0vq.png\" alt=\"\" width=\"960\" height=\"720\" class=\"aligncenter size-full wp-image-44755\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2019\/06\/www.charlezz.com-dagger2-subcomponent-1-sqrzhietcc6oiw2d6tn0vq.png 960w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2019\/06\/www.charlezz.com-dagger2-subcomponent-1-sqrzhietcc6oiw2d6tn0vq-300x225.png 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2019\/06\/www.charlezz.com-dagger2-subcomponent-1-sqrzhietcc6oiw2d6tn0vq-768x576.png 768w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/a><\/p>\n<h2>\ud2b9\uc9d5<\/h2>\n<ul>\n<li>\uadf8\ub798\ud504\ub97c \ubd84\ud560\ud558\uc5ec \ucea1\uc290\ud654 \ud569\ub2c8\ub2e4.<\/li>\n<li>\uc0c1\uc704 \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc0c1\uc18d\ud558\ubbc0\ub85c\u00a0\ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8\ub294 \uc0c1\uc704 \ucef4\ud3ec\ub10c\ud2b8\uc758 \uac1d\uccb4\uc5d0 \uc758\uc874\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8\ub294 \uc0c1\uc704 \ucef4\ud3ec\ub10c\ud2b8\uc640 \uc0dd\uba85\uc8fc\uae30\ub97c \ub2e4\ub974\uac8c \uac00\uc838\uac08 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8\ub294 \ub610 \ub2e4\ub978 \ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8\ub97c \uac00\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\uc608) ApplicationComponent -&gt; ActivitySubcomponent-&gt; FragmentSubcomponent<\/li>\n<\/ul>\n<h2>Subcomponent\ub97c \ud65c\uc6a9\ud558\uc5ec Starbucks \ub9cc\ub4e4\uae30<\/h2>\n<p>\ub9ce\uc740 Dagger2 \uc608\uc81c\ub4e4\uc774 \ucee4\ud53c\uba38\uc2e0\uc744 \uad6c\ud604\ud558\ub294 \uc608\uc81c\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc800\ub294 \ucee4\ud53c\uba38\uc2e0 \ub300\uc2e0 \uc2a4\ud0c0\ubc85\uc2a4\ub77c\ub294 \uc571\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. (<del>\ucc3d\uc758\uc131 \ub9e4\uc6b0 \ubd80\uc871<\/del>)<\/p>\n<p>\uba3c\uc800 \uc6b0\ub9ac\uac00 \uc774\ubbf8 \uc54c\uace0 \uc788\ub294 \uc2a4\ud0c0\ubc85\uc2a4\ub97c \uc0c1\uae30\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc2a4\ud0c0\ubc85\uc2a4\ub77c\ub294 \uce74\ud398\uac00 \uc788\uace0, \uadf8\uacf3\uc5d0\uc11c \uc77c\ud558\ub294 \uc810\uc6d0\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc2a4\ud0c0\ubc85\uc2a4\uc5d0\uc11c\ub294 \uc810\uc6d0\uc744 \ud30c\ud2b8\ub108(Partner)\ub77c\uace0 \uce6d\ud558\ub354\uad70\uc694. \uc2a4\ud0c0\ubc85\uc2a4\ub97c \uac00\uc11c \ud30c\ud2b8\ub108\uc5d0\uac8c \uc74c\ub8cc\ub97c \uc8fc\ubb38\ud558\uba74 \ud30c\ud2b8\ub108\uac00 \uc74c\ub8cc\ub97c \ub9cc\ub4e4\uc5b4 \uc90d\ub2c8\ub2e4. \ud30c\ud2b8\ub108\ub294 \uc5ec\ub7ec\uba85\uc774 \ub420 \uc218 \uc788\uace0, \uac19\uc740 \ud30c\ud2b8\ub108\uac00 \ub9cc\ub4e0 \ub3d9\uc77c\ud55c \uba54\ub274\uc758 \uc74c\ub8cc\uc5ec\ub3c4 \uc8fc\ubb38\ud560\ub54c\ub9c8\ub2e4 \uc11c\ub85c \ub2e4\ub978 \uc74c\ub8cc(\ub2e4\ub978 \uc778\uc2a4\ud134\uc2a4)\uac00 \ub418\uc5b4 \ub098\uc640\uc57c \ud569\ub2c8\ub2e4. \uc2a4\ud0c0\ubc85\uc2a4\ub97c \ubc29\ubb38\ud55c \uc190\ub2d8 A\uc640 \uc190\ub2d8 B\uac00 \uc544\uba54\ub9ac\uce74\ub178\ub97c \ub611\uac19\uc774 \uc8fc\ubb38\ud588\ub2e4\uace0 \ud55c\uc794\uc758 \uc544\uba54\ub9ac\uce74\ub178\ub97c \ub098\ub220\ub9c8\uc2e4\uc21c \uc5c6\uc73c\ub2c8\uae4c\uc694.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media.giphy.com\/media\/xT8qBijzKv3vzx9Kvu\/giphy.gif\" \/><\/p>\n<p>\uc790 \uc774\uc81c Starbucks \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4 \ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4<\/p>\n<pre class=\"lang:java decode:true\">public class Starbucks(){\r\n   ...\r\n}<\/pre>\n<p>\uc2a4\ud0c0\ubc85\uc2a4 \uac74\ubb3c\uc744 \ud558\ub098 \uc9c0\uc740 \uc148\uc774\uc9c0\uc694. \uc2a4\ud0c0\ubc85\uc2a4\ub97c \uc6b4\uc601\ud558\ub824\uba74 \uc7ac\ub8cc\uac00 \ud544\uc694\ud558\uaca0\uc8e0.<\/p>\n<pre class=\"lang:java decode:true\">@Module\r\npublic class IngredientModule {\r\n    @Provides\r\n    CoffeeBean provideCoffeeBean(){\r\n        return new CoffeeBean();\r\n    }\r\n\r\n    @Provides\r\n    Water provideWater(){\r\n        return new Water();\r\n    }\r\n\r\n    @Provides\r\n    Milk provideMilk(){\r\n        return new Milk();\r\n    }\r\n}<\/pre>\n<p>\uc7ac\ub8cc\ub97c \uc81c\uacf5\ud574\uc8fc\ub294 \ubaa8\ub4c8\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \ucee4\ud53c\ucf69\uacfc \ubb3c, \uc6b0\uc720\ub97c \uacf5\uae09\ud574\uc8fc\ub294 \ubaa8\ub4c8\uc785\ub2c8\ub2e4. \uac19\uc740 \ucee4\ud53c\ucf69\uc744 \uc7ac\ud0d5\ud574\uc11c \uc5d0\uc2a4\ud504\ub808\uc18c\ub294 \ub9cc\ub4dc\ub294 \uc77c\uc774 \uc5c6\uc5b4\uc57c\ud558\ubbc0\ub85c \uc2a4\ucf54\ud504\ub294 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\u00a0<\/p>\n<p><em><strong>Note<\/strong> : Scope\uac00 \uc5c6\uc73c\uba74 \uc694\uccad\uc2dc \ub9e4\ubc88 \ub2e4\ub978 \uac1d\uccb4\ub97c \uc81c\uacf5\ud558\uac8c \ub429\ub2c8\ub2e4. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 <a href=\"https:\/\/www.charlezz.com\/?p=1289\">Scope\ud3b8<\/a>\uc744 \ucc38\uc870\ud574\uc8fc\uc138\uc694.<\/em><\/p>\n<p>\n\uc774 \uc7ac\ub8cc\ub97c \uac00\uc9c0\uace0 \uc74c\ub8cc\ub97c \ub9cc\ub4e4\uac8c \ub418\uaca0\uc8e0?\u00a0<\/p>\n<p>Drink interface\ub97c \uad6c\ud604\ud55c \uc74c\ub8cc Class\ub4e4\uc744 \ubbf8\ub9ac \ub9cc\ub4e4\uc5b4 \ub450\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">public interface Drink {\r\n}\r\n\r\npublic class Espresso implements Drink {\r\n    private Water water;\r\n    private CoffeeBean coffeeBean;\r\n\r\n    @Inject\r\n    public Espresso(Water water, CoffeeBean coffeeBean) {\r\n        this.water = water;\r\n        this.coffeeBean = coffeeBean;\r\n    }\r\n}\r\n\r\npublic class Americano implements Drink {\r\n\r\n    private Espresso espresso;\r\n    private Water water;\r\n\r\n    @Inject\r\n    public Americano(Espresso espresso, Water water) {\r\n        this.espresso = espresso;\r\n        this.water = water;\r\n    }\r\n}\r\n\r\npublic class Latte implements Drink {\r\n    private Espresso espresso;\r\n    private Milk milk;\r\n\r\n    @Inject\r\n    public Latte(Espresso espresso, Milk milk) {\r\n        this.espresso = espresso;\r\n        this.milk = milk;\r\n    }\r\n}\r\n\r\n<\/pre>\n<p>\n\uc774\uc81c IngredientModule\uc744 \uc5f0\uacb0\ud560 StarbucksComponent\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">@Singleton\r\n@Component(modules = {IngredientModule.class})\r\npublic interface StarbucksComponent {\r\n    void inject(Starbucks starbucks);\r\n}<\/pre>\n<p>@Singleton \uc2a4\ucf54\ud504\uc778 StarbucksComponent\ub97c \ub9cc\ub4e4\uc5c8\uace0, \uba64\ubc84\uc778\uc81d\uc158\uc744 \uc704\ud55c inject(&#8230;)\uba54\uc18c\ub4dc\ub3c4 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.\u00a0<\/p>\n<p>\uc774\uc81c \uc544\ub798\uc758 \ucf54\ub4dc\ub97c \ud1b5\ud574 \uc758\uc874\uc131 \uc8fc\uc785\uc744 \uc2e4\ud589\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">public class Starbucks {\r\n\r\n    public Starbucks() {\r\n        StarbucksComponent starbucksComponent = DaggerStarbucksComponent.create();\r\n        starbucksComponent.inject(this);\r\n    }\r\n}<\/pre>\n<p>\uc7ac\ub8cc\uac00 \uc900\ube44\ub418\uc5c8\uc9c0\ub9cc \uc74c\ub8cc\ub97c \ub9cc\ub4e4\uc5b4\uc904 \ud30c\ud2b8\ub108\uac00 \uc5c6\uc73c\ubbc0\ub85c \ud30c\ud2b8\ub108\ub97c \uace0\uc6a9(?)\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<br \/>\n<strong>StarbucksComponent\uac00 \uc0c1\uc704 \ucef4\ud3ec\ub10c\ud2b8\uac00 \ub418\uace0, Partner\uc758 \ucef4\ud3ec\ub10c\ud2b8 \ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8\uac00 \ub420\uac83\uc785\ub2c8\ub2e4.<\/strong><\/p>\n<p>Partner \ucef4\ud3ec\ub10c\ud2b8\ub97c \uba3c\uc800 \ub9cc\ub4e4\uc5b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4<\/p>\n<pre class=\"lang:java decode:true\">@Scope\r\npublic @interface PartnerScope {\r\n}\r\n\r\n@PartnerScope\r\n@Subcomponent(modules = PartnerModule.class)\r\npublic interface PartnerComponent {\r\n    @Subcomponent.Builder\r\n    interface Builder{\r\n        Builder partnerModule(PartnerModule module);\r\n        PartnerComponent build();\r\n    }\r\n    void inject(Partner partner);\r\n}<\/pre>\n<p>\uae30\ubcf8\uc801\uc778 \uad6c\uc870\ub294 Component\uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4. Scope\uac00 \uc788\uace0, Module\uc744 \uac00\uc9d1\ub2c8\ub2e4. \ub2e4\ub978\uc810\uc740 @Subcomponent\uc560\ub178\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud574\uc57c\ud558\uba70, \ubc18\ub4dc\uc2dc \uba85\uc2dc\uc801\uc73c\ub85c\u00a0<strong>@Subcomponent.Builder <\/strong>\ub610\ub294 <strong>@Subcomponent.Factory\u00a0<\/strong>\uad6c\ud604\ud574\uc57c \ud55c\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4.<\/p>\n<p>PartnerModule.class\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud604\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">@Module\r\npublic class PartnerModule {\r\n\r\n    @Provides\r\n    @PartnerScope\r\n    @Named(\"partnerId\")\r\n    String providePartnerId() {\r\n        return UUID.randomUUID().toString(); \/\/\ud30c\ud2b8\ub108 \uc544\uc774\ub514\ub85c \ub79c\ub364\ud55c \uace0\uc733\uac12 \ubd80\uc5ec\r\n    }\r\n\r\n    @Provides\r\n    @IntoMap\r\n    @ClassKey(Americano.class)\r\n    Drink provideAmericano(Espresso espresso, Water water) {\r\n        return new Americano(espresso, water);\r\n    }\r\n\r\n    @Provides\r\n    @IntoMap\r\n    @ClassKey(Espresso.class)\r\n    Drink provideEspresso(Espresso espresso){\r\n        return espresso;\r\n    }\r\n\r\n    @Provides\r\n    @IntoMap\r\n    @ClassKey(Latte.class)\r\n    Drink providelatte(Espresso espresso, Milk milk) {\r\n        return new Latte(espresso, milk);\r\n    }\r\n\r\n}<\/pre>\n<p>\ud30c\ud2b8\ub108\uc758 ID\ub294 \ud30c\ud2b8\ub108\ub97c \uace0\uc6a9\ud55c \ud6c4 \ud574\uace0\uc2dc\ud0ac\ub54c\uae4c\uc9c0(?) \ub3d9\uc77c\ud55c \uac12\uc774\uc5ec\uc57c\ub418\ubbc0\ub85c, @PartnerScope\ub97c \ubd99\uc5ec \ub3d9\uc77c\ud55c \uc778\uc2a4\ud134\uc2a4\uc5d0 \uc758\uc874\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc544\uba54\ub9ac\uce74\ub178, \uc5d0\uc2a4\ud504\ub808\uc18c, \ub77c\ud14c\ub294 <a href=\"https:\/\/www.charlezz.com\/?p=1315\">\uba40\ud2f0\ubc14\uc778\ub529<\/a>\uc744 \ud65c\uc6a9\ud588\uc73c\uba70, \ub9e4\ubc88 \ub2e4\ub978 \uc74c\ub8cc\uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4\uc57c\ud558\ubbc0\ub85c \uc2a4\ucf54\ud504\ub97c \uc9c0\uc815\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\u00a0<\/p>\n<p><em><strong>Note<\/strong>: PartnerModule\ub0b4\uc758 \ud504\ub85c\ube44\uc83c \uba54\uc18c\ub4dc \uc778\uc790\ub97c \uc0b4\ud3b4\ubcf4\uba74 Espresso, Water, Milk\ub4f1\uc744 \uc8fc\uc785\ubc1b\uace0 \uc788\uc9c0\ub9cc PartnerComponent \ud574\ub2f9 \uac1d\uccb4\ub97c \uc81c\uacf5\ud558\uc9c0 \uc54a\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc704 \uac1d\ucc44\ub97c \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\ub294 \uc774\uc720\ub294 \uc0c1\uc704 \ucef4\ud3ec\ub10c\ud2b8\uc778 StarbucksComponent\uc758 \uc624\ube0c\uc81d\ud2b8 \uadf8\ub798\ud504\ub0b4\uc5d0 \ud574\ub2f9 \uac1d\uccb4\ub4e4\uc774 \uc788\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.\u00a0<\/em><\/p>\n<p>\uc74c\ub8cc\uac1d\uccb4\ub97c \ub9cc\ub4e4\uae30 \uc704\ud55c\u00a0\ud30c\ud2b8\ub108\uc758 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">public class Partner {\r\n    @Inject\r\n    @Named(\"partnerId\")\r\n    String partnerId;\r\n\r\n    @Inject\r\n    Map&lt;Class&lt;?&gt;, Provider&lt;Drink&gt;&gt; menuMap;\r\n\r\n    @Inject\r\n    public Partner(PartnerComponent.Builder builder){\r\n        builder.partnerModule(new PartnerModule()).build().inject(this);\r\n    }\r\n\r\n    public &lt;T extends Drink&gt; T makeDrink(Class&lt;T&gt; t){\r\n        return (T) menuMap.get(t).get();\r\n    }\r\n\r\n    public String getId(){\r\n        return partnerId;\r\n    }\r\n}<\/pre>\n<p>\uc0dd\uc131\uc790\uc5d0\uc11c\ub294 PartnerComponent.Builder\ub97c \uc8fc\uc785\ubc1b\uc544 \ud30c\ud2b8\ub108\uc5d0\uac8c \uba64\ubc84\uc778\uc81d\uc158\uc744 \ud558\uace0, \uc8fc\uc785\ubc1b\uc740 menuMap\uc5d0\uc11c\ub294 \uc74c\ub8cc \ud074\ub798\uc2a4\ub97c \ud074\ub798\uc2a4\ud0a4\ub85c \ubc1b\uc544 \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \uc74c\ub8cc\ub97c PartnerModule \ubaa8\ub4c8\ub85c\ubd80\ud130 \uc81c\uacf5\ubc1b\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c \uc0c1\uc704 \ucef4\ud3ec\ub10c\ud2b8(StarbucksComponent)\uc640 \ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8(PartnerCompent) \uc5f0\uad00\uc131\uc744 \uc815\uc758\ud560 \ucc28\ub840\uc785\ub2c8\ub2e4.\ud558\uc704\ucef4\ud3ec\ub10c\ud2b8\uc758 \uc815\uc758\ub294 \uc0c1\uc704\ucef4\ud3ec\ub10c\ud2b8\uc758 \ubaa8\ub4c8\uc5d0 \uc120\uc5b8\ud569\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 \uc0c1\uc704 \ucef4\ud3ec\ub10c\ud2b8\uc758 \ubaa8\ub4c8\ub85c StarbucksModule\uc744 \ucd94\uac00\ud558\uace0 \uc774 \ubaa8\ub4c8\uc5d0 \ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc5f0\uad00\uc9d3\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java mark:2 decode:true \">@Singleton\r\n@Component(modules = {IngredientModule.class, StarbucksModule.class})\r\npublic interface StarbucksComponent {\r\n    void inject(Starbucks starbucks);\r\n}<\/pre>\n<pre class=\"lang:java mark:1 decode:true\">@Module(subcomponents = PartnerComponent.class)\r\npublic class StarbucksModule {\r\n\r\n    @Provides\r\n    Partner partner(PartnerComponent.Builder builder){\r\n        return new Partner(builder);\r\n    }\r\n\r\n    ...\r\n}\r\n<\/pre>\n<p>\ubaa8\ub4c8 \uc560\ub178\ud14c\uc774\uc158\uc758 subcomponents\uc5d0 PartnerComponent.class\ub97c \uc801\uc6a9\ud569\ub2c8\ub2e4.<br \/>\n\uc774\ub85c\uc368 \uc0c1\uc704-\ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8 \uad00\uacc4\uac00 \ud615\uc131\uc774 \ub41c\uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub97c\ud1b5\ud574 Starbucks\ubaa8\ub4c8\ub0b4\uc5d0 Partner\uac1d\uccb4\ub97c \uc81c\uacf5\ud558\ub294 \ud504\ub85c\ube44\uc83c \uba54\uc18c\ub4dc\uc758 \ud30c\ub77c\ubbf8\ud130\ub85c PartnerComponent.Builder\ub97c \ubc1b\uc744 \uc218 \uc788\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c \ub2e4\uc2dc Starbucks \ud074\ub798\uc2a4\ub85c \ub3cc\uc544\uac00\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">public class Starbucks {\r\n\r\n    public static final String TAG = Starbucks.class.getSimpleName();\r\n\r\n    @Inject\r\n    Provider&lt;Partner&gt; partnerProvider;\r\n\r\n    public Starbucks(Logger logger) {\r\n        System.out.println(\"\uc2a4\ud0c0\ubc85\uc2a4 Grand Opening\");\r\n        StarbucksComponent starbucksComponent = DaggerStarbucksComponent.create();\r\n        starbucksComponent.inject(this);\r\n\r\n        Partner partner1 = partnerProvider.get();\r\n        Partner partner2 = partnerProvider.get();\r\n\r\n        logger.e(TAG, \"partner1:\"+partner1.getId());\r\n        logger.e(TAG, \"partner2:\"+partner2.getId());\r\n\r\n        for(int i=0;i&lt;10;i++){\r\n            Americano americano = partner1.makeDrink(Americano.class);\r\n            logger.e(TAG, \"\uc544\uba54\ub9ac\uce74\ub178:\"+americano);\r\n        }\r\n    }\r\n}<\/pre>\n<p>\ud30c\ud2b8\ub108\ub97c \uc0dd\uc131 \ud560 Provider&lt;Partner&gt;\ub97c \uc8fc\uc785\ubc1b\uc2b5\ub2c8\ub2e4. Provider\ub294 \ub9e4\ubc88 \uac1d\uccb4\ub97c \uc694\uccad\ud560\ub54c \uc0c8\ub85c\uc6b4 \uac1d\uccb4\ub97c \uc81c\uacf5\ud574\uc90d\ub2c8\ub2e4.\u00a0Provider&lt;Partner&gt;\ub97c \ud1b5\ud574 \ub450\uba85\uc758 \ud30c\ud2b8\ub108\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.(partner1, partner2)<\/p>\n<p>\ub450 \ud30c\ud2b8\ub108\uc758 Id\ub97c \ube44\uad50\ud558\uc5ec \ub3d9\uc77c\ud55c \uc778\uc2a4\ud134\uc2a4\uc778\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\ud6c4 \ud55c\uba85\uc758 \ud30c\ud2b8\ub108\ub97c \ud1b5\ud574 \uc544\uba54\ub9ac\uce74\ub178\ub97c 10\uc794 \uc694\uccad\ud55c \uacb0\uacfc\uac00 \uc5b4\ub5a4\uc9c0 \ud655\uc778\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">\uc2a4\ud0c0\ubc85\uc2a4 Grand Opening\r\nE Starbucks: partner1:1c795cd8-7f25-4495-879f-cb634901626f\r\nE Starbucks: partner2:e652e3f2-bb2a-4ff4-aad5-5d94f9e57b2b\r\nE Starbucks: \uc544\uba54\ub9ac\uce74\ub178:com.charlezz.starbucks.menu.Americano@58d25a40\r\nE Starbucks: \uc544\uba54\ub9ac\uce74\ub178:com.charlezz.starbucks.menu.Americano@1b701da1\r\nE Starbucks: \uc544\uba54\ub9ac\uce74\ub178:com.charlezz.starbucks.menu.Americano@726f3b58\r\nE Starbucks: \uc544\uba54\ub9ac\uce74\ub178:com.charlezz.starbucks.menu.Americano@442d9b6e\r\nE Starbucks: \uc544\uba54\ub9ac\uce74\ub178:com.charlezz.starbucks.menu.Americano@ee7d9f1\r\nE Starbucks: \uc544\uba54\ub9ac\uce74\ub178:com.charlezz.starbucks.menu.Americano@15615099\r\nE Starbucks: \uc544\uba54\ub9ac\uce74\ub178:com.charlezz.starbucks.menu.Americano@1edf1c96\r\nE Starbucks: \uc544\uba54\ub9ac\uce74\ub178:com.charlezz.starbucks.menu.Americano@368102c8\r\nE Starbucks: \uc544\uba54\ub9ac\uce74\ub178:com.charlezz.starbucks.menu.Americano@6996db8\r\nE Starbucks: \uc544\uba54\ub9ac\uce74\ub178:com.charlezz.starbucks.menu.Americano@1963006a\r\n<\/pre>\n<p>10\uc794\uc758 \uc544\uba54\ub9ac\uce74\ub178\uac00 \uc0dd\uc131\ub418\ub294\uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc704 \uc608\uc81c\ub294 <a href=\"https:\/\/github.com\/charlezz\/daggersample\">github<\/a>\uc5d0\uc11c \ud655\uc778\uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media.giphy.com\/media\/xUn3C8WqEzUEeQoRa0\/giphy.gif\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; \uae30\ubcf8\ud3b8 Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Scope\u00a0 Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Injection\uc758 \uc885\ub958\u00a0 Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Qualifier\u00a0 Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Binding\u00a0 Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Multibinding\u00a0 Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; SubComponent\u00a0(You&#8217;re here) Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Android Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Testing(\uc900\ube44\uc911) Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Dynamic Feature\uc5d0 \uc801\uc6a9\ud558\uae30 Subcomponent \ud558\uc704 \ucef4\ud3ec\ub10c\ud2b8(Subcomponent)\ub294 \uc0c1\uc704 \ucef4\ud3ec\ub10c\ud2b8(Component)\uc758 \uadf8\ub798\ud504\ub97c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[28,25],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1336"}],"collection":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1336"}],"version-history":[{"count":12,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1336\/revisions"}],"predecessor-version":[{"id":45076,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1336\/revisions\/45076"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1336"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1336"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1336"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}