{"id":2830,"date":"2024-12-28T20:04:37","date_gmt":"2024-12-28T11:04:37","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=2830"},"modified":"2024-12-28T20:04:37","modified_gmt":"2024-12-28T11:04:37","slug":"using-koin-with-android-compose","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2024\/12\/28\/2830\/","title":{"rendered":"Using Koin with Android Compose"},"content":{"rendered":"\n<p>\uae30\ubcf8\uc801\uc778 Koin \uc0ac\uc6a9\ubc95\uc740 <a href=\"http:\/\/batmask.dothome.co.kr\/index.php\/2024\/12\/24\/2793\/\">\uc55e \ud3ec\uc2a4\ud305<\/a>\uc5d0\uc11c \ub2e4\ub918\ub2e4. \uc774\uc81c \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc0ac\uc6a9\ud574\ubcf4\uc790. \ubc84\uc804\uce74\ud0c8\ub85c\uadf8\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uace0 \uac00\uc815\ud55c\ub2e4. \uc6b0\uc120 libs.versions.toml \uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud55c\ub2e4. bom\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0, \uadf8 \uc774\ud6c4\uc5d0\ub294 version.ref\ub7f0\uc2a4 \uba85\uc2dc\uac00 \ud544\uc694\uc5c6\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"[versions]\n...\nkoin-bom = &quot;4.0.0&quot;\n...\n[libraries]\n...\nkoin-bom = { group = &quot;io.insert-koin&quot;, name = &quot;koin-bom&quot;, version.ref = &quot;koin-bom&quot;}\nkoin-core = { group = &quot;io.insert-koin&quot;, name = &quot;koin-core&quot;}\nkoin-android = { group = &quot;io.insert-koin&quot;, name = &quot;koin-android&quot;}\nkoin-androidx-compose = { group = &quot;io.insert-koin&quot;, name = &quot;koin-androidx-compose&quot;}\nkoin-androidx-compose-navigation = { group = &quot;io.insert-koin&quot;, name = &quot;koin-androidx-compose-navigation&quot;}\nkoin-junit4 = { group = &quot;io.insert-koin&quot;, name = &quot;koin-test-junit4&quot;}\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">[versions]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">koin<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">bom <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;4.0.0&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">[libraries]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">koin<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">bom <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> { group <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;io.insert-koin&quot;<\/span><span style=\"color: #ADBAC7\">, name <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;koin-bom&quot;<\/span><span style=\"color: #ADBAC7\">, version.ref <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;koin-bom&quot;<\/span><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">koin<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">core <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> { group <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;io.insert-koin&quot;<\/span><span style=\"color: #ADBAC7\">, name <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;koin-core&quot;<\/span><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">koin<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">android <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> { group <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;io.insert-koin&quot;<\/span><span style=\"color: #ADBAC7\">, name <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;koin-android&quot;<\/span><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">koin<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">androidx<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">compose <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> { group <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;io.insert-koin&quot;<\/span><span style=\"color: #ADBAC7\">, name <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;koin-androidx-compose&quot;<\/span><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">koin<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">androidx<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">compose<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">navigation <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> { group <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;io.insert-koin&quot;<\/span><span style=\"color: #ADBAC7\">, name <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;koin-androidx-compose-navigation&quot;<\/span><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">koin<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">junit4 <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> { group <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;io.insert-koin&quot;<\/span><span style=\"color: #ADBAC7\">, name <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;koin-test-junit4&quot;<\/span><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>koin-core, koin-android\uc678 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc740 \ud544\uc694\ud55c \uac83\ub4e4\uc744 \ucc3e\uc544\uc11c \ucd94\uac00\ud55c\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4. \uc774\uc81c, build.gradle.kts \ud30c\uc77c\uc5d0 \ud574\ub2f9 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc744 \ucd94\uac00\ud574\ubcf4\uc790. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"dependencies {\n...\n  implementation(project.dependencies.platform(libs.koin.bom))\n  implementation(libs.koin.core)\n  implementation(libs.koin.android)\n  implementation(libs.koin.androidx.compose)\n  implementation(libs.koin.androidx.compose.navigation)\n  implementation(libs.koin.junit4)\n...\n}\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">dependencies<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">  <\/span><span style=\"color: #DCBDFB\">implementation<\/span><span style=\"color: #ADBAC7\">(project.dependencies.<\/span><span style=\"color: #DCBDFB\">platform<\/span><span style=\"color: #ADBAC7\">(libs.koin.bom))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">  <\/span><span style=\"color: #DCBDFB\">implementation<\/span><span style=\"color: #ADBAC7\">(libs.koin.core)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">  <\/span><span style=\"color: #DCBDFB\">implementation<\/span><span style=\"color: #ADBAC7\">(libs.koin.android)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">  <\/span><span style=\"color: #DCBDFB\">implementation<\/span><span style=\"color: #ADBAC7\">(libs.koin.androidx.compose)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">  <\/span><span style=\"color: #DCBDFB\">implementation<\/span><span style=\"color: #ADBAC7\">(libs.koin.androidx.compose.navigation)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">  <\/span><span style=\"color: #DCBDFB\">implementation<\/span><span style=\"color: #ADBAC7\">(libs.koin.junit4)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Koin Usage : <a href=\"https:\/\/insert-koin.io\/docs\/quickstart\/android-compose\">https:\/\/insert-koin.io\/docs\/quickstart\/android-compose<\/a><\/h3>\n\n\n\n<p> \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0 DI\ub97c \uc0ac\uc6a9\ud558\ub294 \uac00\uc7a5 \ud070 \uc774\uc720\uc911 \ud558\ub098\ub294 MVVM\uad6c\uc870\uc5d0\uc11c Repository, Viewmodel\ub4e4\uc744 \uad00\ub9ac\ud558\uae30 \uc704\ud568\uc77c \uac83\uc774\ub2e4. \uc774\uc804 \ud3ec\uc2a4\ud2b8\uc5d0\uc11c \ub2e4\ub8ec Kotlin\uc5d0\uc11c \uc774\ubbf8 \ub3d9\uc77c\ud55c \uad6c\uc870\ub85c Repository\ub97c \ub9cc\ub4e4\uc5c8\uc5c8\uc73c\ubbc0\ub85c, \ub3d9\uc77c\ud55c \ud615\ud0dc\ub85c \ub9cc\ub4e4 \uac70\ub2e4. User\uc640 Repository\ub97c \ucd94\uac00\ud574\uc8fc\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"data class User(val name : String)\n\ninterface UserRepository {\n    fun findUser(name : String): User?\n    fun addUsers(users : List&lt;User&gt;)\n}\n\nclass UserRepositoryImpl : UserRepository {\n\n    private val _users = arrayListOf&lt;User&gt;()\n\n    override fun findUser(name: String): User? {\n        return _users.firstOrNull { it.name == name }\n    }\n\n    override fun addUsers(users : List&lt;User&gt;) {\n        _users.addAll(users)\n    }\n}\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">data<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">User<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> name : <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">interface<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">UserRepository<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">findUser<\/span><span style=\"color: #ADBAC7\">(name : <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">User<\/span><span style=\"color: #ADBAC7\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">addUsers<\/span><span style=\"color: #ADBAC7\">(users : <\/span><span style=\"color: #F69D50\">List<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">User<\/span><span style=\"color: #ADBAC7\">&gt;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">UserRepositoryImpl<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">UserRepository<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> _users <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">arrayListOf<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">User<\/span><span style=\"color: #ADBAC7\">&gt;()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">findUser<\/span><span style=\"color: #ADBAC7\">(name: <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">User<\/span><span style=\"color: #ADBAC7\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> _users.<\/span><span style=\"color: #DCBDFB\">firstOrNull<\/span><span style=\"color: #ADBAC7\"> { it.name <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> name }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">addUsers<\/span><span style=\"color: #ADBAC7\">(users : <\/span><span style=\"color: #F69D50\">List<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">User<\/span><span style=\"color: #ADBAC7\">&gt;) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        _users.<\/span><span style=\"color: #DCBDFB\">addAll<\/span><span style=\"color: #ADBAC7\">(users)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\uc81c \ub3d9\uc77c\ud558\uac8c Koin module\uc744 \uc815\uc758\ud574\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"val appModule = module {\n    singleOf(::UserRepositoryImpl) { bind&lt;UserRepository&gt;() }\n}\n\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> appModule <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">module<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">singleOf<\/span><span style=\"color: #ADBAC7\">(::<\/span><span style=\"color: #DCBDFB\">UserRepositoryImpl<\/span><span style=\"color: #ADBAC7\">) { <\/span><span style=\"color: #DCBDFB\">bind<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">UserRepository<\/span><span style=\"color: #ADBAC7\">&gt;() }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Koin module\uc758 \uc815\uc758\ub9cc\uc73c\ub860 Koin\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4. \uc55e\uc5d0\uc11c\uc640 \uac19\uc774 startKoin()\uc744 \ubd88\ub7ec\uc918\uc57c \ud558\ub294\ub370, \uc548\ub4dc\ub85c\uc774\ub4dc\ub2c8\uae4c Application \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\uc544 \uc0c8\ub85c \ub9cc\ub4e4\uace0, \uac70\uae30\uc11c startKoin\uc744 \ubd88\ub7ec\uc900\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ MainApplication.kt file\nclass MainApplication : Application() {\n    override fun onCreate() {\n        super.onCreate()\n        \n        private val userRepository : UserRepository by inject()\n\n        startKoin {\n            androidLogger()\n            androidContext(this@MainApplication)\n            modules(appModule)\n        }\n        \n        userRepository.addUsers(DEFAULT_USERS)\n    }\n}\n------------------------------------------------\n\/\/ AndroidManifest.xml file\n...\n&lt;application\n        android:name=&quot;.MainApplication&quot;\n        ...\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #768390\">\/\/ MainApplication.kt file<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MainApplication<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">Application<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> userRepository : <\/span><span style=\"color: #F69D50\">UserRepository<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">by<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">inject<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">startKoin<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">androidLogger<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">androidContext<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this@MainApplication<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">modules<\/span><span style=\"color: #ADBAC7\">(appModule)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        userRepository.<\/span><span style=\"color: #DCBDFB\">addUsers<\/span><span style=\"color: #ADBAC7\">(DEFAULT_USERS)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/ AndroidManifest.xml file<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">application<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        android:<\/span><span style=\"color: #F69D50\">name<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #96D0FF\">&quot;.MainApplication&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc704 \ucf54\ub4dc\ub97c \ubcf4\uba74, userRepository\ub97c by inject\ub85c \ubd80\ub974\uace0\ub098\uc11c startKoin\uc744 \ud638\ucd9c\ud558\uace0 userRepository.addUsers(DEFAULT_USERS) \ub85c \ud14c\uc2a4\ud2b8\ud560 \uae30\ubcf8\uac12\uc744 \ub123\uc5b4\uc8fc\uace0 \uc788\ub2e4. \uc774\uac83\uc740 \uc628\uc804\ud788 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \uac83\uc73c\ub85c, \uc0ac\uc2e4\uc740 \uc5ec\uae30\uc11c \ucc98\ub9ac\ub420 \ucf54\ub4dc\uac00 \uc544\ub2c8\ub2e4. \ud55c\uac00\uc9c0 \ub354 \uc9da\uace0 \ub118\uc5b4\uac00\uc790\uba74, startKoin\ud638\ucd9c \uc804\uc5d0 injection\uc744 \uc2dc\ud0a4\ub294 \uac83\ucc98\ub7fc \ubcf4\uc5ec \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\ub098 \uc0dd\uac01\ub418\ub294\ub370, by inject()\ub294 lazy injection\uc774\uae30 \ub54c\ubb38\uc5d0 \uc2e4\uc81c\ub85c\ub294 \uadf8 \ub4a4\uc5d0 addUsers()\ub97c \ud638\ucd9c\ud560 \ub54c \uc2e4\ud589\ub41c\ub2e4. <\/p>\n\n\n\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc54c\uace0 \uc788\uaca0\uc9c0\ub9cc, \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c Application\uc744 \uc0ac\uc6a9\uc790\uac00 \uc815\uc758\ud560 \uacbd\uc6b0, AndroidManifest.xml\uc5d0\ub3c4 \ucd94\uac00\ud574\uc918\uc57c \ud55c\ub2e4. \uc704 \ucf54\ub4dc\uc758 \uc544\ub7ab \ubd80\ubd84\uc744 \ucc38\uc870\ud558\uc790. \ucf54\ud2c0\ub9b0 \ub54c\uc640 \ub2e4\ub978\uc810\uc740 androidContext()\ub97c \uc774\uc6a9\ud574\uc11c Application Context\ub97c \ub118\uaca8\uc8fc\uace0 \uc788\ub2e4\ub294 \uc810\uc774\ub2e4. <\/p>\n\n\n\n<p>UserViewModel \ud074\ub798\uc2a4\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \ub9cc\ub4e4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"class UserViewModel(private val repository: UserRepository) : ViewModel() {\n\n    fun sayHello(name : String) : String{\n        val foundUser = repository.findUser(name)\n        return foundUser?.let { &quot;Hello '$it' from $this&quot; } ?: &quot;User '$name' not found!&quot;\n    }\n}\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">UserViewModel<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> repository: <\/span><span style=\"color: #F69D50\">UserRepository<\/span><span style=\"color: #ADBAC7\">) : <\/span><span style=\"color: #F69D50\">ViewModel<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">sayHello<\/span><span style=\"color: #ADBAC7\">(name : <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">) : <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> foundUser <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> repository.<\/span><span style=\"color: #DCBDFB\">findUser<\/span><span style=\"color: #ADBAC7\">(name)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> foundUser?.<\/span><span style=\"color: #DCBDFB\">let<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #96D0FF\">&quot;Hello &#39;<\/span><span style=\"color: #6CB6FF\">$it<\/span><span style=\"color: #96D0FF\">&#39; from <\/span><span style=\"color: #6CB6FF\">$this<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\"> } ?: <\/span><span style=\"color: #96D0FF\">&quot;User &#39;<\/span><span style=\"color: #6CB6FF\">$name<\/span><span style=\"color: #96D0FF\">&#39; not found!&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\uc81c \uc774 UserViewModel\ub3c4 Koin module\uc5d0 \ucd94\uac00\ud574\uc900\ub2e4. viewmodel\uc740 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\ub9cc \uc788\ub294 \ud2b9\ubcc4\ud55c \uac83\uc73c\ub85c, viewModelOf()\ub97c \uc0ac\uc6a9\ud574\uc900\ub2e4. hilt\uc5d0\uc11c\ub3c4 viewmodel\uc740 \ubcc4\ub3c4\uc758 annotation\uc774 \uc0ac\uc6a9\ub418\ub294 \uac83\ucc98\ub7fc, \uc774\ub294 \uc548\ub4dc\ub85c\uc774\ub4dc\uc758 lifecycle\uc744 \uace0\ub824\ud55c \uac83\uc73c\ub85c \uc54c\uace0 \uc788\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"val appModule = module {\n    singleOf(::UserRepositoryImpl) { bind&lt;UserRepository&gt;() }\n    viewModelOf(::UserViewModel)\n    \/\/    viewModel { MyViewModel(get()) }\n}\n\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> appModule <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">module<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">singleOf<\/span><span style=\"color: #ADBAC7\">(::<\/span><span style=\"color: #DCBDFB\">UserRepositoryImpl<\/span><span style=\"color: #ADBAC7\">) { <\/span><span style=\"color: #DCBDFB\">bind<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">UserRepository<\/span><span style=\"color: #ADBAC7\">&gt;() }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">viewModelOf<\/span><span style=\"color: #ADBAC7\">(::<\/span><span style=\"color: #DCBDFB\">UserViewModel<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/    viewModel { MyViewModel(get()) }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc704 \ucf54\ub4dc\uc5d0\uc11c \uc8fc\uc11d\ucc98\ub9ac\ud55c \ubd80\ubd84\uc744 \ubcf4\uba74, get()\uc744 \uc774\uc6a9\ud574\uc11c \uc778\uc790\uc778 UserRepository\ub97c \ub118\uaca8\uc8fc\ub294 \uac78 \ubcfc \uc218 \uc788\ub2e4. \uadf8\ub7ec\ub098, \ubcf4\ub2e4 \uac04\ub2e8\ud788 dsl\ud615\ud0dc\ub85c \uc704\uc640\uac19\uc774 \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud558\ub2e4.<\/p>\n\n\n\n<p>\uc55e\uc5d0\uc11c MainApplication\ub0b4\uc5d0\uc11c UserRepository\ub97c injection\uc2dc\ud0a4\uace0 \uc788\uc9c0\ub9cc, \uc774\uac74 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c \ucf54\ub4dc \ubd80\ubd84\uc73c\ub85c \uc2e4\uc81c\ub85c\ub294 Injection\uc744 \uba85\uc2dc\uc801\uc73c\ub85c \uc548\ud558\uac8c \ub420\uac70\ub2e4. \ub300\uc2e0\uc5d0 UserRepository\ub294 UserViewModel\uc5d0\uc11c get()\uc73c\ub85c \uc5bb\uc5b4\uc640 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0, \uc774 \uc2dc\uc810\uc5d0 injection\uc774 \uc77c\uc5b4\ub0a0 \uac83\uc774\uace0, \uc6b0\ub9ac\ub294 UserViewModel\ub9cc inject \uc2dc\ud0a4\uba74 \ub41c\ub2e4. <\/p>\n\n\n\n<p>Android Compose\uc5d0\uc11c ViewModel\uc774 \uc0ac\uc6a9\ub418\ub294 \ubd80\ubd84\uc740 UI Composable \ud568\uc218\ub4e4\uc774\ub2e4. \ub2e4\uc74c\uacfc \uac19\uc774 ViewModelInject() composable function\uc744 \ucd94\uac00\ud574\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"@Composable\nfun ViewModelInject(userName : String, viewModel: UserViewModel = koinViewModel()){\n    Text(text = viewModel.sayHello(userName), modifier = Modifier.padding(8.dp))\n}\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F69D50\">@Composable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">ViewModelInject<\/span><span style=\"color: #ADBAC7\">(userName : <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">, viewModel: <\/span><span style=\"color: #F69D50\">UserViewModel<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">koinViewModel<\/span><span style=\"color: #ADBAC7\">()){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">Text<\/span><span style=\"color: #ADBAC7\">(text <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> viewModel.<\/span><span style=\"color: #DCBDFB\">sayHello<\/span><span style=\"color: #ADBAC7\">(userName), modifier <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> Modifier.<\/span><span style=\"color: #DCBDFB\">padding<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">8<\/span><span style=\"color: #ADBAC7\">.dp))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ucf54\ub4dc\uc758 \ub0b4\uc6a9\uc744 \ubcf4\uba74, viewmodel injection\uc744 \uc704\ud574 koinViewModel()\ud568\uc218\uac00 \uc0ac\uc6a9\ub418\uace0 \uc788\ub2e4. \uadf8\ub9ac\uace0,  viewmodel\uc758 sayHello()\ub97c \ubd88\ub7ec\uc8fc\uace0 \uc788\ub2e4. \uc55e\uc758 UserViewModel\uc744 \ucc38\uc870\ud558\uba74, sayHello()\ub294 User \uc815\ubcf4\ub97c \uac00\uc9c0\uace0 \ubb38\uc790\uc5f4\uc744 \ub3cc\ub824\uc8fc\ub294 \ud568\uc218\uc774\ub2e4.<\/p>\n\n\n\n<p>\uacf5\uc2dd \uc0ac\uc774\ud2b8\uc758 \uc608\uc81c\ub97c \ubcf4\uba74, Viewmodel\uc678\uc5d0 StateHolder\uc5d0 \ub300\ud55c \uc608\uc81c\ub3c4 \ubcf4\uc5ec\uc900\ub2e4. StateHolder\ub780, \uc548\ub4dc\ub85c\uc774\ub4dc Compose\uc758 state\ub97c \ubcc4\ub3c4\uc758 \uc77c\ubc18 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4 \uc800\uc7a5\ud558\uace0, \uc704\uc784\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4. Viewmodel\ub3c4 \uc77c\uc885\uc758 Stateholder\ub85c \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \ubb38\uc81c\ub294, Koin\uc758 \uc608\uc81c\uc5d0\uc11c \uc774 stateholder\ub97c factoryOf()\ub97c \uc774\uc6a9\ud558\uc5ec \ubaa8\ub4c8\uc5d0\uc11c \uc815\uc758\ud55c\ub2e4\ub294 \uc810\uc774\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"val appModule = module {\n    singleOf(::UserRepositoryImpl) { bind&lt;UserRepository&gt;() }\n    factoryOf(::UserStateHolder)\n    viewModelOf(::UserViewModel)\n}\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> appModule <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">module<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">singleOf<\/span><span style=\"color: #ADBAC7\">(::<\/span><span style=\"color: #DCBDFB\">UserRepositoryImpl<\/span><span style=\"color: #ADBAC7\">) { <\/span><span style=\"color: #DCBDFB\">bind<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">UserRepository<\/span><span style=\"color: #ADBAC7\">&gt;() }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">factoryOf<\/span><span style=\"color: #ADBAC7\">(::<\/span><span style=\"color: #DCBDFB\">UserStateHolder<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">viewModelOf<\/span><span style=\"color: #ADBAC7\">(::<\/span><span style=\"color: #DCBDFB\">UserViewModel<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p> \uc774\uac8c \uacfc\uc5f0 \uc720\ud6a8\ud55c \ubc29\uc2dd\uc778\uc9c0 \uc880 \uc758\ubb38\uc774 \uc788\ub2e4. factoryOf()\ub97c \uc0ac\uc6a9\ud558\uba74, injection\ub420 \ub54c\ub9c8\ub2e4 \uc0c8\ub85c\uc6b4 \uc778\uc2a4\ud134\uc2a4\uac00 \uc0dd\uc131\uc774 \ub418\ub294\ub370, recompose \ub420 \ub54c\ub9c8\ub2e4 \uc0c8\ub85c\uc6b4 \uc778\uc2a4\ud134\uc2a4\uac00 \uc0dd\uc131\ub418\ub294 \uac83 \uc544\ub2cc\uac00 \uc2f6\uc740 \ubd80\ubd84. compose\uc758 \uacbd\ud5d8\uce58\uac00 \uc801\uc5b4\uc11c \uc774\ubd80\ubd84\uc744 \uc798 \ubaa8\ub974\uaca0\ub2e4. \uc608\uc81c\uc758 stateholder\ub3c4 stateholder\uc758 \uc0ac\uc6a9\uc608\ub85c \uc801\uc808\ud558\uc9c0 \uc54a\uc544\ubcf4\uc5ec\uc11c \uc77c\ub2e8, \uc548\uc4f0\ub294\uac78\ub85c. <\/p>\n\n\n\n<p>\ub2e4\uc2dc viewmodel\ub85c \ub3cc\uc544\uac00\uc790\uba74, \ub9c8\uc9c0\ub9c9\uc73c\ub85c Activity\uc5d0\uc11c ViewModelInject() composable \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\ub294 \uc77c\ub9cc \ub0a8\uc558\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"class MainActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContent {\n            MaterialTheme {\n                KoinAndroidContext {\n                    App()\n                }\n            }\n        }\n    }\n}\n\n@Composable\nfun App(){\n    Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.Center){\n        val userName = DefaultData.DEFAULT_USER.name\n        ViewModelInject(userName)\n    }\n}\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MainActivity<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">AppCompatActivity<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">(savedInstanceState: <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #ADBAC7\">?) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">(savedInstanceState)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">setContent<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">MaterialTheme<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #DCBDFB\">KoinAndroidContext<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    <\/span><span style=\"color: #DCBDFB\">App<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">@Composable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">App<\/span><span style=\"color: #ADBAC7\">(){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">Column<\/span><span style=\"color: #ADBAC7\">(modifier <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> Modifier.<\/span><span style=\"color: #DCBDFB\">padding<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">16<\/span><span style=\"color: #ADBAC7\">.dp), verticalArrangement <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> Arrangement.Center){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> userName <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> DefaultData.DEFAULT_USER.name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">ViewModelInject<\/span><span style=\"color: #ADBAC7\">(userName)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\ub807\uac8c\ud574\uc11c \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c\uc758 Koin \uc0ac\uc6a9\uc744 \uc54c\uc544\ubd24\ub2e4. \uc774\uac78\ub85c \ucda9\ubd84\ud558\uc9c0 \uc54a\uc744\uac74\ub370, \uae30\ubcf8\uc744 \ub6ab\uc5b4\ub1a8\uc73c\ub2c8 <a href=\"https:\/\/insert-koin.io\/docs\/reference\/koin-android\/start\">\uacf5\uc2dd\ubb38\uc11c<\/a>\uc5d0\uc11c \ud544\uc694\ud55c \ubd80\ubd84\uc744 \ucc3e\uc544\ubcf4\uba74 \ub420 \uac70 \uac19\ub2e4. \ubb3c\ub860 \uac80\uc99d\uc740 \ud544\uc218.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uae30\ubcf8\uc801\uc778 Koin \uc0ac\uc6a9\ubc95\uc740 \uc55e \ud3ec\uc2a4\ud305\uc5d0\uc11c \ub2e4\ub918\ub2e4. \uc774\uc81c \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc0ac\uc6a9\ud574\ubcf4\uc790. \ubc84\uc804\uce74\ud0c8\ub85c\uadf8\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uace0 \uac00\uc815\ud55c\ub2e4. \uc6b0\uc120 libs.versions.toml \uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ucd94\uac00\ud55c\ub2e4. bom\uc744 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0, \uadf8 \uc774\ud6c4\uc5d0\ub294 version.ref\ub7f0\uc2a4 \uba85\uc2dc\uac00 \ud544\uc694\uc5c6\ub2e4. koin-core, koin-android\uc678 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc740 \ud544\uc694\ud55c \uac83\ub4e4\uc744 \ucc3e\uc544\uc11c \ucd94\uac00\ud55c\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4. \uc774\uc81c, build.gradle.kts \ud30c\uc77c\uc5d0 \ud574\ub2f9 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc744 \ucd94\uac00\ud574\ubcf4\uc790. Koin Usage : https:\/\/insert-koin.io\/docs\/quickstart\/android-compose \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0 DI\ub97c \uc0ac\uc6a9\ud558\ub294 \uac00\uc7a5 \ud070 <a href=\"http:\/\/batmask.net\/index.php\/2024\/12\/28\/2830\/\" class=\"btn btn-link continue-link\">\ub354 \uc77d\uae30<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,34],"tags":[186,102,414,412,38,413],"class_list":["post-2830","post","type-post","status-publish","format-standard","hentry","category-android","category-kotlin","tag-android-2","tag-basic","tag-compose","tag-koin","tag-kotlin","tag-usage"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/2830","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=2830"}],"version-history":[{"count":28,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/2830\/revisions"}],"predecessor-version":[{"id":2893,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/2830\/revisions\/2893"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=2830"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=2830"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=2830"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}