{"id":428,"date":"2018-06-27T19:15:32","date_gmt":"2018-06-27T10:15:32","guid":{"rendered":"http:\/\/www.charlezz.com\/?p=428"},"modified":"2019-05-03T15:41:35","modified_gmt":"2019-05-03T06:41:35","slug":"android%ec%97%90%ec%84%9c-dagger2-%ec%a0%81%ec%9a%a9%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=428","title":{"rendered":"Android\uc5d0\uc11c Dagger2 \uc801\uc6a9\ud558\uae30"},"content":{"rendered":"<h1>Who should read?<\/h1>\n<p>\uc774\uc81c \ub9c9 \uc548\ub4dc\ub85c\uc774\ub4dc\ub97c \ubc30\uc6b0\uace0 \uc788\ub294 \uac1c\ubc1c\uc790\uc5d0\uac8c\ub294 \ucd94\ucc9c\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<br \/>\n<span style=\"font-size: 10.0pt;\">\ud558\uc9c0\ub9cc \uc548\ub4dc\ub85c\uc774\ub4dc\ub97c \uac1c\ubc1c\uc744 \uc5b4\ub290\uc815\ub3c4 \ud574\ubd24\uace0, \ub0b4\uac00 \uc911\uae09\uac1c\ubc1c\uc790 \uc774\uc0c1\uc774 \ub418\uace0 \uc2f6\ub2e4 \ud558\uc2dc\ub294\ubd84\uc740 \uc798 \uc624\uc168\uc2b5\ub2c8\ub2e4.<br \/>\n\uc790\ubc14\uc640 \uac1d\ucc44\uc9c0\ud5a5\uac1c\ub150\uc5d0 \ub300\ud574\uc11c \uce5c\uc219\ud558\ub2e4\uba74 \ud070 \uc5b4\ub824\uc6c0\uc774 \uc5c6\uc744 \uac81\ub2c8\ub2e4.<br \/>\nWelcome to Dagger World\u00a0<\/span><\/p>\n<h1>Dependency Injection\uc774\ub780 \ubb34\uc5c7\uc77c\uae4c?<\/h1>\n<p>\ud55c\uad6d\ub9d0\ub85c \ud558\uc790\uba74 Dependency\ub294 \uc758\uc874\uc131\uc774\uace0, Injection\uc740 \uc8fc\uc785\uc774\ub2e4.<\/p>\n<h2>\uc758\uc874\uc131\uc774\ub780?<\/h2>\n<ul style=\"list-style-type: square;\">\n<li>\ucf54\ub4dc\uc5d0\uc11c \ub450 \ubaa8\ub4c8\uac04\uc758 \uc5f0\uacb0<\/li>\n<li>\ub450 \ud074\ub798\uc2a4 \uac04\uc758 \uad00\uacc4<\/li>\n<li>\uc758\uc874\uc131\uc774 \ud06c\ub2e4\ub294\uac83\uc740 Coupling(\uacb0\ud569\ub3c4)\uc774 \ub192\ub2e4\ub294\uac83<\/li>\n<\/ul>\n<h2>\uc758\uc874\uc131\uc774 \ubbf8\uce58\ub294 \uc601\ud5a5\uc740?<\/h2>\n<ul style=\"list-style-type: square;\">\n<li>\ud558\ub098\uc758 \ubaa8\ub4c8\uc774 \ubcc0\uacbd\ub428\uc5d0 \ub530\ub77c \uacb0\ud569\ub41c \ub2e4\ub978 \ubaa8\ub4c8\uc774 \uc601\ud5a5\uc744 \ubc1b\uac8c \ub41c\ub2e4.<\/li>\n<li>\ub450\uac1c\uc758 \ubaa8\ub4c8\uc77c\ub54c\ub294 \uad1c\ucc2e\uc9c0\ub9cc \ucd5c\uc545\uc758\uacbd\uc6b0 \ubaa8\ub4c8\uc774 100\uac1c,1000\uac1c&#8230;n \uac1c \uc77c\ub54c \ud558\ub098\uc758 \ubaa8\ub4c8\ubcc0\uacbd\uc73c\ub85c \uc778\ud574 n-1\uac1c\uc758 \ubaa8\ub4c8\uc774 \uc601\ud5a5\uc744 \ubc1b\ub294\ub2e4\uace0 \uc0dd\uac01\ud574\ubcf4\uc790<\/li>\n<li>\ub098\uba38\uc9c0 \ubaa8\ub4c8\uc774 \uc81c\ub300\ub85c \ub3d9\uc791\ud558\ub294\uc9c0\uc5d0 \ub300\ud55c \uac80\uc99d\uc774 \ud544\uc694\ud560 \uc218\ub3c4 \uc788\ub2e4. \uadf8\ub7fc \uc2dc\uac04\uacfc \ube44\uc6a9\ub3c4 n\ub9cc\ud07c??<\/li>\n<li>\uacb0\ud569\ub3c4\uac00 \ub192\uc73c\uba74 \ub3c5\ub9bd\uc131\uc774 \ub5a8\uc5b4\uc9c4\ub2e4. \ubc18\ub300\ub85c \uacb0\ud569\ub3c4\uac00 \ub0ae\uc73c\uba74 \ub3c5\ub9bd\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.<\/li>\n<\/ul>\n<h2>\uc758\uc874\uc131 \uc8fc\uc785\uc758 \ubaa9\uc801 ( \ud14c\uc2a4\ud2b8, \uc720\uc9c0\ubcf4\uc218, \uc7ac\uc0ac\uc6a9\uc131)<\/h2>\n<ul style=\"list-style-type: square;\">\n<li>\uac00\uc7a5 \ud070 \ubaa9\uc801\uc740 \ubaa8\ub4c8\uc744 <strong>Testable<\/strong>\ud558\uac8c \ub9cc\ub4e4\uc218 \uc788\ub2e4\ub294 \uc810\uc774\ub2e4.\u00a0\ub3c5\ub9bd\ub41c \ubaa8\ub4c8\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8 \ucf54\ub4dc \uc791\uc131<\/li>\n<li>\ud558\ub098\uc758 \ubaa8\ub4c8\uc774 \ubcc0\uacbd\ub418\uc5b4\ub3c4 \ub2e4\ub978 \ubaa8\ub4c8\ub4e4\uc774 \uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\uc73c\ubbc0\ub85c <strong>\uc720\uc9c0\ubcf4\uc218<\/strong>\uac00 \uc6a9\uc774<\/li>\n<li>new\ub97c \uc774\uc6a9\ud55c \uc0dd\uc131\uc790\ub97c \uc5c6\uc560\uc790. \ubaa8\ub4c8\ub0b4\uc5d0\uc11c \ub2e4\ub978 \ubaa8\ub4c8\uc744 \ucd08\uae30\ud654\ud558\uba74 \uacb0\ud569\ub3c4\uac00 \ub192\uc544\uc9c0\ubbc0\ub85c \uac1d\uccb4\uc0dd\uc131\uc740 \ub2e4\ub978\uacf3\uc5d0\uc11c \ud558\uace0 \uc0dd\uc131\ub41c \uac1d\uccb4\ub97c \ucc38\uc870\ud558\uc790.<\/li>\n<li>\uac1d\uccb4\uc0dd\uc131\uc744 \uc678\ubd80\uc5d0\uc11c \ud558\uba74 \ud074\ub798\uc2a4\uc758 \ub3c5\ub9bd\uc131\uc774 \uc99d\uac00\ub418\uba70 \uc774\uc5d0\ub530\ub77c \ud074\ub798\uc2a4\ub97c \ud14c\uc2a4\ud2b8 \uac00\ub2a5\ud558\uba70, <strong>\uc7ac\uc0ac\uc6a9<\/strong>\uc744 \ud560 \uac00\ub2a5\uc131\ub3c4 \ub192\uc544\uc9c4\ub2e4.<\/li>\n<\/ul>\n<p><strong>\uacb0\ub860<\/strong>:\uc758\uc874\uc131\uc8fc\uc785\uc740 \ub450\uac1c\uc774\uc0c1\uc758 \ubaa8\ub4c8(\ud074\ub798\uc2a4)\uac04\uc758 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uae30 \uc704\ud574 \uc678\ubd80\uc5d0\uc11c \uac1d\uccb4\ub97c \uc0dd\uc131(new)\ud558\uace0 \uc8fc\uc785\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n<h1>Dagger?<\/h1>\n<p>Dagger\ub294 \uc790\ubc14\uc640 \uc548\ub4dc\ub85c\uc774\ub4dc\ub97c \uc704\ud574 \ub9cc\ub4e4\uc5b4\uc9c4 \ucef4\ud30c\uc77c\ud0c0\uc784 \uc758\uc874\uc131 \uc8fc\uc785 \ud504\ub798\uc784\uc6cc\ud06c \uc785\ub2c8\ub2e4.<br \/>\n\uc774\uc804\ubc84\uc804\uc740 Square\uc5d0\uc11c \uc8fc\ub3c4\uc801\uc73c\ub85c \uac1c\ubc1c\ud558\uc600\uc73c\ub098 \uc9c0\uae08\uc740 \uad6c\uae00\uc774 \uad00\ub9ac\ud558\uace0 \uc788\ub294\uc911\uc785\ub2c8\ub2e4.<br \/>\n\ub300\uac70\ub294 \ucd94\uc801\uac00\ub2a5\ud55c \ubcf4\uc77c\ub7ec\ud50c\ub808\uc774\ud2b8 \uc790\ubc14 \ucf54\ub4dc\ub97c \ucef4\ud30c\uc77c\ud0c0\uc784\uc5d0 \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud558\uace0 \ub9ac\ud50c\ub809\uc158 \uc0ac\uc6a9\uc774 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ub9ce\uc740 \uac1c\ubc1c\uc790\ub4e4\uc774 \uc560\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h1>Annotation Processor \uc774\ud574\ud558\uae30<\/h1>\n<h2>Annotation<\/h2>\n<p>\uc560\ub178\ud14c\uc774\uc158\uc740 \uba54\ud0c0\ub370\uc774\ud130 \ud074\ub798\uc2a4\ub85c \ub2e4\ub978 \ud074\ub798\uc2a4\ub098 \uba54\uc18c\ub4dc, \ud544\ub4dc, \uc2ec\uc9c0\uc5b4 \ub610\ub2e4\ub978 \uc560\ub178\ud14c\uc774\uc158\uacfc \uacb0\ud569\ub418\uc5b4 \uc0ac\uc6a9\ub418\uc5b4\uc9c4\ub2e4. \uc790\ubc14 \uc560\ub178\ud14c\uc774\uc158\uc740 XML\uc774\ub098 Java\ub9c8\ucee4 \uc778\ud130\ud398\uc774\uc2a4\uc640 \ucc98\ub7fc \ucd94\uac00\uc801\uc778 \uc815\ubcf4\ub97c \uc81c\uacf5\ud558\ub294 \ub300\uc548\uc774 \ub41c\ub2e4.<\/p>\n<h2>Annotation Processor<\/h2>\n<p>\uc560\ub178\ud14c\uc774\uc158 \ud504\ub85c\uc138\uc11c\ub294 \ucf54\ub4dc\ub97c \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud574\uc8fc\ub294 \uc5ed\ud560\uc744 \ud574\uc900\ub2e4. \uadf8\ub798\uc11c \ubcf4\uc77c\ub7ec\ud50c\ub808\uc774\ud2b8 \ucf54\ub4dc\ub97c \ucef4\ud30c\uc77c \ud0c0\uc784\uc5d0 \uc2f9 \ub4e4\uc5b4 \ub0bc \uc218 \uc788\ub2e4.<br \/>\nDagger2\ub294 \uc560\ub178\ud14c\uc774\uc158 \uae30\ubc18\uc73c\ub85c \ub3d9\uc791\ud55c\ub2e4. \ubaa8\ub4e0 \ucf54\ub4dc\ub294 \ucef4\ud30c\uc77c\uc2dc\uac04\uc5d0 \uc0dd\uc131\ub418\uba70 \uadf8\ub7f0\uc774\uc720\ub85c \ud37c\ud3ec\uba3c\uc2a4\uc5d0 \ub300\ud55c \uc624\ubc84\ud5e4\ub4dc\uac00 \uc5c6\uace0 \uc5d0\ub7ec\uc5d0 \ub300\ud574 \ucd94\uc801\uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \ub9cc\ub4e4\uc5b4 \ub0bc \uc218 \uc788\ub2e4.<br \/>\n\uc790\ubc14\ub098 \uc548\ub4dc\ub85c\uc774\ub4dc \uac1c\ubc1c\ud558\uba74\uc11c \uc81c\uc77c \ub9ce\uc774 \ubcf4\ub294 \uc560\ub178\ud14c\uc774\uc158\uc774\u00a0@Override\uc77c\uac83\uc774\uace0 ButterKnife \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc368\ubcf4\uc558\ub2e4\uba74\u00a0@BindView\ub610\ud55c \ubcf4\uc558\uc744\uac83\uc774\ub2e4. \uc774\ub7f0\uac83\ub4e4\uc774 \uc560\ub178\ud14c\uc774\uc158\uc774\uba70, \uc560\ub178\ud14c\uc774\uc158 \ud504\ub85c\uc138\uc11c\uc5d0 \uc758\ud574 \ucf54\ub4dc\ub97c \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud558\uace0 \uba54\ud0c0\ub370\uc774\ud130\ub97c \uc81c\uacf5\ud558\ub294 \ub4f1\uc758 \uc5ed\ud560\uc744 \ud55c\ub2e4.<\/p>\n<p>\uc560\ub178\ud14c\uc774\uc158\uc5d0 \ub300\ud574 \uc880 \ub354 \uc54c\uace0 \uc2f6\ub2e4\uba74 <a href=\"https:\/\/www.charlezz.com\/?p=1167\">\uc560\ub178\ud14c\uc774\uc158 \ud504\ub85c\uc138\uc11c \ub9cc\ub4e4\uae30<\/a>\ud3b8\uc744 \ucc38\uace0 \ud574\uc8fc\uc138\uc694<\/p>\n<h1>\uc548\ub4dc\ub85c\uc774\ub4dc \uc2a4\ud29c\ub514\uc624 \ud504\ub85c\uc81d\ud2b8\uc5d0 Dagger \uc124\uc815\ud558\uae30 for kotlin<\/h1>\n<h3>\ubaa8\ub4c8\ub808\ubca8\uc758 build.gradle<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"f34d058f-a10f-4629-b222-069882b75a77\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:xhtml decode:true \">{\r\n...\r\napply plugin: 'kotlin-kapt'\r\n...\r\ndependencies{\r\n...\r\n\/\/Dagger2\r\ndef daggerVer = \"2.14.1\"\r\nimplementation \"com.google.dagger:dagger-android:$daggerVer\"\r\nimplementation \"com.google.dagger:dagger-android-support:$daggerVer\" \/\/ if you use the support libraries\r\nkapt \"com.google.dagger:dagger-android-processor:$daggerVer\"\r\nkapt \"com.google.dagger:dagger-compiler:$daggerVer\"\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc548\ub4dc\ub85c\uc774\ub4dc \ud504\ub808\uc784\uc6cc\ud06c\uc758 4\ub300 \ucef4\ud3ec\ub10c\ud2b8\uc778 Activity, Service, ContentProvider, BroadcastReciever \ub4e4\uc774 \ubaa8\uc5ec \ud558\ub098\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc774\ub8f9\ub2c8\ub2e4.<br \/>\n\uac01 \ucef4\ud3ec\ub10c\ud2b8\ub4e4\uc740 \uace0\uc720\uc758 \uc0dd\uba85\uc8fc\uae30\ub97c \uac00\uc9c0\uace0 \uc788\uace0, Application\uc740 \uc774\ub7f0 \ucef4\ud3ec\ub10c\ud2b8\ubcf4\ub2e4 \ub354 \uc0c1\uc704 \uac1c\ub150\uc774\uae30 \ub54c\ubb38\uc5d0 \ucef4\ud3ec\ub10c\ud2b8\uc758 \uc0dd\uba85\uc8fc\uae30\uc5d0 \ub9de\ucdb0 \uc758\uc874\uc131 \uc8fc\uc785\uc744 \ud558\uae30\uac00 \uc88b\uc2b5\ub2c8\ub2e4.<br \/>\n\uadf8\ub7ec\ubbc0\ub85c \u00a0Application\uc740 \uc2f1\uae00\ud1a4\uc73c\ub85c\uc11c\uc758 \uc5ed\ud560\uc744 \ud558\uace0,\u00a0@Component \uc560\ub178\ud14c\uc774\uc158 \uc774\uc6a9\ud574\u00a0Component\ub2e8\uc704\ub85c \uad6c\uc131\ud558\uace0,\u00a0\uadf8 \ud558\uc704\uc5d0\u00a0@Subcomponent \uc560\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud574\uc11c \uac1d\uccb4\uc8fc\uc785\uc744\u00a0\ud558\uac8c \ud569\ub2c8\ub2e4.<br \/>\n\uc544\ub798 \uc608\uc81c\uc5d0\uc11c\ub294 \ud558\ub098\uc758 \uc561\ud2f0\ube44\ud2f0\uac00 \ud504\ub808\uadf8\uba3c\ud2b8\ub97c \ud3ec\ud568\ud558\ub294\uacbd\uc6b0\uc5d0 \uc5b4\ub5a4\uc2dd\uc73c\ub85c \uac1d\uccb4\ub97c \uc8fc\uc785\ud558\ub294\uc9c0\uc5d0 \ub300\ud574\uc11c \ub2e4\ub8f9\ub2c8\ub2e4.<\/p>\n<h1>\uc548\ub4dc\ub85c\uc774\ub4dc\uc6a9 Dagger \uc608\uc81c<\/h1>\n<p>\uc6b0\uc120 AndroidInject\ub97c \ub9cc\ub4e4\uae30 \uc704\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud558\ub098 \ub9cc\ub4ed\ub2c8\ub2e4.<br \/>\n<span style=\"font-size: 16.0px; font-weight: bold;\">AppComponent.kt<\/span><\/p>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"d9dc55f3-7f71-4c15-8123-f7b9715ee621\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Singleton\r\n@Component(modules = [(AndroidSupportInjectionModule::class )])\r\ninterface AppComponent : AndroidInjector&lt;App&gt; {\r\n    @Component.Builder\r\n    abstract class Builder : AndroidInjector.Builder&lt;App&gt;()\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc778\ud130\ud398\uc774\uc2a4 \uba85\uce6d\uc740 \uc6d0\ud558\ub294\ub300\ub85c \uc9c0\uc5b4\ub3c4 \ub429\ub2c8\ub2e4. \ub2e8 ApplicationInject\ub97c \ub9cc\ub4e4\ub54c &#8220;Dagger&#8221;\ub77c\ub294 \uc811\ub450\uc0ac\uac00 \ubd99\ub294\ub2e4\ub294\uac83\ub9cc \uae30\uc5b5\ud558\uba74 \ub429\ub2c8\ub2e4. \uadf8\ub7ec\ubbc0\ub85c \uc778\ud130\ud398\uc774\uc2a4 \uba85\uc744 AppComponent\ub77c\uace0 \uc9d3\uace0\u00a0@Component\ub97c \ubd99\uc774\uba74\u00a0\uc560\ub178\ud14c\uc774\uc158 \ud504\ub85c\uc138\uc11c\uc5d0\uc758\ud574 \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ub418\ub294 \ud074\ub798\uc2a4\uba85\uc774 DaggerAppComponent\uac00 \ub420\uac83\uc785\ub2c8\ub2e4.\uc774\uac83\uc744 \uc774\uc6a9\ud558\uc5ec \uc544\ub798\uc5d0\uc11c AndroidInjecter\ub97c \uc0dd\uc131\ud560 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<h3>App.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"33cec921-e262-48fb-9c50-f2c3c745e91f\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">import dagger.android.support.DaggerApplication\r\n\u00a0\r\nclass App : DaggerApplication() {\r\n...\r\n    override fun applicationInjector(): AndroidInjector&lt;out DaggerApplication&gt; {\r\n        return DaggerAppComponent.builder().create(this)\r\n    }\r\n...\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4dc\ub294\ub370 Application\uc774 \uc544\ub2cc DaggerApplication\uc73c\ub85c \ub9cc\ub4ed\ub2c8\ub2e4.<br \/>\napplicationInjector() \uba54\uc18c\ub4dc\ub97c \uad6c\ud604\ud558\uac8c \ub418\ub294\ub370 \uc774\ub54c \uc704\uc5d0\uc11c \ub9cc\ub4e0 \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc774\uc6a9\ud558\uc5ec \uc548\ub4dc\ub85c\uc774\ub4dc \uc778\uc81d\ud130\ub97c \uc0dd\uc131\ud574\uc90d\ub2c8\ub2e4.<\/p>\n<h3>AndroidManifest.xml<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"9438b682-39e2-4bf6-9436-4e42fb9b5681\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:xhtml decode:true\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;manifest package=\"your.package.name\"\r\n          xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n          xmlns:tools=\"http:\/\/schemas.android.com\/tools\"&gt;\r\n...\r\n    &lt;application\r\n        ...\r\n        android:name=\".App\"\r\n        ...&gt;\r\n...\r\n    &lt;\/application&gt;\r\n&lt;\/manifest&gt;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5c8\uc73c\uba74 \uba54\ub2c8\ud398\uc2a4\ud2b8\uc5d0 \uc9c0\uc815\uc744 \ud574\uc90d\ub2c8\ub2e4<br \/>\n\uc774\uac83\uc73c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc2f1\uae00\ud1a4\uc774\ub77c \ubcf4\uace0 \ud6c4\uc5d0 \ud6c4\uc5d0 \uc678\ubd80\uc5d0\uc11c \uc0dd\uc131\ub418\ub294 \uac1d\uccb4\ub97c \uc8fc\uc785\ud558\ub294 \ud558\ub294 \uc778\uc81d\ud130 \uc0dd\uc131\uc744 \ub05d\ub0c8\uc2b5\ub2c8\ub2e4.<br \/>\n\uadf8\ub7fc \uc774\uc81c \uac1d\uccb4\uc758 \uc0dd\uc131\uc744 \ub2f4\ub2f9\ud560 Module\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<br \/>\nMainActivity\uc640 \uc561\ud2f0\ube44\ud2f0\uac00 \uac00\uc9c0\uace0 \uc788\ub294 MainFragment\uac00 \uc788\ub2e4\uace0 \uac00\uc815\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>MainActivityModule.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"9542c311-34f7-4c68-875a-9fef6c7286c0\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Module\r\nabstract class MainActivityModule {\r\n    @Module\r\n    companion object {\r\n        @JvmStatic\r\n        @Provides\r\n        @ActivityScope\r\n        fun provideMainActivityBinding(activity: MainActivity): MainActivityBinding {\r\n            return DataBindingUtil.setContentView(activity, R.layout.main_activity)\r\n        }\r\n    }\r\n   ...\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>@Module \uc560\ub178\ud14c\uc774\uc158\uacfc abstract class\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubaa8\ub4c8\ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4.<br \/>\n\uc561\ud2f0\ube44\ud2f0\uc5d0 \uc8fc\uc785\ub420 \uac1d\uccb4\ub294 static \uba54\uc18c\ub4dc\ub85c \uc0dd\uc131\ud574\uc57c\ud558\uba70\u00a0@Provide \uc560\ub178\ud14c\uc774\uc158\uc744 \ubd99\uc5ec\uc11c \uac1d\uccb4\uac00 \uc81c\uacf5\ub420\uac83\uc784\uc744 \uba85\uc2dc\uc801\uc73c\ub85c \uc54c\ub824\uc90d\ub2c8\ub2e4. \ud6c4\uc5d0 @Inject \uc560\ub178\ud14c\uc774\uc158\uc744 \ubd99\uc740 \uacf3\uc758 \ud0c0\uc785\uc744 \ud655\uc778\ud558\uace0\u00a0@Provide\ub97c \ud1b5\ud574 \uac1d\uccb4\uac00 \uc8fc\uc785\ub429\ub2c8\ub2e4.<br \/>\n\ud0c0\uc785\uc740 \uac19\uc740\ub370 \ub2e4\ub978 \uac1d\uccb4\uc758 \uc8fc\uc785\uc744 \uc6d0\ud558\ub294\uacbd\uc6b0\u00a0@Quailifier \uc560\ub178\ud14c\uc774\uc158\uc744 \uc774\uc6a9\ud558\uba74\ub429\ub2c8\ub2e4.<br \/>\n<span style=\"font-size: 10.0pt;\">\ud574\ub2f9 \uc561\ud2f0\ube44\ud2f0\uc5d0\uc11c\ub9cc \uac1d\uccb4\ub97c \uad00\ub9ac\ud560 \uac83\uc774\ubbc0\ub85c,\u00a0@ActivityScope\ub97c \ubd99\uc785\ub2c8\ub2e4.\u00a0<\/span><span style=\"font-size: 10.0pt;\">ActivityScope\uc740 \uc9c1\uc811 \ub9cc\ub4e4\uc5b4\uc918\uc57c \ud569\ub2c8\ub2e4. \ub9cc\ub4dc\ub294\uae40\uc5d0 FragmenScope\ub3c4 \ubbf8\ub9ac \ub9cc\ub4ed\uc2dc\ub2e4.<\/span><\/p>\n<h3>ActivityScope.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"ed752729-a547-481d-b6e2-e79f8fcf11d5\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Scope\r\n@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)\r\nannotation class ActivityScope<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>FragmentScope.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"1952cc55-6df1-4cfe-8861-e7623cb344fb\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Scope\r\n@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)\r\nannotation class FragmentScope<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>MainActivity.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"57d24389-ef8a-423e-a5a6-b0c7caeb102e\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true \">class MainActivity : DaggerAppCompatActivity() {\r\n    @Inject\r\n    lateinit var binding: MainActivityBinding\r\n...\r\n}\r\n<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>main_activity.xml<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"df00f439-bc70-4559-83b1-0bca2de48f15\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:xhtml decode:true\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;layout\r\n    xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\r\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"&gt;\r\n    &lt;data&gt;\r\n    &lt;\/data&gt;\r\n    &lt;android.support.constraint.ConstraintLayout\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"match_parent\"&gt;\r\n       ...\r\n    &lt;\/android.support.constraint.ConstraintLayout&gt;\r\n&lt;\/layout&gt;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>MainActivity\ub294 DaggerAppCompatActivity\ub97c \uc0c1\uc18d\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4. DaggerAppCompatActivity\ub97c \uc0c1\uc18d\ud558\uae30\ub97c \uc6d0\uce58 \uc54a\ub294 \uacbd\uc6b0\uc5d0\ub294 onCreate\uc5d0\uc11c \uc9c1\uc811 AndroidInjection.inject(this@MainActivity)\ub97c \ud638\ucd9c\ud574\uc57c \ud569\ub2c8\ub2e4.<br \/>\nMainActivityModule \uc5d0\uc11c \ub9cc\ub4e0 MainActivityBinding\uac1d\uccb4\uac00 inject()\ub97c \ud638\ucd9c\ud558\ub294 \uc2dc\uc810\uc5d0 MainActivity\ub0b4\uc758 binding\ubcc0\uc218\uc5d0 \ucd08\uae30\ud654\ub418\ub294\uac83\uc744 \ud655\uc778 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc544\uc9c1\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub808\ubca8\uc758 \ucef4\ud3ec\ub10c\ud2b8\uc5d0\uc11c \ud574\ub2f9\uc561\ud2f0\ube44\ud2f0\uc5d0 \ub300\ud55c \uc815\ubcf4\uac00 \uc5c6\uc73c\ubbc0\ub85c \uc778\uc81d\uc158\uc774 \uc2e4\uc81c\ub85c\ub294 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<br \/>\nAppComponent\ub97c \uc218\uc815\ud574\ubd05\uc2dc\ub2e4.<\/p>\n<h3>AppComponent.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"512b39ba-7ada-4dbc-aad7-6ccb59753f2e\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Singleton\r\n@Component(modules = [(AndroidSupportInjectionModule::class, ActivityModule::class)])\r\ninterface AppComponent : AndroidInjector&lt;App&gt; {\r\n    @Component.Builder\r\n    abstract class Builder : AndroidInjector.Builder&lt;App&gt;()\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>ActivityModule \ud074\ub798\uc2a4\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>ActivityModule.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"12b3889b-35c9-4e8a-8516-2d66cc0d228d\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Module\r\nabstract class ActivityModule {\r\n    @ActivityScope\r\n    @ContributesAndroidInjector(modules = [(MainActivityModule::class)])\r\n    abstract fun getMainActivity(): MainActivity\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc561\ud2f0\ube44\ud2f0\uac00 \ucd94\uac00\ub420\ub54c\ub9c8\ub2e4 \uc55e\uc73c\ub85c ActivityModule\uc5d0 \uc704\uc640 \uac19\uc774 \ud574\ub2f9 \uc561\ud2f0\ube44\ud2f0\ub97c \ubc18\ud658\ud558\ub294 abstract \uba54\uc18c\ub4dc\ub97c \ub9cc\ub4e4\uba74 \ub429\ub2c8\ub2e4.<br \/>\n\uc561\ud2f0\ube44\ud2f0 \uc0dd\uba85\uc8fc\uae30\uc5d0 \ub9de\ucd94\uc5b4 \uac1d\uccb4\ub97c \uad00\ub9ac \ud558\uae30 \uc704\ud574\u00a0<span style=\"font-size: 10.0pt;\">@ActivityScope \uc560\ub178\ud14c\uc774\uc158\uc774 \uc788\uc73c\uba70,\u00a0@ContirubutesAndroidInjector \uc560\ub178\ud14c\uc774\uc158\uc740 \ubc18\ud658\ud558\ub294 \uac1d\uccb4\uac00 \uc0dd\uc131\ub418\ub294 \uc2dc\uc810\uc5d0 injection\uc744 \uc81c\uacf5\ud560 \ubaa8\ub4c8\uc744 \uba85\uc2dc\ud569\ub2c8\ub2e4. \uc704\uc5d0\uc11c MainActivityBinding\uac1d\uccb4\ub97c \uc8fc\uc785\ud558\uae30 \uc704\ud574 MainActivityModule\uc744 \uc0dd\uc131\ud55c \uac83\uc744 \uae30\uc5b5\ud558\uc2e4 \uac81\ub2c8\ub2e4. \uc774\ub7f0\uc2dd\uc73c\ub85c ContirubutesAndroidInjector \uc560\ub178\ud14c\uc774\uc158\uc744 \uc368\uc11c\u00a0\uad6c\uc131\ud558\ub294 \uc774\uc720\ub294 \ub2e4\ub978 \uac1d\uccb4\uc640 \ub2ec\ub9ac \uc548\ub4dc\ub85c\uc774\ub4dc \ud504\ub808\uc784\uc6cc\ud06c \ucef4\ud3ec\ub10c\ud2b8(Activity, Service \ub4f1)\ub294 \uac1c\ubc1c\uc790\uac00 \uc0dd\uc131\uc790\ub97c \ud1b5\ud574 \u00a0\uac1d\uccb4\ub97c \uc0dd\uc131\ud558\ub294\uac83\uc774 \uc544\ub2cc \uc804\uc801\uc73c\ub85c \uc548\ub4dc\ub85c\uc774\ub4dc \uc2dc\uc2a4\ud15c\uc774 \uad00\ub9ac\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.\u00a0<\/span><br \/>\n\uc774\uc81c Run\uc744 \ub20c\ub7ec \uc571\uc744 \uc2e4\ud589\ud558\uba74, MainActivity\uc758 binding\ubcc0\uc218\uac00 onCreate()\ub54c \uac1d\uccb4\uac00 \uc8fc\uc785\ub418\ub294\uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<table class=\"wysiwyg-macro\" data-macro-name=\"info\" data-macro-id=\"8e16d231-cca0-41ab-bada-ac795c086f5b\" data-macro-schema-version=\"1\" data-macro-body-type=\"RICH_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2luZm99&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<p>NonExistentClass \uad00\ub828 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74 build.gradle\uc5d0 \ub2e4\uc74c \ub0b4\uc6a9\uc744 \ucd94\uac00 \ud574\ubcf4\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">kapt {\r\n    correctErrorTypes = true\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\ud504\ub808\uadf8\uba3c\ud2b8\ub3c4 \ucd94\uac00\ud574\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>MainFragment.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"13f9acc4-ad76-4175-bc98-1017ea8c0128\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">class MainFragment : DaggerFragment() {\r\n    @Inject\r\n    lateinit var binding: MainFragmentBinding\r\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = binding.root\r\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\r\n        super.onViewCreated(view, savedInstanceState)\r\n        binding.textView.text = \"Hello World!!\"\r\n    }\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>main_fragment.xml<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"f7fc6092-0176-4947-8297-29e9811ddd11\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:xhtml decode:true\">&lt;layout xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"&gt;\r\n    &lt;data&gt;\r\n    &lt;\/data&gt;\r\n    &lt;android.support.constraint.ConstraintLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n                                                 android:layout_width=\"match_parent\"\r\n                                                 android:layout_height=\"match_parent\"&gt;\r\n        &lt;TextView\r\n            android:id=\"@+id\/text_view\"\r\n            android:layout_width=\"wrap_content\"\r\n            android:layout_height=\"wrap_content\"\r\n            app:layout_constraintBottom_toBottomOf=\"parent\"\r\n            app:layout_constraintLeft_toLeftOf=\"parent\"\r\n            app:layout_constraintRight_toRightOf=\"parent\"\r\n            app:layout_constraintTop_toTopOf=\"parent\"\/&gt;\r\n    &lt;\/android.support.constraint.ConstraintLayout&gt;\r\n&lt;\/layout&gt;\r\n<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>MainFragmentModule.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"38daa858-33fe-41cf-be7f-7942cf766255\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Module\r\nclass MainFragmentModule {\r\n    @Provides\r\n    @FragmentScope\r\n    fun provideMainFragmentBinding(activity: MainActivity): MainFragmentBinding {\r\n        return DataBindingUtil.inflate&lt;MainFragmentBinding&gt;(\r\n                activity.layoutInflater,\r\n                R.layout.main_fragment,\r\n                null,\r\n                false\r\n        )\r\n    }\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: 16.0px; font-weight: bold;\">MainActivityModule.kt<\/span><\/p>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"3f7d7dbf-5af4-4efe-86e8-d087ae2e9f6f\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Module\r\nabstract class MainActivityModule {\r\n    @Module\r\n    companion object {\r\n        @JvmStatic\r\n        @Provides\r\n        @ActivityScope\r\n        fun provideMainActivityBinding(activity: MainActivity): MainActivityBinding {\r\n            return DataBindingUtil.setContentView(activity, R.layout.main_activity)\r\n        }\r\n    }\r\n    @FragmentScope\r\n @ContributesAndroidInjector(modules = [(MainFragmentModule::class)])\r\n abstract fun getMainFragment(): MainFragment\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\ud504\ub808\uadf8\uba3c\ud2b8\ub294 \uc561\ud2f0\ube44\ud2f0\uc5d0 \uc18d\ud558\uc9c0\ub9cc, \ub3c5\ub9bd\uc801\uc778 \uc0dd\uba85\uc8fc\uae30\ub97c \uac00\uc9c0\ubbc0\ub85c scope\ub97c \ub530\ub85c \uad00\ub9ac\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\ub2e4\uc2dc run \uc744 \ud574\ubcf4\uba74 Hello World\uac00 \ucd9c\ub825\ub418\ub294\uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\uc774\ubc88\uc5d4\u00a0@Singleton \uc73c\ub85c \uad00\ub9ac\ud560 \uac1d\uccb4\ub4e4\uc744 \uc704\ud55c \ubaa8\ub4c8\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<br \/>\n\uac1d\uccb4\ub97c @Provide\ud560\ub54c scope\ub97c\u00a0@Singleton\uc73c\ub85c \uc124\uc815\ud574\uc8fc\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<h3>AppModule.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"15e0e321-2501-4e2d-a7b2-579a98cbc7cf\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Module\r\nclass AppModule {\r\n    @Provides\r\n    @Singleton\r\n    fun provideHelloWorld() = \"Hello World!!\"\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AppComponent.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"46333682-4474-4911-b7ce-4ba11b28aad6\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Singleton\r\n@Component(modules = [(AndroidSupportInjectionModule::class), (ActivityModule::class), (AppModule::class)])\r\ninterface AppComponent : AndroidInjector&lt;App&gt; {\r\n    @Component.Builder\r\n    abstract class Builder : AndroidInjector.Builder&lt;App&gt;()\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>MainFragment.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"888058a5-634c-43b7-8647-77edb16163a2\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">class MainFragment : DaggerFragment() {\r\n    @Inject\r\n    lateinit var binding: MainFragmentBinding\r\n   @Inject\r\n lateinit var txtHelloWorld: String\r\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = binding.root\r\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\r\n        super.onViewCreated(view, savedInstanceState)\r\n        binding.textView.text = txtHelloWorld\r\n    }\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>run \ud574\ubcf4\uba74 Hello World!! \uac00 \ucd9c\ub825\ub418\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\nDagger\uc5d0\uc11c\ub294 \ud0c0\uc785\uc744 \ubcf4\uace0 \uc778\uc81d\uc158\uc774 \ub4e4\uc5b4\uac00\ub294\ub370 \ud0c0\uc785\uc774 String \uac19\uc740 \ubc94\uc6a9\uc801\uc778 \ud0c0\uc785\uc77c \uacbd\uc6b0 \uc911\ucca9\ub420 \uacbd\uc6b0\uac00 \uc0dd\uae38\uc218\ub3c4 \uc788\uaca0\uc8e0?<br \/>\n\uadf8\ub7f4\uacbd\uc6b0 @Qualifier \uc560\ub178\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<h3>Qualifiers.kt<\/h3>\n<p>\uae30\ubcf8\uc801\uc73c\ub85c \uc790\ubc14\uc5d0 \ud3ec\ud568\ub41c Qualifier\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<br \/>\n\uc6d0\ud55c\ub2e4\uba74 \uc790\uc2e0\ub9cc\uc758 Custom Qualifier\ub97c \ub9cc\ub4e4 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"b54d52db-88ff-4b51-a699-092653535532\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Qualifier\r\n@MustBeDocumente\r\n@Retention(AnnotationRetention.RUNTIME)\r\nannotation class Named(val value: String = \"\")<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>AppModule.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"eb3a1818-d2e1-4711-b1fb-77e928d9abe0\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true\">@Module\r\nclass AppModule {\r\n    @Named(\"hello\")\r\n    @Provides\r\n    fun provideHelloWorld() = \"Hello World!!\"\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc8fc\uc785\ud558\uace0\uc790 \ud558\ub294 \uac1d\uccb4\uc5d0 \uc218\uc2dd\uc5b4\uad6c\ub97c \ubd99\uc785\ub2c8\ub2e4.<\/p>\n<h3>MainFragment.kt<\/h3>\n<table class=\"wysiwyg-macro\" data-macro-name=\"code\" data-macro-id=\"2ba61ccb-8da9-4b87-8bcc-2028db5aae39\" data-macro-schema-version=\"1\" data-macro-body-type=\"PLAIN_TEXT\" style=\"background-image: url('http:\/\/wiki.navercorp.com\/plugins\/servlet\/confluence\/placeholder\/macro-heading?definition=e2NvZGV9&amp;locale=ko_KR&amp;version=2'); background-repeat: no-repeat;\">\n<tbody>\n<tr>\n<td class=\"wysiwyg-macro-body\">\n<pre class=\"lang:java decode:true \">class MainFragment @Inject constructor() : DaggerFragment() {\r\n    @Inject\r\n    lateinit var binding: MainFragmentBinding\r\n    @Inject\r\n    @field:Named(\"hello\")\r\n    lateinit var txtHelloWorld: String\r\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = binding.root\r\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\r\n        super.onViewCreated(view, savedInstanceState)\r\n        binding.textView.text = txtHelloWorld\r\n    }\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#8220;hello&#8221;\ub77c\ub294 \ud0a4\uc6cc\ub4dc\ub97c \ub530\ub77c \uac1d\uccb4\uac00 \uc8fc\uc785\ub418\ub294\uac83\uc744 \ud655\uc778 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubcf8 \ud3ec\uc2a4\ud2b8 \uc804\uccb4\uc18c\uc2a4\ub294 <a href=\"https:\/\/github.com\/Charlezz\/DaggerTutorial\">github<\/a>\uc5d0\uc11c \ud655\uc778 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Who should read? \uc774\uc81c \ub9c9 \uc548\ub4dc\ub85c\uc774\ub4dc\ub97c \ubc30\uc6b0\uace0 \uc788\ub294 \uac1c\ubc1c\uc790\uc5d0\uac8c\ub294 \ucd94\ucc9c\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc548\ub4dc\ub85c\uc774\ub4dc\ub97c \uac1c\ubc1c\uc744 \uc5b4\ub290\uc815\ub3c4 \ud574\ubd24\uace0, \ub0b4\uac00 \uc911\uae09\uac1c\ubc1c\uc790 \uc774\uc0c1\uc774 \ub418\uace0 \uc2f6\ub2e4 \ud558\uc2dc\ub294\ubd84\uc740 \uc798 \uc624\uc168\uc2b5\ub2c8\ub2e4. \uc790\ubc14\uc640 \uac1d\ucc44\uc9c0\ud5a5\uac1c\ub150\uc5d0 \ub300\ud574\uc11c \uce5c\uc219\ud558\ub2e4\uba74 \ud070 \uc5b4\ub824\uc6c0\uc774 \uc5c6\uc744 \uac81\ub2c8\ub2e4. Welcome to Dagger World\u00a0 Dependency Injection\uc774\ub780 \ubb34\uc5c7\uc77c\uae4c? \ud55c\uad6d\ub9d0\ub85c \ud558\uc790\uba74 Dependency\ub294 \uc758\uc874\uc131\uc774\uace0, Injection\uc740 \uc8fc\uc785\uc774\ub2e4. \uc758\uc874\uc131\uc774\ub780? \ucf54\ub4dc\uc5d0\uc11c \ub450 \ubaa8\ub4c8\uac04\uc758 \uc5f0\uacb0 [&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":[16],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/428"}],"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=428"}],"version-history":[{"count":11,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/428\/revisions"}],"predecessor-version":[{"id":1214,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/428\/revisions\/1214"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}