{"id":2793,"date":"2024-12-24T21:04:49","date_gmt":"2024-12-24T12:04:49","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=2793"},"modified":"2024-12-24T21:04:49","modified_gmt":"2024-12-24T12:04:49","slug":"koin-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2024\/12\/24\/2793\/","title":{"rendered":"Koin \uc0ac\uc6a9\ud558\uae30"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">\uc2dc\uc791\ud558\uae30\uc5d0 \uc55e\uc11c<\/h3>\n\n\n\n<p> \uac1c\ubc1c\uc790\ub85c \uc9c1\uc7a5\uc5d0\uc11c \uc77c\ud55c\uc9c0\ub294 \uc880 \uc624\ub798\ub410\uc9c0\ub9cc, \uc77c \ud560\ub54c \uc54c\uac8c\ub41c \uc9c4\ub9ac\uc911 \ud558\ub098\ub294 &#8220;\ubb38\uc11c\ub97c \uc788\ub294\uadf8\ub300\ub85c 100% \uc2e0\ub8b0\ud558\uc9c0 \ub9c8\ub77c&#8221;\uc600\ub2e4. \uc2ec\uc9c0\uc5b4 MS API\ubb38\uc11c\ub3c4 \uc9c1\uc811 \uc0ac\uc6a9\ud574\ubcf4\uba74 \ub2e4\ub974\uac8c \ub3d9\uc791\ud558\ub294 \uacbd\uc6b0\uac00 \uc788\uae30\ub3c4 \ud588\uc74c. \uc548\ud0c0\uae5d\uc9c0\ub9cc, \uac1c\ubc1c\uc790\ub294 \uacb0\uad6d \ucf54\ub4dc\ub85c \uc77d\uc5b4\uc57c \ud558\ub294 \uc874\uc7ac\ub780\uac78 \ub610 \uae68\ub2eb\ub294 \uacbd\ud5d8\uc744 \ud558\uac8c\ub410\ub2e4.<br> <\/p>\n\n\n\n<p> Koin 4.0\uc774 \ub098\uc654\uc74c\uc5d0\ub3c4 \uacf5\uc2dd \uc0ac\uc774\ud2b8\uc758 \ubb38\uc11c\ub4e4\uc740 3.5\uc5d0 \uae30\ubc18\ud55c \ub0b4\uc6a9\ub4e4\uc774\ub2e4. \ubc84\uc804\ubcc4 API\ubb38\uc11c\ub3c4 \uc5c6\uace0, \uc2ec\uc9c0\uc5b4 \uac00\uc7a5 \uac04\ub2e8\ud55c Kotlin tutorial\ub3c4 \uc644\uc804\ud558\uc9c0 \uc54a\uc740\ucc44\ub85c \uc720\uc9c0\ub418\uace0 \uc788\ub2e4. \uc0ac\uc6a9\uc790\uce35\ub3c4 \uadf8\ub807\uac8c \ub9ce\uc9c0 \uc54a\uc544\uc11c \uad00\ub828 \ub0b4\uc6a9\ucc3e\uae30\uac00 \uc27d\uc9c0\uc54a\ub2e4. \uc0ac\ub78c\ub4e4\uc774 \uc0ac\uc6a9\uc774 \uc27d\ub2e4\uace0 \ud558\uc9c0\ub9cc, \uc774\uac8c \uc26c\uc6b4\uac74\uc9c0 \uc798 \ubaa8\ub974\uaca0\ub2e4. \ucf54\ub4dc\ub97c \ub72f\uc5b4\ubcfc\uac70 \uc544\ub2c8\uba74 \uc880 \ubaa8\ub974\uaca0\ub124. \uadf8\ub7fc\uc5d0\ub3c4 KMP\ub97c \uc4f8\uac70\uba74 \uc774\uac78 \uc4f0\ub294\uac8c \ub9de\ub294\uac70 \uac19\uae30\ub3c4 \ud558\uace0. \ubbff\uc744\uac74 github\uc5d0 \uc788\ub294 \ucf54\ub4dc\ubfd0\uc784\uc744 \uc54c\uace0 \uc0ac\uc6a9\ud558\uc790.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">DI (Dependency Injection)<\/h3>\n\n\n\n<p>Dependency Injection\uc740 \uac1d\uccb4\ub97c \uc9c1\uc811 \uad00\ub9ac\ud558\uc9c0 \uc54a\uc544\ub3c4 \ud544\uc694\ud55c \uacbd\uc6b0\uc5d0 \uac1d\uccb4\ub97c \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud574\uc8fc\ub294 \ubc29\ubc95\uc774\ub2e4. \uc774\uac83\uc740 &#8220;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Separation_of_concerns\">separation of concerns<\/a>&#8221; \uc6d0\uce59\uc744 \uc704\ud55c \uac83\uc778\ub370, \ud55c \ubd80\ubd84\uc758 \uad6c\ud604\uc5d0 \uc788\uc5b4\uc11c \ub2e4\ub978 \ubd80\ubd84\ub4e4\uc758 \uc138\uc138\ud55c \uc815\ubcf4\ub4e4\uc744 \uc54c \ud544\uc694 \uc5c6\uac8c \ub9cc\ub4e4\uc5b4\uc8fc\ub294\uac78 \ub9d0\ud55c\ub2e4. \ubaa8\ub4c8\ub7ec \ud504\ub85c\uadf8\ub798\ubc0d\uc774\ub098, \uc778\ucea1\uc290\ub808\uc774\ud305(encapsulating)\ucc98\ub7fc \uc815\ubcf4\ub97c \uc228\uae30\ub294 \uac83\ub4e4\uc774 \ub2e4 \uc774\uc5d0 \ud574\ub2f9\ud55c\ub2e4. Dependency Injection\uc740 \ub9d0 \uadf8\ub300\ub85c \uc758\uc874\uc131\uc5d0 \ub300\ud55c \uac83\uc778\ub370, \uc778\uc790\ub85c \ubc1b\uc544\uc624\ub294 \uac1d\uccb4\ub098 \uba64\ubc84\ub85c \uac16\uace0 \uc788\ub294 \uac1d\uccb4\uc758 \uc0dd\uc131\uc744 \ub0b4\ubd80\uc801\uc73c\ub85c \uad6c\ud604\ud574\uc918\uc11c \uc774\ub7ec\ud55c \uac1d\uccb4\ub4e4\uc744 \uc5b4\ub514\uc5d0\uc11c \uc778\uc2a4\ud134\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud558\ub294\uc9c0 \uac19\uc740 \ubcf5\uc7a1\ud55c \ubb38\uc81c\ub4e4\uc744 \uc5c6\uc560\uc900\ub2e4. \ucd94\uac00\uc801\uc73c\ub85c \uac1d\uccb4 \uc0dd\uc131\uc5d0 \ub300\ud55c\uac78 \uc678\ubd80\uc5d0 \ub9e1\uaca8 \uc758\uc874\uc131\uc774 \ubd84\ub9ac\ub418\ubbc0\ub85c \ub514\ubc84\uae45\uc2dc\uc5d0 \ubaa9\uc5c5\ub4f1\uc758 \uc0ac\uc6a9\uc774 \uac04\ud3b8\ud574\uc9c4\ub2e4. \uac1c\ubc1c\uc790\uac00 \uc778\uc2a4\ud134\uc2a4\ub4e4\uc744 \uc9c1\uc811 \uad00\ub9ac\ud558\uc9c0 \uc54a\uc73c\ub2c8 \uc554\ud2bc \ud3b8\ud558\ub2e4. \ub9d0\ub85c\ub9cc \uc368\uc11c\ub294 \ud63c\ub780\uc2a4\ub7ec\uc6b8 \uc218 \uc788\uc73c\ub2c8 \ub2e4\uc74c\uc744 \ubcf4\uc790.<\/p>\n\n\n\n<p>\uc548\ub4dc\ub85c\uc774\ub4dc \uac1c\ubc1c\uc790 \uacf5\ud648\uc5d0\uc11c\ub294 \ucc28\uc640 \uc5d4\uc9c4\uc758 \uc608\ub97c\ub4e4\uc5b4 \ubcf4\ub2e4 \uce5c\ucca0\ud558\uace0 \uc0c1\uc138\ud558\uac8c \uc774\uc5d0\ub300\ud574 \uc124\uba85\ud55c\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 Car {\n\n    private val engine = Engine()\n\n    fun start() {\n        engine.start()\n    }\n}\n\nfun main(args: Array) {\n    val car = Car()\n    car.start()\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\">Car<\/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\"> engine <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Engine<\/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\">start<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        engine.<\/span><span style=\"color: #DCBDFB\">start<\/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>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">(args: <\/span><span style=\"color: #F69D50\">Array<\/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\"> car <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Car<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    car.<\/span><span style=\"color: #DCBDFB\">start<\/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>\uc704 \uc608\uc81c\uc758 \uacbd\uc6b0, Car\uc5d0\uc11c Engine\uc744 \uc0dd\uc131\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 Car\uc640 Engine\uc740 \uac15\ud558\uac8c \ucee4\ud50c\ub9c1\ub41c \uc758\uc874\uc131\uc744 \uac16\uace0 \uc788\ub2e4. \uc5d4\uc9c4\uc744 \ubc14\uafb8\ub824\uba74, Car \ud074\ub798\uc2a4\ub97c \uc218\uc815\ud574\uc57c \ud55c\ub2e4. \uc774\uac83\uc740 \ud14c\uc2a4\ud2b8\ub3c4 \ud798\ub4e4\uac8c \ub41c\ub2e4. \ub9cc\uc57d\uc5d0 Engine\uc744 \uc778\uc790\ub85c \ubc1b\uc544\uc624\ub3c4\ub85d \uad6c\ud604\ud55c\ub2e4\uba74,<\/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 Car(private val engine: Engine) {\n    fun start() {\n        engine.start()\n    }\n}\n\nfun main(args: Array) {\n    val engine = Engine()\n    val car = Car(engine)\n    car.start()\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\">Car<\/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\"> engine: <\/span><span style=\"color: #F69D50\">Engine<\/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\">start<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        engine.<\/span><span style=\"color: #DCBDFB\">start<\/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>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">(args: <\/span><span style=\"color: #F69D50\">Array<\/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\"> engine <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Engine<\/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\"> car <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Car<\/span><span style=\"color: #ADBAC7\">(engine)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    car.<\/span><span style=\"color: #DCBDFB\">start<\/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>Engine\uacfc Car\uc758 \uac15\ud558\uac8c \ucee4\ud50c\ub9c1\ub41c \uc758\uc874\uc131\uc774 \uc0ac\ub77c\uc9c0\uba74\uc11c \uc720\uc5f0\ud55c \uc791\uc5c5\uc774 \uac00\ub2a5\ud574\uc9c4\ub2e4. \uc678\ubd80\uc5d0\uc11c \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud574\uc11c \ub123\uc5b4\uc8fc\uace0 \uc788\uc73c\ubbc0\ub85c \uc774\ub7f0 \ud615\ud0dc\ub97c DI(Dependency Injection)\uc774\ub77c\uace0 \ud55c\ub2e4. \uc704\uc640 \uac19\uc740 \uacbd\uc6b0\ub97c Constructor Injection\uc774\ub77c\uace0 \ubd80\ub974\uace0, \uc774\ub7f0 \ud615\ud0dc\uac00 \ubd88\uac00\ub2a5\ud560 \ub54c \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud604\ud55c\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 Car {\n    lateinit var engine: Engine\n\n    fun start() {\n        engine.start()\n    }\n}\n\nfun main(args: Array) {\n    val car = Car()\n    car.engine = Engine()\n    car.start()\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\">Car<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">lateinit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> engine: <\/span><span style=\"color: #F69D50\">Engine<\/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\">start<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        engine.<\/span><span style=\"color: #DCBDFB\">start<\/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>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">(args: <\/span><span style=\"color: #F69D50\">Array<\/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\"> car <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Car<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    car.engine <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Engine<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    car.<\/span><span style=\"color: #DCBDFB\">start<\/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>Car \ud074\ub798\uc2a4 \uc0dd\uc131\uc2dc Engine\uc774 \uc0dd\uc131\ub418\uc9c0 \uc54a\uace0 \uc678\ubd80\uc5d0\uc11c \uc0dd\uc131\ud574\uc11c \uba64\ubc84\ub85c \ub123\uc5b4\uc8fc\uac8c \ub418\ub294\ub370, \uc774\ub7f0\uac78 Field Injection \uc774\ub77c\uace0 \ud55c\ub2e4. <\/p>\n\n\n\n<p>\uc704\uc5d0\uc11c \ubcf4\ub4ef, Dependency Injection\uc740 \uac1d\uccb4\ub97c \uc678\ubd80\uc5d0\uc11c \uc0dd\uc131\ud574\uc11c \uc8fc\uc785\ud574 \uc8fc\ub294 \uac83\uc778\ub370, \uc774\uac78 main()\uc5d0\uc11c \uc791\uc5c5\ud574\uc8fc\uace0 \uc788\ub2e4. \uc774\uac78 \uc0ac\uc6a9\uc790\uac00 \uc2e0\uacbd\uc4f0\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub3c4\ub85d, \ucf54\ub4dc\uc0c1 \ud544\uc694\ud560 \ub54c \uac1d\uccb4\ub97c \uc0dd\uc131\ud558\uace0 \uad00\ub9ac\ud558\ub294 \ubd80\ubd84\uc744 \uc790\ub3d9\ud654 \ud560 \uc218 \uc788\ub2e4. \uc774\uac78 \ud574\uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \uc874\uc7ac\ud558\ub294\ub370, \ub300\ud45c\uc801\uc73c\ub85c <a href=\"https:\/\/dagger.dev\/\">Dagger <\/a>\uac00 \uc788\ub2e4. \uc774 Dagger\ub97c \uc774\uc6a9\ud558\uc5ec Android\uc5d0\uc11c \ud3b8\ud558\uac8c \uc0ac\uc6a9\ud558\ub3c4\ub85d \ub9cc\ub4e0 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 Hilt \uc774\ub2e4. \uc548\ub4dc\ub85c\uc774\ub4dc \uacf5\ud648\uc5d0\uc120 Hilt\ub97c \uc0ac\uc6a9\ud558\ub3c4\ub85d \uad8c\uc7a5\ud558\uace0 \uc788\ub2e4. Hilt\ub294 Java \ubca0\uc774\uc2a4\ub85c \uad6c\ud604\ub418\uc5b4 \uc788\uc73c\uba70, \ucef4\ud30c\uc77c \ud0c0\uc784\uc5d0 \ucf54\ub4dc\ub97c \ubd84\uc11d\ud558\uace0 \uac1d\uccb4\uc758 \uc0dd\uc131 \uad00\ub828 \ucf54\ub4dc\ub4e4\uc744 \uc0dd\uc131\ud574\uc900\ub2e4. \ucef4\ud30c\uc77c\uc740 \uae38\uc5b4\uc9c0\uaca0\uc9c0\ub9cc, \ub7f0\ud0c0\uc784\uc5d0 \uc601\ud5a5\uc774 \uc5c6\ub2e4. <\/p>\n\n\n\n<p> Kotlin\uc774 \ub098\ub0a0\uc774 \ubc1c\uc804\ud574 \ub098\uac00\uba74\uc11c, Java \uc758\uc874\uc131\ub3c4 \ub0ae\uc544\uc9c0\uace0 \ub9ce\uc740 \ubd80\ubd84\uc774 Kotlin native\ub85c \ub300\uccb4\ub418\uace0 \uc788\ub2e4. \uc774\ub7f0 \uc640\uc911\uc5d0 Kotlin\ub9cc\uc744 \uc704\ud55c Kotlin native DI\uac00 \ub098\uc654\ub294\ub370, \ubc14\ub85c <a href=\"https:\/\/insert-koin.io\/\">Koin <\/a>\uc774\ub2e4. Koin\uc740 Kotlin\uc73c\ub85c \uad6c\ud604\ub418\uc5b4 \uc788\uc5b4 Kotlin native\ub098 KMP(Kotlin Multi-Platform)\uc5d0 \uc5b4\uc6b8\ub9b0\ub2e4. \ub610\ud55c \uac00\uc7a5 \ud070 \ucc28\uc774\uc810\uc774 \uc788\ub294\ub370, Koin\uc740 Hilt\uc640 \ub2e4\ub974\uac8c \ucef4\ud30c\uc77c \ud0c0\uc784\uc5d0 \uac1d\uccb4\ub97c \uc0dd\uc131\ud558\uc9c0 \uc54a\uace0 \ub7f0\ud0c0\uc784\uc5d0 \uc791\ub3d9\ud55c\ub2e4. <\/p>\n\n\n\n<p>Dagger-Hilt\ub294 \ub9e4\uc6b0 \uba54\uc774\uc800\ud55c \ub188\ub4e4\ub85c \uc790\ub8cc\ub3c4 \ub9ce\uace0 \uc548\ub4dc\ub85c\uc774\ub4dc \uacf5\ud648\ub3c4 \uc774\uac78 \uae30\uc900\uc73c\ub85c \uc124\uba85\ud55c\ub2e4. \uc5ec\uae30\uc11c\ub294 Koin\uc5d0 \ub300\ud574 \uae30\ubcf8\uc0ac\uc6a9\ubc95\uc744 \uac04\ub2e8\ud788 \uc54c\uc544\ubcf4\ub824\uace0 \ud55c\ub2e4. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Koin Setup : <a href=\"https:\/\/insert-koin.io\/docs\/setup\/koin\">https:\/\/insert-koin.io\/docs\/setup\/koin<\/a><\/h3>\n\n\n\n<p>Koin\uc740 \uadf8\ub9ac \uc624\ub798\ub418\uc9c0 \uc54a\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c \ubc84\uc804\uc774 \uc62c\ub77c\uac00\uba74\uc11c \ubcc0\ud654\uac00 \ub9ce\ub2e4. \uc5ec\uae30\uc11c\ub294 \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc0ac\uc6a9\ud558\uace0, Kotlin\uc5d0\uc11c\uc758 \uc0ac\uc6a9\uc5d0 \ub300\ud574 \uc124\uba85\ud558\uaca0\ub2e4. IntelliJ IDEA community \ubc84\uc804\uc73c\ub85c \uc0d8\ud50c \ucf54\ub4dc\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. \uc548\ub4dc\ub85c\uc774\ub4dc\ub294 \ubcc4\ub3c4 \ud3ec\uc2a4\ud2b8\ub85c. <\/p>\n\n\n\n<p><a href=\"https:\/\/insert-koin.io\/docs\/setup\/koin#current-versions\">Koin \ub77c\uc774\ube0c\ub7ec\ub9ac \ub9ac\uc2a4\ud2b8<\/a>\ub97c \ubcf4\uba74, \uc218\ub9ce\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294 \uac83\uc744 \uc54c \uc218 \uc788\ub2e4. 3.5.0\ubd80\ud130 BOM\uc774 \uc801\uc6a9\ub418\uc5c8\ub2e4\uace0 \ud558\ub294\ub370, \uc774\ub97c \uc0ac\uc6a9\ud558\uba74 \uac01 \ub77c\uc774\ube0c\ub7ec\ub9ac \uac1c\uac1c\ubcc4\ub85c \uc0dd\uac01\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4. BOM\uc740 \uac01 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \ub2e4\ub978 \ubc84\uc804\ub4e4\uc744 \uac00\uc9c8 \ub54c, \uc11c\ub85c \ub9de\ub294 \ubc84\uc804\uc744 \ub9cc\ub4e4\uc5b4\uc918\uc11c \ud638\ud658\uc131\uacfc \ub77c\uc774\ube0c\ub7ec\ub9ac \ubc84\uc804\uad00\ub9ac\ub97c \uc27d\uac8c \ub9cc\ub4e4\uc5b4\uc900\ub2e4. <a href=\"https:\/\/velog.io\/@jmseb3\/Nexusbom%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-implementation-%EB%B0%A9%EB%B2%95\">BOM\uc5d0 \ub300\ud55c \uc124\uba85\uc740 \ub2e4\ub978\ubd84\uc758 \ube14\ub85c\uadf8 \ud3ec\uc2a4\ud305<\/a>\uc744 \ucc38\uace0\ud558\uc790.<\/p>\n\n\n\n<p>build.gradle.kts \uc5d0 \ub2e4\uc74c\uc744 \ucd94\uac00\ud55c\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 koinVersion = &quot;4.0.0&quot;\n...\ndependencies {\n    ...\n    implementation(platform(&quot;io.insert-koin:koin-bom:$koinVersion&quot;))\n    implementation(&quot;io.insert-koin:koin-core&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: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> koinVersion <\/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: #DCBDFB\">dependencies<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><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\">(<\/span><span style=\"color: #DCBDFB\">platform<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;io.insert-koin:koin-bom:<\/span><span style=\"color: #6CB6FF\">$koinVersion<\/span><span style=\"color: #96D0FF\">&quot;<\/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\">(<\/span><span style=\"color: #96D0FF\">&quot;io.insert-koin:koin-core&quot;<\/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>BOM\uc744 \uc774\uc6a9\ud574 \uae30\ubcf8\uc801\uc778 core \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ucd94\uac00\ud574\uc92c\ub2e4. \ud544\uc694\ud55c\uacbd\uc6b0 \uc704\uc758 core\uc640  \uac19\uc774 \ub354 \ucd94\uac00\ud574\uc8fc\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Koin Usage : <a href=\"https:\/\/insert-koin.io\/docs\/quickstart\/kotlin\">https:\/\/insert-koin.io\/docs\/quickstart\/kotlin<\/a><\/h3>\n\n\n\n<p>\uba3c\uc800, Koin\uc740 DSL(Domain Specific Language)\uc774\ub2e4. \uc790\uccb4\uc801\uc73c\ub85c \ud558\ub098\uc758 \uac04\ub2e8\ud55c \uc5b8\uc5b4\ub85c \ubcf4\uc774\ub3c4\ub85d \uac00\uacf5\ub418\uc5b4 \uc788\ub2e4. \uc774\uac78 \uc54c\uace0 \uc2dc\uc791\ud574\ubcf4\uc790.<\/p>\n\n\n\n<p> DI\ub294 injection\ub420 \uc778\uc2a4\ud134\uc2a4\ub4e4\uc744 \ub530\ub85c \uad00\ub9ac\ud574\uc900\ub2e4. inject\ub418\uc57c \ud560 \ub54c \uad00\ub9ac\ud558\ub294 \ucef4\ud3ec\ub10c\ud2b8\uc911\uc5d0 \ud544\uc694\ud55c \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud574 \ub3cc\ub824\uc8fc\uac70\ub098, \uc2f1\uae00\ud1a4\ucc98\ub7fc \ub2e8\uc77c \uc778\uc2a4\ud134\uc2a4\uc758 \uacbd\uc6b0 \uadf8 \ub808\ud37c\ub7f0\uc2a4\ub97c \ub3cc\ub824\uc900\ub2e4. \ub300\ub7b5\uc801\uc778 \ud615\ud0dc\ub97c \uadf8\ub824\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"476\" height=\"337\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2024\/12\/koin_diagram.png\" alt=\"\" class=\"wp-image-2848\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2024\/12\/koin_diagram.png 476w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2024\/12\/koin_diagram-300x212.png 300w\" sizes=\"auto, (max-width: 476px) 100vw, 476px\" \/><\/figure>\n<\/div>\n\n\n<p>\uc774\uc640\uac19\uc774 \uac00\uc7a5 \uba3c\uc800 \ud574\uc904 \ubd80\ubd84\uc740 Koin module\uc744 \ub9cc\ub4e4\uace0 \ud544\uc694\ud55c \ucef4\ud3ec\ub10c\ud2b8\ub4e4\uc744 \uc815\uc758 \ud558\ub294 \uac83\uc774\ub2e4. User \ub9ac\uc2a4\ud2b8\ub97c \uad00\ub9ac\ud558\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\ubcf4\uc790. \uc548\ub4dc\ub85c\uc774\ub4dc\uc758 MVVM\uad6c\uc870\ucc98\ub7fc \ub370\uc774\ud130\ub97c \uad00\ub9ac\ud558\ub294 Repository\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \ub9cc\ub4e0\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=\"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    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 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>\uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud588\ub294\ub370, \uc774\ub294 \uc778\ud130\ud398\uc774\uc2a4\uc758 \uc0ac\uc6a9\uc2dc \uc608\uc81c\ub97c \ud55c \ubc88\uc5d0 \ubcf4\uc5ec\uc904 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4. \uc774\uc81c \uc774\uac78 Koin module\uc744 \ub9cc\ub4e4\uc5b4 \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      \/\/ classic \n\/\/    single&lt;UserRepository&gt; { UserRepositoryImpl() }\n    \/\/ constructor DSL\n    singleOf(::UserRepositoryImpl) { bind&lt;UserRepository&gt;() }\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: #768390\">\/\/ classic <\/span><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/    single&lt;UserRepository&gt; { UserRepositoryImpl() }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ constructor DSL<\/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><\/code><\/pre><\/div>\n\n\n\n<p>\uc704 \ucf54\ub4dc\uc5d0\uc11c \uc8fc\uc11d\ucc98\ub9ac\ud55c \ubd80\ubd84\uacfc \ucc98\ub9ac\uac00 \uc548\ub41c \ub77c\uc778\uc774 \ub3d9\uc77c\ud55c \uae30\ub2a5\uc744 \ud55c\ub2e4. \ub2e4\ub9cc, \uc8fc\uc11d\ucc98\ub9ac \ud55c \ubd80\ubd84\uc774 \uc608\uc804 \uc0ac\uc6a9\ubc29\uc2dd\uc774\uace0, \uc0c8\ub85c\uc6b4 constructor DSL\ud615\ud0dc\ub85c \uc544\ub798\ucc98\ub7fc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \uc778\ud130\ud398\uc774\uc2a4\uc640 \uad6c\ud604\uccb4\uac00 \uac01\uac01 \uc5b4\ub514\uc5d0 \uc704\uce58\ud558\ub294\uc9c0 \ud655\uc778\ud574\ubcf4\uba74 \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud558\ub294\uc9c0 \uc54c \uc218 \uc788\ub2e4. single, singleof\ub97c \uc4f0\uace0 \uc788\ub294\ub370, \uc774\ub294 \uc2f1\uae00\ud1a4 \uac1d\uccb4\uc758 \uacbd\uc6b0 \uc774\ub807\uac8c \uc815\uc758\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p>\uc2f1\uae00\ud1a4\uc774 \uc544\ub2c8\uace0 \ub9e4\ubc88 \uac1d\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0\uc5d0 factoryOf()\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \ub2e4\ub9cc, \uc544\uc9c1 \uc801\uc808\ud55c \uc608\ub97c \ucc3e\uc9c0 \ubabb\ud588\ub2e4. factoryOf()\ub294 \ub9e4\ubc88 \uac1d\uccb4\ub97c \uc0dd\uc131\ud574 \ub3cc\ub824\uc8fc\uae30 \ub54c\ubb38\uc5d0, \uad73\uc774 \uc774\uac78 \uc0ac\uc6a9\ud560 \ud544\uc694\uac00 \uc788\ub098 \uc2f6\uc740\ub370, \ubaa8\ub4c8 \ub0b4\uc5d0\uc11c \ud30c\ub77c\ubbf8\ud130\ub85c \uac1d\uccb4\ub97c \uc0dd\uc131\ud574 \ub123\uc5b4\uc57c \ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc744\uac70\uac19\ub2e4.<\/p>\n\n\n\n<p>\ub2e4\uc2dc \uc704\uc758 \uc608\uc81c\ub97c \uc774\uc5b4\uac00\ubcf4\uba74, Repository\ub97c \uc0dd\uc131\uc790 \uc778\uc790\ub85c \ubc1b\ub294 UserService\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \ub9cc\ub4e4\uace0\uc790\ud55c\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=\"object DefaultData {\n    val DEFAULT_USER = User(&quot;Koin&quot;)\n    val DEFAULT_USERS = listOf(DEFAULT_USER)\n}\n\nclass UserService(private val userRepository: UserRepository) {\n    fun getDefaultUser() : User = userRepository.findUser(DefaultData.DEFAULT_USER.name) ?: error(&quot;Can't find default user&quot;)\n    fun saveDefaultUsers() {\n        userRepository.addUsers(DefaultData.DEFAULT_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\">object<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">DefaultData<\/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\"> DEFAULT_USER <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">User<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Koin&quot;<\/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\"> DEFAULT_USERS <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">listOf<\/span><span style=\"color: #ADBAC7\">(DEFAULT_USER)<\/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\">UserService<\/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\"> userRepository: <\/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\">getDefaultUser<\/span><span style=\"color: #ADBAC7\">() : <\/span><span style=\"color: #F69D50\">User<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> userRepository.<\/span><span style=\"color: #DCBDFB\">findUser<\/span><span style=\"color: #ADBAC7\">(DefaultData.DEFAULT_USER.name) ?: <\/span><span style=\"color: #DCBDFB\">error<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Can&#39;t find default user&quot;<\/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\">saveDefaultUsers<\/span><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\">(DefaultData.DEFAULT_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>\uadf8\ub7f0\ub370, \uc774 UserService\ub3c4 \uc2f1\uae00\ud1a4\uc73c\ub85c module\uc5d0 \ub123\uace0 \uc2f6\ub2e4. \uc774\uacbd\uc6b0, module\uc5d0 \uc788\ub294 Repository\ub97c \ub610\ud55c module\uc5d0 \uc788\ub294 UserService\uc758 \uc778\uc790\ub85c \ub118\uaca8\uc918\uc57c \ud55c\ub2e4. \uc774\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ud560 \uc218 \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\/\/ classic \n\/\/    single&lt;UserRepository&gt; { UserRepositoryImpl() }\n\/\/    single { UserService(get())}\n\/\/ constructor DSL\n    singleOf(::UserRepositoryImpl) { bind&lt;UserRepository&gt;() }\n    singleOf(::UserService)\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: #768390\">\/\/ classic <\/span><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/    single&lt;UserRepository&gt; { UserRepositoryImpl() }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/    single { UserService(get())}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/ constructor DSL<\/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\">singleOf<\/span><span style=\"color: #ADBAC7\">(::<\/span><span style=\"color: #DCBDFB\">UserService<\/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>\uace0\uc804\uc801\uc778 \ubc29\uc2dd\uc73c\ub85c\ub294 get()\uc744 \uc774\uc6a9\ud558\uba74, module\uc5d0\uc11c \ud574\ub2f9 \uc778\uc2a4\ud134\uc2a4\ub97c \uaebc\ub0b4\uc62c \uc218 \uc788\ub2e4. \uc774\ub807\uac8c \uc778\uc790\ub85c \ub118\uaca8\uc900\ub2e4. \uc0c8\ub85c\uc6b4 constructor DSL\uc5d0\uc11c\ub294 \uc774 get()\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc790\ub3d9\uc73c\ub85c \ucc98\ub9ac\ud574\uc900\ub2e4. (\ub4a4\uc5d0\uc11c get()\uc744 \ucd94\uac00\ud574\uc8fc\ub294 \uac83\uc73c\ub85c \uc54c\uace0 \uc788\ub2e4. )<\/p>\n\n\n\n<p>\uc774\ub807\uac8c module\uc5d0 \ub123\uc5b4\uc8fc\uae34 \ud588\ub294\ub370, \ub0b4 \uc571\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud560\uae4c? \uc6b0\uc120,  Koin\uc758 \ucd08\uae30\ud654 \uc791\uc5c5\uc774 \ud544\uc694\ud558\ub2e4. \ubc14\ub85c startKoin \ud568\uc218\uac00 \uadf8 \uc5ed\ud560\uc774\uba70, \uc774\uac78 \uc5b4\ub518\uac00\uc5d0\uc11c \ubd88\ub7ec\uc918\uc57c \ud55c\ub2e4. \uc5ec\uae30\uc120 \ub2e8\uc21c\ud55c main\ud568\uc218\ub97c \uac16\ub294 Kotlin \uc571\uc774\ubbc0\ub85c, \uc5ec\uae30\uc11c \ubd88\ub7ec\uc8fc\uba74 \ub41c\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=\"fun main() {\n    startKoin {\n        modules(appModule)\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\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/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\">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><\/code><\/pre><\/div>\n\n\n\n<p>\uc0ac\uc2e4, Koin module\uc740 \uc5ec\ub7ec\uac1c\ub97c \ub9cc\ub4e4 \uc218\ub3c4 \uc788\uc73c\uba70, \uc774 startKoin\uc5d0\uc11c \uadf8 module\ub4e4\uc744 \ub85c\ub529\ud574\uc900\ub2e4. \uadf8\ub807\uac8c \ub85c\ub529\ub41c \ubaa8\ub4c8\ub4e4\uc774 \uc0ac\uc6a9 \uac00\ub2a5\ud574\uc9c0\ub294 \uac83\uc774\ub2e4. <\/p>\n\n\n\n<p>\uc774\uc81c \uc900\ube44\ub294 \ub2e4 \ub05d\ub0ac\ub2e4. \ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc774\ub807\uac8c \ub85c\ub529\ub41c \ubaa8\ub4c8\uc5d0\uc11c Injection\uc744 \uc5b4\ub5bb\uac8c \uc2dc\ud0ac\uc9c0 \ud558\ub294 \ubd80\ubd84\uc774\ub2e4. \ud3b8\uc758\uc0c1 UserApplication \ud074\ub798\uc2a4\ub97c \ucd94\uac00\ud558\uc790. \uc774\ub807\uac8c\ud558\uba74, main\ud568\uc218\ub97c \uc0ac\uc6a9\ud558\ub294 Kotlin \uc678\uc5d0\ub3c4 \uc801\uc6a9\ud560\ub9cc\ud55c \uad6c\uc870\uac00 \ub9cc\ub4e4\uc5b4\uc9c4\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 UserApplication : KoinComponent {\n    private val userService : UserService by inject()\n\n    init {\n        userService.saveDefaultUsers()\n    }\n\n    fun sayHello() {\n        val user = userService.getDefaultUser()\n        val message = &quot;Hello '$user'!&quot;\n        println(message)\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\">UserApplication<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">KoinComponent<\/span><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\"> userService : <\/span><span style=\"color: #F69D50\">UserService<\/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\">init<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        userService.<\/span><span style=\"color: #DCBDFB\">saveDefaultUsers<\/span><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: #ADBAC7\">    <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">sayHello<\/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\"> user <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> userService.<\/span><span style=\"color: #DCBDFB\">getDefaultUser<\/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\"> message <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;Hello &#39;<\/span><span style=\"color: #6CB6FF\">$user<\/span><span style=\"color: #96D0FF\">&#39;!&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(message)<\/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>\ucf54\ub4dc\ub97c \ubcf4\uba74, userService\ub97c by inject()\ub85c injection\ud574\uc8fc\uace0 \uc788\ub2e4. \uc774\ub294 UserApplication\uc774 \uc0c1\uc18d\ubc1b\ub294 \uc778\ud130\ud398\uc774\uc2a4\uc778 KoinComponent\uac00 \uc81c\uacf5\ud558\ub294 \uac83\uc73c\ub85c by inject()\ub294 lazy\ud558\uac8c \uc791\ub3d9\ud55c\ub2e4. \ubc14\ub85c \uc791\ub3d9\ud558\ub3c4\ub85d \ud558\ub824\uba74 get()\uc744 \uc0ac\uc6a9\ud558\uba74 \ub41c\ub2e4. \ucd5c\uc885\uc801\uc73c\ub85c \uba54\uc778\ud568\uc218\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc4f8 \uc218 \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(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=\"fun main() {\n    startKoin {\n        modules(appModule)\n    }\n\n    UserApplication().sayHello()\n}\n----\n\/\/ console result\n\/\/ Hello 'User(name=Koin)'!\" 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\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/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\">modules<\/span><span style=\"color: #ADBAC7\">(appModule)<\/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: #DCBDFB\">UserApplication<\/span><span style=\"color: #ADBAC7\">().<\/span><span style=\"color: #DCBDFB\">sayHello<\/span><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\">\/\/ console result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/ Hello &#39;User(name=Koin)&#39;!<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774 \uc678\uc5d0\ub3c4 \uc778\uc790\ub97c \uc804\ub2ec\ud558\uae30\uc704\ud55c parameterOf()\ub97c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc73c\uba70, \ub354 \ub9ce\uc740 \ub0b4\uc6a9\uc740 <a href=\"https:\/\/insert-koin.io\/docs\/reference\/koin-core\/dsl\">\uacf5\uc2dd \ubb38\uc11c<\/a>\ub97c \ucc38\uc870\ud558\uae30 \ubc14\ub780\ub2e4. \uc81c\uc77c \uc55e\uc5d0\uc11c \ub9d0\ud588\uc9c0\ub9cc, \ucf54\ub4dc\ub85c \ud06c\ub85c\uc2a4 \uccb4\ud06c\ud558\ub294 \uac83\ub3c4 \uc78a\uc9c0\ub9d0\uace0 \u314b <\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc2dc\uc791\ud558\uae30\uc5d0 \uc55e\uc11c \uac1c\ubc1c\uc790\ub85c \uc9c1\uc7a5\uc5d0\uc11c \uc77c\ud55c\uc9c0\ub294 \uc880 \uc624\ub798\ub410\uc9c0\ub9cc, \uc77c \ud560\ub54c \uc54c\uac8c\ub41c \uc9c4\ub9ac\uc911 \ud558\ub098\ub294 &#8220;\ubb38\uc11c\ub97c \uc788\ub294\uadf8\ub300\ub85c 100% \uc2e0\ub8b0\ud558\uc9c0 \ub9c8\ub77c&#8221;\uc600\ub2e4. \uc2ec\uc9c0\uc5b4 MS API\ubb38\uc11c\ub3c4 \uc9c1\uc811 \uc0ac\uc6a9\ud574\ubcf4\uba74 \ub2e4\ub974\uac8c \ub3d9\uc791\ud558\ub294 \uacbd\uc6b0\uac00 \uc788\uae30\ub3c4 \ud588\uc74c. \uc548\ud0c0\uae5d\uc9c0\ub9cc, \uac1c\ubc1c\uc790\ub294 \uacb0\uad6d \ucf54\ub4dc\ub85c \uc77d\uc5b4\uc57c \ud558\ub294 \uc874\uc7ac\ub780\uac78 \ub610 \uae68\ub2eb\ub294 \uacbd\ud5d8\uc744 \ud558\uac8c\ub410\ub2e4. Koin 4.0\uc774 \ub098\uc654\uc74c\uc5d0\ub3c4 \uacf5\uc2dd \uc0ac\uc774\ud2b8\uc758 \ubb38\uc11c\ub4e4\uc740 3.5\uc5d0 \uae30\ubc18\ud55c \ub0b4\uc6a9\ub4e4\uc774\ub2e4. \ubc84\uc804\ubcc4 API\ubb38\uc11c\ub3c4 \uc5c6\uace0, \uc2ec\uc9c0\uc5b4 \uac00\uc7a5 \uac04\ub2e8\ud55c Kotlin tutorial\ub3c4 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34],"tags":[102,412,38,188,413],"class_list":["post-2793","post","type-post","status-publish","format-standard","hentry","category-kotlin","tag-basic","tag-koin","tag-kotlin","tag-tutorial","tag-usage"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/2793","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=2793"}],"version-history":[{"count":68,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/2793\/revisions"}],"predecessor-version":[{"id":2865,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/2793\/revisions\/2865"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=2793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=2793"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=2793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}