{"id":1315,"date":"2019-06-02T19:15:25","date_gmt":"2019-06-02T10:15:25","guid":{"rendered":"https:\/\/www.charlezz.com\/?p=1315"},"modified":"2021-05-11T12:31:28","modified_gmt":"2021-05-11T03:31:28","slug":"dagger2%eb%a5%bc-%ec%95%8c%ec%95%84%eb%b3%b4%ec%9e%90-multibinding","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=1315","title":{"rendered":"Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Multibinding"},"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 \/>\nDagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; Multibinding\u00a0(You&#8217;re here)<br \/>\n<a href=\"https:\/\/www.charlezz.com\/?p=1336\">Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; SubComponent<\/a><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<p><span>Dagger\ub97c \uc0ac\uc6a9\ud558\uba74 Multibinding(\ub2e4\uc911 \ubc14\uc778\ub529)\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc5ec\ub7ec \ubaa8\ub4c8\uc5d0 \uac1d\uccb4\uac00 \ubc14\uc778\ub529\ub418\uc5b4 \uc788\uc5b4\ub3c4 \uc5ec\ub7ec \uac1d\uccb4\ub97c \ud558\ub098\uc758 \uceec\ub809\uc158\uc5d0 \ubc14\uc778\ub529 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Dagger\ub294 Collection\uc744 \uc870\ud569\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucf54\ub4dc\uac00 \ub3c5\ub9bd\uc801\uc778 \ubc14\uc778\ub529\uc5d0 \uc9c1\uc811 \uc758\uc874\ud558\uc9c0 \uc54a\uace0 \uc758\uc874\uc131\uc8fc\uc785\uc744 \ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc90d\ub2c8\ub2e4.\u00a0<\/span><\/p>\n<h2>Set Multibindings<\/h2>\n<p>\uc5ec\ub7ec \uc778\uc2a4\ud134\uc2a4\ub97c \ud558\ub098\uc758 Set\uc73c\ub85c \uad00\ub9ac\ud558\ub294 \uba40\ud2f0\ubc14\uc778\ub529\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574\uc11c\ub294 <strong>@IntoSet<\/strong> \uc560\ub178\ud14c\uc774\uc158\uc744 \ubaa8\ub4c8\ub0b4\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uba54\uc18c\ub4dc\uc758 \ubc18\ud658\ud615\uc774 \uace7 Set\uc758 \uc81c\ub124\ub9ad\uc774 \ub418\uba70. \ubc18\ud658\ub418\ub294 \uac1d\uccb4\ub294 \uc624\ube0c\uc81d\ud2b8 \uadf8\ub798\ud504 Set&lt;T&gt;\ub85c \ub4e4\uc5b4\uac00\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">@Module\r\npublic class NameModule{\r\n    @Provides\r\n    @IntoSet\r\n    String provideCharles(){\r\n        return \"Charles\";\r\n    }\r\n\r\n    @Provides\r\n    @IntoSet\r\n    String provideRuna(){\r\n        return \"Runa\";\r\n    }\r\n}<\/pre>\n<p><strong>@ElementsIntoSet<\/strong> \uc560\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uc5ec \uc5ec\ub7ec \uc778\uc2a4\ud134\uc2a4\ub97c \ud55c\ubc88\uc5d0 Set\uc5d0 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">@Module\r\npublic class NameModule{\r\n    @Provides\r\n    @ElementsIntoSet\r\n    Set&lt;String&gt; provideNames(){\r\n        return new HashSet&lt;String&gt;(Arrays.asList(\"Charles\",\"Runa\"));\r\n    }\r\n}<\/pre>\n<p>\uc81c\ub300\ub85c \uc8fc\uc785\uc774 \ub418\ub294\uc9c0 \ud655\uc778\ud574\ubd05\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">class Bar {\r\n    @Inject Bar(Set&lt;String&gt; strings) {\r\n        assert strings.contains(\"Charles\");\r\n        assert strings.contains(\"Runa\");\r\n    }\r\n}<\/pre>\n<p>\ucef4\ud3ec\ub10c\ud2b8\ub3c4 Set&lt;String&gt;\uc744 \uc81c\uacf5\ud560 \uc218 \uc788\ub294\uc9c0 \ud655\uc778\ud574\ubd05\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">@Component(modules = {NameModule.class})\r\ninterface MyComponent {\r\n  Set&lt;String&gt; strings();\r\n}\r\n\r\n@Test void testMyComponent() {\r\n  MyComponent myComponent = DaggerMyComponent.create();\r\n  assertThat(myComponent.strings()).containsExactly(\"Charles\", \"Runa\");\r\n}<\/pre>\n<p>\ub2e4\ub978 \ubc14\uc778\ub529\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c, \uba40\ud2f0\ubc14\uc778\ub529\ub41c<span>\u00a0Set&lt;String&gt;\uc740 Provider&lt;Set&lt;String&gt;&gt; \ub610\ub294 Lazy &lt;Set&lt;String&gt;&gt;\uc5d0 \uc758\uc874\uc131\uc744 \uc8fc\uc785 \ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 Set&lt;Provider&lt;Foo&gt;&gt;\ub85c\ub294 \uc758\uc874\uc131 \uc8fc\uc785\uc774 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4.<\/span><\/p>\n<h2>Map Multibindings<\/h2>\n<p>Map\uc744 \uc774\uc6a9\ud558\uc5ec \uba40\ud2f0\ubc14\uc778\ub529\uc744 \uad6c\ud604\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. Set Multibinding\uacfc \ubc29\ubc95\uc740 \ube44\uc2b7\ud558\uba70, <strong>@IntoMap<\/strong> \uc560\ub178\ud14c\uc774\uc158\uacfc <strong>@MapKey<\/strong> \uc560\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<p>\ucef4\ud3ec\ub10c\ud2b8\ub0b4\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub4e4\uc744 Map\uc73c\ub85c \ub2e4\uc911 \ubc14\uc778\ub529\ud558\uae30 \uc704\ud574\uc11c Module\uc5d0\uc11c\ub294 @IntoMap\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. Map\uc5d0\ub294 Value\ub97c \uad00\ub9ac\ud560 Key\uac00 \ud544\uc694\ud55c\ub370, \uae30\uc815\uc758\ub41c\u00a0Key \uc560\ub178\ud14c\uc774\uc158\uc73c\ub85c @StringKey, @IntLong, @LongKey, @ClassKey \ub4f1\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uacfc \uac19\uc774 Module\uc5d0\uc11c \ucef4\ud3ec\ub10c\ud2b8\uc5d0 \uba40\ud2f0\ubc14\uc778\ub529 \uac1d\uccb4\ub97c \uc81c\uacf5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">@Module\r\nclass MyModule {\r\n    @Provides \r\n    @IntoMap\r\n    @StringKey(\"foo\")\r\n    static Long provideFooValue() {\r\n        return 100L;\r\n    }\r\n\r\n    @Provides \r\n    @IntoMap\r\n    @ClassKey(Thing.class)\r\n    static String provideThingValue() {\r\n        return \"value for Thing\";\r\n    }\r\n}<\/pre>\n<p>\ucef4\ud3ec\ub10c\ud2b8\ub97c \ud1b5\ud574 Map\uc774 \uc81c\ub300\ub85c \uc81c\uacf5 \ub418\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">@Component(modules = MyModule.class)\r\ninterface MyComponent {\r\n    Map&lt;String, Long&gt; longsByString();\r\n    Map&lt;Class&lt;?&gt;, String&gt; stringsByClass();\r\n}\r\n\r\n@Test void testMyComponent() {\r\n    MyComponent myComponent = DaggerMyComponent.create();\r\n    assertThat(myComponent.longsByString().get(\"foo\")).isEqualTo(100L);\r\n    assertThat(myComponent.stringsByClass().get(Thing.class))\r\n        .isEqualTo(\"value for Thing\");\r\n}<\/pre>\n<h2>@Multibinds<\/h2>\n<p>\ucef4\ud3ec\ub10c\ud2b8 \ub0b4\uc5d0\uc11c \uc774\ubbf8 \uc81c\uacf5\ub41c Set\uc774\ub098 Map \uc774 \uc788\ub2e4\uba74 \ubaa8\ub4c8\uc758 abstract \uba54\uc18c\ub4dc\uc5d0 @Multibinds \uc560\ub178\ud14c\uc774\uc158\uc744 \ucd94\uac00\ud574\uc11c \uba40\ud2f0\ubc14\uc778\ub529\uc744 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ucd5c\uc18c\ud55c \ud558\ub098\uc774\uc0c1 @IntoSet, @ElementsIntoSet \ub610\ub294 @IntoMap\uc744 \uac16\ub294 Set \uc774\ub098 Map\uc744 \uc704\ud574\uc11c\ub294 \uc774 \uc560\ub178\ud14c\uc774\uc158\uc744 \ucd94\uac00\ud560 \ud544\uc694\ub294 \uc5c6\uc9c0\ub9cc, \ub9cc\uc57d Map \ub610\ub294 Set\uc774 \ube44\uc5b4\uc788\uc744\uc218 \uc788\ub2e4\uba74 \uc0ac\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">@Module\r\nabstract class MyModule {\r\n    @Multibinds abstract Set&lt;Foo&gt; aSet();\r\n    @Multibinds @MyQualifier abstract Set&lt;Foo&gt; aQualifiedSet();\r\n    @Multibinds abstract Map&lt;String, Foo&gt; aMap();\r\n    @Multibinds @MyQualifier abstract Map&lt;String, Foo&gt; aQualifiedMap();\r\n}<\/pre>\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(You&#8217;re here) Dagger2\ub97c \uc54c\uc544\ubcf4\uc790 &#8211; SubComponent 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 Dagger\ub97c \uc0ac\uc6a9\ud558\uba74 Multibinding(\ub2e4\uc911 \ubc14\uc778\ub529)\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc5ec\ub7ec [&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\/1315"}],"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=1315"}],"version-history":[{"count":4,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1315\/revisions"}],"predecessor-version":[{"id":45075,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/1315\/revisions\/45075"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}