💻 개발/TIL

[TIL] 22.03.20

고도고도 2022. 3. 20. 23:48

공부한 것

안드로이드 강의 수강
의존성 주입
프로그래머스 1문제

알게된 것

1. 의존성 주입 (Dependancy Injection)

이번에 의존성 주입이라는 것을 처음 접하게 됐다. 의존성 이라는 단어 자체를 build.gradle 에 선언하는 implementation 'org.jetbrains... 처럼 라이브러리 추가 말고는 접해본 적이 없었다. 아무튼 오늘 강의 를 수강하면서 의존성 주입 라이브러리인 Koin 을 접했고 이에 관해서 좀 더 찾아보는 시간을 가졌다.

 

의존성 주입 이라는 개념 자체는 어렵지 않았다. 우선 코드를 살펴보자.

class Car {
    private val engine = Engine()

    private fun start() {
        engine.start()
    }
}

class Engine {
    ...
}

fun main() {
    val car = Car()
    car.start()
}

위 코드의 특징은 CarEngine 이 의존성을 갖고 있다. CarEngine 클래스 참조가 필요하고 Car 가 실행되기 위해선 Engine인스턴스 가 필요하다.

 

의존성 을 어떻게 없앨 수 있을까? 생성자 삽입필드 삽입 두 가지 방법이 존재한다. 아래 코드를 보자.

class Car(private val engine: Engine) {
    private fun start() {
        engine.start()
    }
}

class Engine {
    ...
}

fun main() {
    val car = Car()
    car.start()
}

Car 의 생성자 매개변수로 Engine 을 전달함으로써 의존성 을 제거(주입)했다.

class Car {
    lateinit var engine : Engine
    private fun start() {
        engine.start()
    }
}

class Engine {
    ...
}

fun main() {
    val car = Car()
    car.engine = Engine()
    car.start()
}

Car 의 필드에 지연 초기화 를 사용하여 Engine 을 전달함으로써 의존성 을 제거(주입)했다.

 

그렇다면 의존성 주입 의 이점은 무엇일까? 일단 종속 관계가 아니므로 테스트가 용이하다. 또한 코드 재사용이 가능해진다. 코드 수정 즉, 리펙토링 이 필요할 때 의존성 주입 이 되어 있는 코드가 훨씬 리펙토링 이 수월할 것이다. 하지만 여기서 문제가 발생한다. 의존성 주입 의 이점이 많지만 문제는 앱이 커질수록 클래스 가 필요로 하는 의존성 들이 많아지고, 이러한 의존성 은 또 다른 의존성 을 필요로 하기에 의존성 주입 을 위한 코드 들이 많아진다. 결국 보일러플레이트 코드 가 점점 커지게 되는 부작용? 이 발생한다. 이러한 부작용? 을 없애기 위해 안드로이드 에서는 의존성 주입 을 위한 Dagger Hilt Koin 와 같은 다양한 라이브러리들이 존재한다. 우선 나는 러닝 커브 가 가장 낮다고 판단된 Koin 을 사용해보려고 한다.

 

정말 잘 정리된 글이 있어서 첨부했다.

 

1. Dependency injection in Android

2. 의존성 주입에 대한 기본 이해

3. 의존성 주입이란?

공부할 것

Koin 과 친해지기

느낀 점

요새 정말 공부의 필요성을 절실히 느끼고 있다. coroutine MVVM flow 등등... 점점 알고 있는게 많아지는 것 같긴한데 익숙하지가 않다. 적용하는데도 많이 어렵고 일단 러닝 커브 가 높다고 느낀다. 좀 더 체계적으로 공부를 해야겠다.

'💻 개발 > TIL' 카테고리의 다른 글

[TIL] 22.03.23  (0) 2022.03.23
[TIL] 22.03.22  (0) 2022.03.22
[TIL] 22.03.20  (0) 2022.03.20
[TIL] 22.03.19  (0) 2022.03.19
[TIL] 22.03.17  (0) 2022.03.17
[TIL] 22.03.16  (0) 2022.03.16