[Android] Dependency Injection

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

Android

๋ชฉ๋ก ๋ณด๊ธฐ
10/39
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๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ DI ํ”„๋ ˆ์ž„์›Œํฌ๋กœ Dagger, Hilt, Koin์ด ์žˆ๋‹ค. Hilt์™€ Koin์— ๋Œ€ํ•œ ํฌ์ŠคํŒ…์„ ๋‚จ๊ฒจ๋†“์•˜์œผ๋‹ˆ, ๊ถ๊ธˆํ•˜๋ฉด ์•„๋ž˜์˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•ด์„œ ํ™•์ธํ•ด๋ณด์ž.

๊ด€๋ จ ํฌ์ŠคํŒ… : Hilt
๊ด€๋ จ ํฌ์ŠคํŒ… : Koin

References

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

profile
Mobile Software Engineer

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