{"id":730,"date":"2018-09-02T20:56:44","date_gmt":"2018-09-02T11:56:44","guid":{"rendered":"http:\/\/www.charlezz.com\/?p=730"},"modified":"2018-09-02T21:01:25","modified_gmt":"2018-09-02T12:01:25","slug":"koin%ea%b3%bc-%ed%95%a8%ea%bb%98-%ed%95%98%eb%8a%94-%ec%95%88%eb%93%9c%eb%a1%9c%ec%9d%b4%eb%93%9c-%ec%9d%98%ec%a1%b4%ec%84%b1-%ec%a3%bc%ec%9e%85","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=730","title":{"rendered":"Koin\uacfc \ud568\uaed8 \ud558\ub294 \uc548\ub4dc\ub85c\uc774\ub4dc \uc758\uc874\uc131 \uc8fc\uc785"},"content":{"rendered":"<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.charlezz.com\/wordpress\/wp-content\/uploads\/2018\/09\/banner_2000-1024x355.png\" alt=\"\" width=\"750\" height=\"260\" class=\"aligncenter size-large wp-image-731\" srcset=\"https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/09\/banner_2000-1024x355.png 1024w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/09\/banner_2000-300x104.png 300w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/09\/banner_2000-768x266.png 768w, https:\/\/charlezz.com\/wordpress\/wp-content\/uploads\/2018\/09\/banner_2000.png 2026w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/p>\n<h1>Introduction<\/h1>\n<p>Koin\uc740 \ucf54\ud2c0\ub9b0 \uac1c\ubc1c\uc790\ub97c \uc704\ud55c \uc2e4\uc6a9\uc801\uc778 API\uc81c\uacf5\uc744 \ud558\ub294 \uacbd\ub7c9\ud654\ub41c \uc758\uc874\uc131 \uc8fc\uc785 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4.<br \/>\n(\uc790\ubc14 \uac1c\ubc1c\uc790 \ub610\ub294 \uc758\uc874\uc131 \uc8fc\uc785\uc5d0 \ub300\ud574\uc11c \uc54c\uace0 \uc2f6\ub2e4\uba74 <a href=\"https:\/\/www.charlezz.com\/?p=428\">Dagger \ud3ec\uc2a4\ud2b8<\/a>\ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694)\u00a0<\/p>\n<p>\uc21c\uc218 \ucf54\ud2c0\ub9b0\uc73c\ub85c\ub9cc \uc791\uc131\ub418\uc5b4\uc788\uc73c\uba70 \ud504\ub85d\uc2dc, \uc560\ub178\ud14c\uc774\uc158 \ud504\ub85c\uc138\uc2f1\uc744 \ud1b5\ud55c \ucf54\ub4dc \uc0dd\uc131, \ub9ac\ud50c\ub809\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uac00\ubccd\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>Android Gradle\uc124\uc815(<a href=\"https:\/\/github.com\/InsertKoinIO\/koin\">https:\/\/github.com\/InsertKoinIO\/koin<\/a>)<\/h4>\n<pre class=\"lang:java decode:true  \">def koin_version=\"0.9.3\" \/\/ \ucd5c\uc2e0\ubc84\uc804\uc740 \uc704\uc758 github\ub9c1\ud06c \ucc38\uc870\r\nimplementation \"org.koin:koin-android:$koin_version\"<\/pre>\n<h4>\uc65c DSL\uc744 \uc0ac\uc6a9\ud588\uc744\uae4c?<\/h4>\n<p>\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 DSL\uc744 \uc81c\uacf5\ud558\uae30\ub54c\ubb38\uc5d0 \uc560\ub178\ud14c\uc774\uc158\uc744 \ud1b5\ud55c \ucf54\ub4dc \uc0dd\uc131 \ub300\uc2e0 DSL\uc744 \ud65c\uc6a9\ud558\uc5ec, \uc758\uc874\uc131\uc744 \uc8fc\uc785\uc744 \ud558\uae30\uc704\ud55c \ub611\ub611\ud558\uace0 \uc2e4\uc6a9\uc801\uc778 API\ub97c \ub9cc\ub4e4\uc5b4\ub0bc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>Koin DSL<\/h4>\n<h4>Koin\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 DSL \ud0a4\uc6cc\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4<\/h4>\n<ul>\n<li><code>applicationContext<\/code> &#8211; Koin \ubaa8\ub4c8 \uc0dd\uc131<\/li>\n<li><code>factory<\/code> -\uc778\uc2a4\ud134\uc2a4 \uc81c\uacf5 (\ub9e4\ubc88 \uc0dd\uc131)<\/li>\n<li><code>bean<\/code> &#8211; \uc2f1\uae00\ud1a4 \uc778\uc2a4\ud134\uc2a4 \uc81c\uacf5<\/li>\n<li><code>bind<\/code> &#8211; \uc8fc\uc5b4\uc9c4 \uc778\uc2a4\ud134\uc2a4\uc640 \ucd94\uac00\uc801\uc778 \ud0c0\uc785\uc744 \ubc14\uc778\ub529 \ud560 \ub54c \uc4f0\uc784<\/li>\n<li><code>get<\/code> &#8211; \ucef4\ud3ec\ub10c\ud2b8\ub0b4\uc5d0\uc11c \uc54c\ub9de\uc740 \uc758\uc874\uc131\uc744 \uc8fc\uc785\ubc1b\uc74c<\/li>\n<li><code>getProperty<\/code> &#8211; \uc18d\uc131\uc744 \uac00\uc838\uc634<\/li>\n<li><code>context<\/code> &#8211; \ub17c\ub9ac\uc801 context\ub97c \uc120\uc5b8\ud55c\ub2e4.<\/li>\n<\/ul>\n<h4>\ubaa8\ub4c8\uc0dd\uc131\ud558\uae30<\/h4>\n<p>Koin\ubaa8\ub4c8\uc740 applicationContext\ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \uc0dd\uc131\ud560 \uc218 \uc788\uc73c\uba70 \ubaa8\ub4e0 \ucef4\ud3ec\ub10c\ud2b8\ub97c \ud55c\ubc88\uc5d0 \uc815\uc758 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">val myModule = applicationContext {\r\n    \/\/\uc774\uacf3\uc5d0\uc11c \uc758\uc874\uc131\uc8fc\uc785\uc744 \uc704\ud55c \ucef4\ud3ec\ub10c\ud2b8 \uc0dd\uc131\uc744 \ud569\ub2c8\ub2e4\r\n}<\/pre>\n<p><strong>bean<\/strong>\ub610\ub294 <strong>factory<\/strong> \ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc815\uc758\ud560\uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li><code>bean<\/code> &#8211; \uc2f1\uae00\ud1a4 \uc0dd\uc131( \uc778\uc2a4\ud130\uc2a4\ub97c \ud55c\uac1c\ub9cc \uc0dd\uc131)<\/li>\n<li><code>factory<\/code> &#8211; \ub9e4\ubc88 \uc778\uc2a4\ud134\uc2a4 \uc0dd\uc131<\/li>\n<\/ul>\n<h4>\uc2f1\uae00\ud1a4\uc744 \ub9cc\ub4e4\uc5b4\ubd05\uc2dc\ub2e4<\/h4>\n<p>bean\ud0a4\uc6cc\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc544\ub798\uc640 \uac19\uc774 \uc815\uc758 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">class Repository()\r\n\r\nval myModule = applicationContext {\r\n    \/\/Repository\ub77c\ub294 \ub2e8\uc77c \uc778\uc2a4\ud134\uc2a4\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.\r\n    bean { Repository() }\r\n}\r\n<\/pre>\n<p>\uac1d\uccb4\uc0dd\uc131\uacfc \ud568\uaed8 Koin\uc774 \uc774 \uac1d\uccb4\ub97c \uc2f1\uae00\ud1a4\uc73c\ub85c \uad00\ub9ac\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<h4>factory\ud0a4\uc6cc\ub4dc\ub85c \ucef4\ud3ec\ub10c\ud2b8 \ub9cc\ub4e4\uae30<\/h4>\n<pre class=\"lang:java decode:true\">class Controller()\r\n\r\nval myModule = module {\r\n    \/\/ \uc758\uc874\uc131 \uc8fc\uc785\uc744 \ud560 \ub54c\ub9c8\ub2e4 Controller\uac1d\uccb4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4\r\n    factory { Controller() }\r\n}<\/pre>\n<p>factory\ud0a4\uc6cc\ub4dc\ub97c \uc0ac\uc6a9\ud560 \uc2dc Koin\uc740 \uc758\uc874\uc131 \uc8fc\uc785\uc774 \uc77c\uc5b4\ub0a0\ub54c\ub9c8\ub2e4 \uac1d\uccb4\ub97c \uc0dd\uc131\ud558\uba70, \ud574\ub2f9 \uac1d\uccb4\ub97c \ubcf4\uad00 \ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>\ub9cc\ub4e0 \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc774\uc6a9\ud574\uc11c \uc758\uc874\uc131 \uc8fc\uc785\ud574\ubcf4\uae30<\/h4>\n<p>\ubaa8\ub4c8\uc5d0\uc11c \ub9cc\ub4e0 \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc8fc\uc785\ud558\uae30\uc704\ud574\uc11c\ub294 <strong>get()<\/strong>\ud568\uc218\ub9cc \uae30\uc5b5\ud558\uba74 \ub429\ub2c8\ub2e4.\u00a0 \uc608\uc81c\ub97c \ud655\uc778\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">class Repository()\r\nclass MyPresenter(val repo : Repository)\r\n\r\nval myModule = applicationContext {\r\n    \/\/ \uc2f1\uae00\ud1a4\uc73c\ub85c \ub9cc\ub4e4\uc5b4\uc9c4 Repository\uac1d\uccb4\r\n    bean { Repository() }\r\n    \/\/ get()\uc73c\ub85c\ubd80\ud130 Repository\uac1d\uccb4\ub97c \uc8fc\uc785\ubc1b\uc544 MyPresenter\ub97c \uc0dd\uc131\ud55c\ub2e4.\r\n    bean { MyPresenter(get()) }\r\n}<\/pre>\n<p>Repository\uac1d\uccb4\ub97c \uc2f1\uae00\ud1a4\uc73c\ub85c \ub9cc\ub4e4\uc5b4\ub450\uc5c8\uae30 \ub54c\ubb38\uc5d0 get()\ud568\uc218\ub97c \ud638\ucd9c\ud558\uba74 \ud0c0\uc785\ucd94\ub860\uc744 \ud1b5\ud574 \uc774\ubbf8 \uc0dd\uc131\ub41c \uac1d\uccb4\ub97c \ucc38\uc870\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<h4>\uc778\ud130\ud398\uc774\uc2a4 \ubc14\uc778\ub529\ud558\uae30<\/h4>\n<p>bean \ub610\ub294 factory\ub294 \ub78c\ub2e4\uc2dd\ub0b4\uc5d0\uc11c \uc0ac\uc6a9\ud55c \ud0c0\uc785\uc5d0 \uc758\ud574 \ud0c0\uc785\uc774 \uacb0\uc815\ub429\ub2c8\ub2e4.\u00a0 \uc77c\uce58\ud558\ub294 \ud0c0\uc785\uc774 \uc788\uc744 \uacbd\uc6b0\uc5d0 \uc8fc\uc5b4\uc9c4 \uac1d\uccb4\ub97c \uc8fc\uc785\ud558\ub294\ub370, \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud0c0\uc785\uc73c\ub85c \ud558\ub294 \uac1d\uccb4\ub97c \uc8fc\uc785 \ud558\ub824\ub294 \uacbd\uc6b0 \uc774\ub97c \uc0c1\uc18d\ud55c \uad6c\ud604\uccb4\ub97c \uc8fc\uc785\ud560\uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \uc608\uc81c\ub97c \ud655\uc778\ud574\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">\/\/\uc778\ud130\ud398\uc774\uc2a4 \uc815\uc758\r\ninterface Repository{\r\n    fun loadData()\r\n}\r\n\r\n\/\/ Repository \uc778\ud130\ud398\uc774\uc2a4 \uad6c\ud604\uccb4 \r\nclass RepositoryImp() : Repository{\r\n    fun loadData() { ... }\r\n}<\/pre>\n<p>Koin \ubaa8\ub4c8\ub0b4\uc5d0\uc11c as \ud0a4\uc6cc\ub4dc\ub97c \ud1b5\ud574 \ub2e4\uc74c\uacfc \uac19\uc774 \uc778\ud130\ud398\uc774\uc2a4 \uad6c\ud604\uccb4\ub97c \ubc14\uc778\ub529\uc744 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4<\/p>\n<pre class=\"lang:java decode:true\">val myModule = module {\r\n    \/\/ RepositoryImp\uac1d\uccb4 \uc2f1\uae00\ud1a4\uc73c\ub85c \uc0dd\uc131\ud558\ubbc0\ub85c Repostiory\uc5d0\ub294 \ub9e4\uce6d\uc774 \ub418\uc9c0 \uc54a\uc74c\r\n    bean { RepositoryImp() }\r\n\r\n    \/\/ Repository \uc778\ud130\ud398\uc774\uc2a4\ub85c \ubc14\uc778\ub529\r\n    bean { RepositoryImp() as Repository }\r\n\r\n}<\/pre>\n<p>\uba87\uba87 \uacbd\uc6b0\uc5d0 \ud55c\ud574\uc11c \uc5ec\ub7ec\uac00\uc9c0 \ud0c0\uc785\uc744 \ud558\ub098\uc758 \uc815\uc758\ub85c \ub9e4\uce6d \uc2dc\ud0a4\uae38 \uc6d0\ud560 \ub54c\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7f4 \ub54c \uc5b4\ub5bb\uac8c \ud558\ub294\uc9c0 \uc0b4\ud3b4\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">\/\/ Repository \uc778\ud130\ud398\uc774\uc2a4\r\ninterface Repository{\r\n    fun doSomething()\r\n}\r\n\r\n\/\/ Repository \uad6c\ud604\uccb4\r\nclass RepositoryImp() : Repository{\r\n    fun doSomething() { ... }\r\n}<\/pre>\n<p>\uc774\ub7f0 \uacbd\uc6b0 bind\uc5f0\uc0b0\uc790\ub97c \ud1b5\ud574 \ucd94\uac00\uc801\uc778 \ud0c0\uc785\uc744 \ubc14\uc778\ub529 \ud560 \uc218\ub3c4\uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">val myModule = module {\r\n    bean { RepositoryImp() } bind Repository::class\r\n}<\/pre>\n<h4>\ucef4\ud3ec\ub10c\ud2b8 \ud0c0\uc785\uc774 \uc911\ucca9\ub418\ub294\uacbd\uc6b0 \uc774\ub984\uc73c\ub85c \uad6c\ubd84\ud558\uae30<\/h4>\n<p>\uac19\uc740 \ud0c0\uc785\uc778\ub370 \uc11c\ub85c \ub2e4\ub974\uac8c \uc758\uc874\uc131\uc774 \uc8fc\uc785\ub418\uc5b4\uc57c \ud558\ub294 \uacbd\uc6b0\uac00 \uc788\uc2b5\ub2c8\ub2e4. Dagger\uc5d0\uc11c\ub294 \uc774\ub7f0\uacbd\uc6b0 Named \uc560\ub178\ud14c\uc774\uc158\uc73c\ub85c \uad6c\ubd84\ud558\uc8e0. Koin\uc5d0\uc11c\ub294 bean\uc774\ub098\u00a0 factory\uc758 \uc778\uc790\ub85c \uc774\ub984\uc744 \ub123\uc5b4 \uc8fc\uba74 \ub429\ub2c8\ub2e4. \uc608\uc81c\ub97c \ud655\uc778\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">val myModule = module {\r\n    bean(\"default\") { \"Hello World\" }\r\n    single(\"test\") { \"My name is Charlezz\" }\r\n}\r\n\r\nval str : String by inject(name = \"default\")<\/pre>\n<p>\uc704\uc758 \uacbd\uc6b0 Koin\ub0b4\uc5d0\uc11c String \uac1d\uccb4\ub97c \uc2f1\uae00\ud1a4\uc73c\ub85c \ub450\uac00\uc9c0 \uad00\ub9ac\ud558\ub098 \uc2e4\uc81c\ub85c \uc8fc\uc785\ub418\ub294 \uac1d\uccb4\ub294 name\uc744 key \uc8fc\uc785\ub418\uae30\ub54c\ubb38\uc5d0 Hello World\uac00 str\uc5d0 \ucd08\uae30\ud654 \ub418\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<h4>get()\uc744 \uc774\uc6a9\ud55c \uc758\uc874\uc131 \uc8fc\uc785\ud558\uae30<\/h4>\n<p>Koin\uc740 get()\uc744 \ud638\ucd9c\ud558\ub294 \uac83\ub9cc\uc73c\ub85c \uc801\ub2f9\ud55c \uac1d\uccb4\ub97c \ucc3e\uc544 \uc8fc\uc785\ud558\uac8c \ub429\ub2c8\ub2e4.\u00a0<\/p>\n<pre class=\"lang:java decode:true\">class ComponentA()\r\nclass ComponentB(val componentA : ComponentA)\r\n\r\nval myModule = applicationContext {\r\n   bean { ComponentA() }\r\n   bean { ComponentB(<strong>get()<\/strong>) }\r\n}<\/pre>\n<p>\uc704\uc758 \uc608\uc81c\ub97c \ubcf4\uba74 ComponentB\uc758 \uc0dd\uc131\uc790\uc5d0 \ub300\ud55c \ub9e4\uac1c\ubcc0\uc218\ub85c ComponentA\ub97c \ubc1b\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub54c \ubbf8\ub9ac \uc815\uc758\ud574\ub454 ComponentA\uac1d\uccb4\uac00 \uc788\ub2e4\uba74 \uc0dd\uc131\uc790\uc5d0 get()\uc744 \ud638\ucd9c\ud558\uc5ec \uac04\ub2e8\ud788 \uac1d\uccb4\ub97c \uc8fc\uc785\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>\ub2e4\uc218\uc758 \ubaa8\ub4c8 \uc0ac\uc6a9\ud558\uae30<\/h4>\n<p>Koin\uc5d0\uc11c\ub294 \ubaa8\ub4e0 \ubaa8\ub4c8\uc5d0\ub300\ud55c \uc815\uc758\ub294 \ub2a6\uc740 \ucd08\uae30\ud654(lazy init)\uac00 \uae30\ubcf8\uac12\uc785\ub2c8\ub2e4. \uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc0ac\uc6a9\uc790\ub294 \ud544\uc694\ub85c\ud558\ub294 \uc5ec\ub7ec \ubaa8\ub4c8\ub4e4\uc744 \uc870\ud569\ud574\uc11c \uc0ac\uc6a9\ud558\ub294\uac83\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4. \uc544\ub798\uc758 \uc608\uc81c\ub97c \ud655\uc778\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true\">class ComponentA()\r\nclass ComponentB(val componentA:ComponentA)<\/pre>\n<div class=\"highlight highlight-source-kotlin\">\n<pre class=\"lang:java decode:true\">val myModule1 = applicationContext {\r\n   bean { ComponentA() }\r\n}<\/pre>\n<\/div>\n<div class=\"highlight highlight-source-kotlin\">\n<pre class=\"lang:java decode:true\">val myModule2 = applicationContext {\r\n   bean { ComponentB(get()) }\r\n}<\/pre>\n<p>\ub2e4\uc74c\uacfc \uac19\uc774 myModule1\ubaa8\ub4c8\uacfc myModule2\ubaa8\ub4c8\uc744 \ubd84\ub9ac\ud558\uc5ec \uc815\uc758\ud558\uc5ec\ub3c4 \uc0c1\ud638\uac04\uc5d0 \uc870\ud569 or \ucc38\uc870\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:java decode:true \">startKoin(this, listOf(myModule1, myModule2)) \/\/\ub2e4\uc218\uc758 \ubaa8\ub4c8 \uc0ac\uc6a9<\/pre>\n<\/div>\n<h1>Conclusion<\/h1>\n<p>Dagger2\uc640 \ube44\uad50\ud588\uc744\ub54c \ud655\uc2e4\ud788 \uac00\ubccd\ub2e4\ub294 \ub290\ub08c\uc744 \ubc1b\uc558\uc73c\uba70, \uc0ac\uc6a9\ubc95 \ub610\ud55c \uc26c\uc6e0\uc2b5\ub2c8\ub2e4. \ub610\ud55c \uc544\ud0a4\ud14d\ucc98 \ucef4\ud3ec\ub10c\ud2b8\uc758 ViewModel\uc744 \uc774\uc6a9\ud558\uae30 \uc704\ud574 \ubcc4\ub3c4\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub3c4 \uc81c\uacf5\ud558\uace0 \uc788\uc5b4 \uc190\uc27d\uac8c MVVM\ud328\ud134\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc544\uc9c1 UIController\ubcc4 Scope\uad00\ub9ac \ub77c\ub358\uc9c0 Compile\uc2dc\uac04\uc5d0 \uc624\ub958\ub97c \ud655\uc778\ud558\ub294 \ub4f1\uc758 \uae30\ub2a5\uc740 Dagger\uc0ac\uc6a9\uc790\ub85c\uc368\ub294 \uc544\uc26c\uc6c0\uc774 \ub0a8\ub294 \ubd80\ubd84\uc785\ub2c8\ub2e4. (\uc720\ub2db\ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 Runtime\uc5d0 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud558\ub294 \uac83\uc744 \ubc29\uc9c0\ud560 \uc218\ub294 \uc788\uc2b5\ub2c8\ub2e4)<\/p>\n<p>1.0\ubc84\uc804\uc774 \uc544\uc9c1 \ub098\uc624\uc9c0 \uc54a\uc740 \ud504\ub808\uc784\uc6cc\ud06c\ub77c \ub354\uc6b1 \uae30\ub300\uac00 \ub418\uae34 \ud558\uc9c0\ub9cc \ud604\uc7ac\ub85c\uc11c\ub294 Dagger2\uc758 \uc790\ub9ac\ub97c \ub300\uccb4\ud558\uae30\ub294 \ud798\ub4e0 \uac83\uc73c\ub85c \ubcf4\uc785\ub2c8\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Koin\uc740 \ucf54\ud2c0\ub9b0 \uac1c\ubc1c\uc790\ub97c \uc704\ud55c \uc2e4\uc6a9\uc801\uc778 API\uc81c\uacf5\uc744 \ud558\ub294 \uacbd\ub7c9\ud654\ub41c \uc758\uc874\uc131 \uc8fc\uc785 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. (\uc790\ubc14 \uac1c\ubc1c\uc790 \ub610\ub294 \uc758\uc874\uc131 \uc8fc\uc785\uc5d0 \ub300\ud574\uc11c \uc54c\uace0 \uc2f6\ub2e4\uba74 Dagger \ud3ec\uc2a4\ud2b8\ub97c \ucc38\uc870\ud574\uc8fc\uc138\uc694)\u00a0 \uc21c\uc218 \ucf54\ud2c0\ub9b0\uc73c\ub85c\ub9cc \uc791\uc131\ub418\uc5b4\uc788\uc73c\uba70 \ud504\ub85d\uc2dc, \uc560\ub178\ud14c\uc774\uc158 \ud504\ub85c\uc138\uc2f1\uc744 \ud1b5\ud55c \ucf54\ub4dc \uc0dd\uc131, \ub9ac\ud50c\ub809\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uac00\ubccd\uc2b5\ub2c8\ub2e4. Android Gradle\uc124\uc815(https:\/\/github.com\/InsertKoinIO\/koin) def koin_version=&#8221;0.9.3&#8243; \/\/ \ucd5c\uc2e0\ubc84\uc804\uc740 \uc704\uc758 github\ub9c1\ud06c \ucc38\uc870 implementation &#8220;org.koin:koin-android:$koin_version&#8221; \uc65c DSL\uc744 [&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":[5],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/730"}],"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=730"}],"version-history":[{"count":4,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/730\/revisions"}],"predecessor-version":[{"id":735,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/730\/revisions\/735"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}