[Android] Dependency Injection with Koin

jeongminji4490ยท2022๋…„ 5์›” 2์ผ
0

Android

๋ชฉ๋ก ๋ณด๊ธฐ
10/26
post-thumbnail

What is Dependency Injection?

DI๋ผ๋Š” ๊ฐœ๋…์€ ์ตœ๊ทผ์— ์ฒ˜์Œ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ๊ป MVVM ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋งค๋ฒˆ ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ์—์„œ ๋ทฐ๋ชจ๋ธ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๋ฉฐ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ™”๋ฉด ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๋ทฐ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ ์žฆ์•„์กŒ๊ณ , ์ด๊ฒŒ ์—ฌ๊ฐ„ ๊ท€์ฐฎ์€ ์ผ์ด ์•„๋‹ˆ์˜€๋‹ค. ํ•˜์ง€๋งŒ DI ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์กด์žฌ๋ฅผ ์•Œ๊ฒŒ ๋œ ์ดํ›„, ๋‚ด๊ฐ€ ์ง€๊ธˆ๊ป ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ทฐ๋ชจ๋ธ์„ ๋น„๋กฏํ•œ ๋ชจ๋“ˆ๋“ค์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค (์—ญ์‹œ ๊ณต๋ถ€ํ•˜๋ฉด ๊ณต๋ถ€ํ• ์ˆ˜๋ก ๋‚ด๊ฐ€ ์ง€๊ธˆ๊ป ์•Œ๊ณ  ์žˆ์—ˆ๋˜ ๊ฑด ์ƒˆ๋ฐœ์˜ ํ”ผ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค :D). ์•Œ๋‹ค์‹œํ”ผ ๊ฐœ๋ฐœ์€ 'ํšจ์œจ'์„ ๊ต‰์žฅํžˆ ๋”ฐ์ง„๋‹ค. ์•„์ง DI๋ฅผ ์ œ๋Œ€๋กœ ์จ๋ณธ ์ ์€ ์—†์ง€๋งŒ, ์•ž์œผ๋กœ ์จ๋ณผ ๋‚ ์„ ์œ„ํ•ด DI์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ๊นŠ๊ฒŒ ํŒŒ๋ณธ ํ›„ Koin์„ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹ค์Šตํ•œ ๊ธฐ๋ก์„ ํฌ์ŠคํŒ…์— ๋‚จ๊ธฐ๋ ค ํ•œ๋‹ค!

Dependency Injection (DI)

DI๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™์˜ ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋‹ค. ์šฉ์–ด ๊ทธ ์ž์ฒด๋กœ '์˜์กด์„ฑ์„ ์ฃผ์ž…'ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

์˜์กด์„ฑ? ๊ทธ๊ฒŒ ๋ญ”๋ฐ?

public class User{
	val Database mDatabase;
    
    init {
    	this.mDataBase = Database()
    }
}

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด์ž. User ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ Database ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋Š”๊ฑด User ํด๋ž˜์Šค๋Š” Database ํด๋ž˜์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ƒ์„ฑ๋  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด User ํด๋ž˜์Šค๊ฐ€ Database ํด๋ž˜์Šค์— ์˜์กด์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ณ , Database ํด๋ž˜์Šค๋Š” User ํด๋ž˜์Šค์— ์ข…์†์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค?

์œ„ ์ฝ”๋“œ์—์„œ User ํด๋ž˜์Šค๋Š” Database ํด๋ž˜์Šค์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ–ˆ๊ณ , User ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ Database ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์„œ Database ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์–ป๋Š”๋‹ค.

์‚ฌ์‹ค ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ์„œ๋กœ ์˜์กด๋„๊ฐ€ ๋†’์•„ ์ข‹์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค๋ฅผ ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผํ•œ๋‹ค. ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ๋„ ํ•„์ˆ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ? User ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ ์ง์ ‘ Database๋ฅผ ๊ฐ์ฒดํ™”ํ•˜๋Š” ๊ฒƒ ๋Œ€์‹ ์—, User ์ƒ์„ฑ์ž์˜ argument๋กœ ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋˜์–ด ์žˆ๋˜ Database ์ธ์Šคํ„ด์Šค๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

public class User(val database : Database){
	val Database mDatabase;
    
    init {
    	this.mDataBase = database
    }
}

์ด๋ ‡๊ฒŒ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์˜์กด์„ฑ(์„ ๊ฐ€์ง„ ๊ฐ์ฒด)์„ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์„ ์˜์กด์„ฑ ์ฃผ์ž…, ์ฆ‰ Dependency Injection ์ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

Class : ๋‚˜๋Š” A๋ž‘ B๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ๋‘˜ ๋‹ค ์ค˜!
DI framework : ๊ทธ๋ž˜ ์•Œ๊ฒ ์–ด! ๋‚ด๊ฐ€ A๋ž‘ B๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ์ค„๊ฒŒ.

DI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐœ๋ฐœ์„ ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ๊ณผ ๋‹จ์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ 
1. ์œ ๋‹› ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
2. ์˜์กด์„ฑ ์ดˆ๊ธฐํ™”๊ฐ€ ๋ฏธ๋ฆฌ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
3. ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ ์ข€ ๋” ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹จ์ 
1. ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋†’๊ณ , ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋ฉด ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
2. ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์—๋Ÿฌ๋กœ ์ธํ•ด ๋Ÿฐํƒ€์ž„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
3. reflection ๋˜๋Š” ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•œ ๋ฆฌํŒฉํ† ๋ง๊ณผ ๊ฐ™์€ IDE ์ž๋™ํ™” ์‚ฌ์šฉ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌํŠผ ์žฅ์ ๋„ ์žˆ๊ณ , ๋‹จ์ ๋„ ์žˆ๋Š” DI์ง€๋งŒ, ๊ฒฐ๋ก ์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ณ , ๊ทธ์— ๋”ฐ๋ผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง€๋ฉฐ, ๋ชจ๋“ˆ ์žฌ์‚ฌ์šฉ ๋ฐ ์œ ๋‹› ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ DI๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋‹ค.

Koin


DI ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ Dagger, Dagger Hilt, Koin์ด ์žˆ๋Š”๋ฐ, ๋‚˜๋Š” ์•ž์„  2๊ฐœ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋‚ฎ๊ณ  ์ข€ ๋” ๊ฐ€๋ฒผ์šด Koin์„ ์ฐ๋จนํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

Koin์ด๋ž€ ์ˆœ์ˆ˜ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ์ž‘์„ฑ๋œ DI ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๋‚ด๋ถ€ ๋™์ž‘์€ Service Locator์˜ ํ˜•ํƒœ๋ฅผ ๋ˆ๋‹ค. Koin์€ ์•ž์„œ ๋งํ–ˆ๋‹ค์‹œํ”ผ ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋‚ฎ๊ณ , ์ฝ”ํ‹€๋ฆฐ ๊ฐœ๋ฐœํ™˜๊ฒฝ์— ๋„์ž…ํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ, ๋ทฐ๋ชจ๋ธ ์ฃผ์ž…์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์žฅ์  ๋•์— ๋งŽ์ด๋“ค ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค๋งŒ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฃผ์ž…๋Œ€์ƒ์„ ์„ ์ •ํ•˜๋Š” ๋‹ค๋ฅธ DI ํ”„๋ ˆ์ž„์›Œํฌ์— ๋น„ํ•ด ๋Ÿฐํƒ€์ž„์— Service locating์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„ ํผํฌ๋จผ์Šค๊ฐ€ ๋‹ค์†Œ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๊ณ , ์ด๋กœ ์ธํ•ด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

Koin์˜ ์ฃผ์š” ํ‚ค์›Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

module{ ... }

์ฃผ์ž…๋ฐ›๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด์˜ ์ง‘ํ•ฉ์ด๋‹ค.

single{ ... }

์•ฑ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๊ณ„์† ์œ ์ง€๋˜๋Š” ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์‹ฑ๊ธ€ํ†ค scope๋กœ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต repository, retrofit, db๋“ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

factory{ ... }

์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. factory๋กœ ์ œ๊ณต๋˜๋Š” ๊ฐ์ฒด๋Š” ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์‹œ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

viewModel { ... }

viewModel ํ‚ค์›Œ๋“œ๋กœ ๋ชจ๋“ˆ์„ ๋“ฑ๋กํ•˜๋ฉด koin์ด ํ•ด๋‹น ๋ทฐ๋ชจ๋ธ์„ ViewModelFactory์— ๋“ฑ๋กํ•œ ๋’ค ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ์™€ ๋ฐ”์ธ๋”ฉํ•˜๊ณ , ์ฃผ์ž… ๋ฐ›์„ ๋•Œ๋„ ViewModelFactory์—์„œ ํ•ด๋‹น ๋ทฐ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

get()

ํ•ด๋‹น ์ฝ”๋“œ ๋Ÿฐํƒ€์ž„์— ๋ฐ”๋กœ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค.

by inject()

get๊ณผ ๊ฐ™์ด ์•Œ๋งž์€ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋‚˜, val ๋ณ€์ˆ˜์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
lazy ๋ฐฉ์‹์˜ ์ฃผ์ž…์œผ๋กœ, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์‹œ์ ์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

Koin ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

koin์€ ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜๊ณ , Application ๋‹จ์œ„ ํด๋ž˜์Šค์—์„œ startKoin()์œผ๋กœ koin์„ ์‹คํ–‰ํ•˜์—ฌ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
1. Gradle ์„ค์ •

//Koin
def koin_version= "3.1.2"
implementation "io.insert-koin:koin-android:$koin_version"
implementation "io.insert-koin:koin-android-compat:$koin_version"
implementation "io.insert-koin:koin-androidx-workmanager:$koin_version"
implementation "io.insert-koin:koin-androidx-compose:$koin_version"

2. ๋ชจ๋“ˆ ์ƒ์„ฑ

val ViewModelModule = module {
    viewModel {MainViewModel(androidApplication())}
}

3. Application ๋‹จ์œ„ ํด๋ž˜์Šค์—์„œ ๋ชจ๋“ˆ ๋“ฑ๋ก ํ›„ manifest์— ์„ ์–ธ

class App: Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin{
            androidContext(this@App)
            modules(ViewModelModule)
        }
    }
}
<application
        ...
        android:name=".App"
</application>

onCreate() LifeCycle์—์„œ startKoin์„ ํ˜ธ์ถœํ•˜๊ณ  ์œ„์—์„œ ์„ ์–ธํ•œ ๋ชจ๋“ˆ ๋ณ€์ˆ˜๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
androidContext(...) : ํ•ด๋‹น ์•ˆ๋“œ๋กœ์ด๋“œ context ์‚ฌ์šฉ
modules(...) : ์‚ฌ์šฉํ•  ๋ชจ๋“ˆ ๋“ฑ๋ก

4. Activity ๋˜๋Š” Fragment ๋‚ด์—์„œ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐ›๊ธฐ

private val dViewModel: diaryViewModel by inject() 

(์ถ”๊ฐ€) Activity, Fragment ์™ธ๋ถ€์—์„œ koin์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํด๋ž˜์Šค์—์„œ๋„ ์˜์กด์„ฑ ์ฃผ์ž…์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜ ํด๋ž˜์Šค์—์„œ๋Š” get()์ด๋‚˜ by inject()๋ฅผ ์‚ฌ์šฉํ•ด ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•  ์ˆ˜ ์—†๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ Koin์„ ์‚ฌ์šฉํ•  ์‹œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋งž์ถ”์–ด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด๊ฐ€ ๋˜๋„๋ก ๋งŒ๋“ค์–ด์ ธ์•ผ ํ•œ๋‹ค. ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ ๋‚ด๋ถ€์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ ํ•ด๋‹นํ•˜๋Š” ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋”ฐ๋ฅด๊ฒ ์ง€๋งŒ, ์ผ๋ฐ˜ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์—ฌํŠผ ์ด๋ ‡๊ฒŒ ์ผ๋ฐ˜ ํด๋ž˜์Šค์—์„œ Koin์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด KoinComponent๋ผ๋Š” ๊ฒƒ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. KoinComponent๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด by inject(), get() ๋“ฑ์„ ์‚ฌ์šฉํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

class MyComponent : KoinComponent {

    // lazy inject Koin instance
    val myService : MyService by inject()

    // eager inject Koin instance
    val myService : MyService = get()
}

ํ•˜์ง€๋งŒ ๋‹ค์Œ์˜ StackOverFlow, ๊ธฐ์‚ฌ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์„ ์ œ์™ธํ•˜๋ฉด ์ด ๋ฐฉ๋ฒ•์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ KoinComponent๋ณด๋‹จ, ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ์—์„œ Koin์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

class MainActivity : AppCompatActivity() {
	private val dataStoreModule : DataStoreModule by inject()
    
    override fun onCreate(savedInstance: Bundle){
    	super.onCreate(savedInstanceState)
        ...
        Aclass(dataStpreModule)
    }
}
class Aclass(private val dataStoreModule: DataStoreModule) {
	...
}
๐Ÿ’› ๋„์›€์ด ๋œ ๋ฌธ์„œ ๋˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค

https://www.simplifiedcoding.net/android-dependency-injection/#What-is-Dependency
https://www.freecodecamp.org/news/a-quick-intro-to-dependency-injection-what-it-is-and-when-to-use-it-7578c84fa88f
https://stackoverflow.com/questions/14301389/why-does-one-use-dependency-injection
https://jaejong.tistory.com/153

0๊ฐœ์˜ ๋Œ“๊ธ€