일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 멤버변수
- 서비스 vs 쓰레드
- 안드로이드 라이선스
- 플러터 설치 2022
- 안드로이드 os 구조
- android ar 개발
- jvm 작동 원리
- 안드로이드 유닛 테스트
- 안드로이드 레트로핏 사용법
- jvm이란
- 안드로이드 레트로핏 crud
- ANR이란
- 스택 큐 차이
- rxjava disposable
- 안드로이드 라이선스 종류
- 객체
- rxjava cold observable
- 큐 자바 코드
- 2022 플러터 설치
- ar vr 차이
- 자바 다형성
- Rxjava Observable
- 스택 자바 코드
- rxjava hot observable
- 서비스 쓰레드 차이
- 클래스
- 2022 플러터 안드로이드 스튜디오
- 안드로이드 유닛 테스트 예시
- android retrofit login
- 안드로이드 유닛테스트란
- Today
- Total
나만을 위한 블로그
[Android] 의존성 주입(Dependency Injection)이란? 본문
이번 포스팅에선 안드로이드에서 자주 사용되는 의존성 주입이 무엇이고 왜 쓰는지 등에 대해 포스팅하려고 한다.
의존성이란 무엇일까? 사전에서 말하는 의존성과 주입의 정의는 아래와 같다.
의존성 : 다른 것에 의지하여 생활하거나 존재하는 성질
주입 : 흘러 들어가도록 부어 넣음
그럼 안드로이드에서 말하는 의존성이란 무엇일까?
종속성은 한 클래스의 객체가 제대로 작동하기 위해 다른 클래스의 객체가 필요할 때 발생한다. 이런 종속성은 종종 클래스의 멤버변수다
https://tony-programming.tistory.com/entry/Dependency-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%9D%B4%EB%9E%80
코드에서 두 모듈 간의 연결, 객체 지향 언어에서는 두 클래스 간의 관계라고도 말함
클래스 간의 관계는 보통 변수로 연결되니까, 안드로이드에서 말하는 의존성은 어떤 클래스의 멤버변수인 것 같다. 그 외에 앱 수준 gradle에 쓰는 의존성 문구도 의존성이라고 말하는 사람들도 있었다.
주입은 아래와 같은 의미라고 한다.
주입은 클래스 외부에서 객체를 생성해 해당 객체를 클래스 내부에 주입하는 것이다
의존성을 변수라고 가정한다면, 의존성 주입이란 클래스의 변수를 어떤 곳에 집어넣는단 뜻인가?
참고로 안드로이드 디벨로퍼에서 말하는 의존성 주입의 장점들은 아래와 같다.
https://developer.android.com/training/dependency-injection?hl=ko
종속 항목 삽입은 앱에 다음과 같은 이점을 제공한다.
- 클래스 재사용 및 종속 항목 분리 : 종속 항목 구현을 쉽게 분리할 수 있다. 컨트롤 반전으로 인해 코드 재사용이 개선되었으며 클래스가 더 이상 종속 항목 생성 방법을 제어하지 않지만 대신 모든 구성에서 작동한다
- 리팩토링 편의성 : 종속 항목은 API 노출 영역의 검증 가능한 요소가 되므로 구현 세부정보로 숨겨지지 않고, 객체 생성 타임 또는 컴파일 타임에 확인할 수 있다
- 테스트 편의성 : 클래스는 종속 항목을 관리하지 않으므로 테스트 시 다양한 구현을 전달해 모든 사례를 테스트할 수 있다
그럼 대체 의존성 주입이란 뭘까? 안드로이드 디벨로퍼에서 말하는 걸로는 잘 이해되지 않아서 위키백과와 다른 블로그들의 글을 참고해봤다.
https://en.wikipedia.org/wiki/Dependency_injection
종속성 주입은 객체가 종속성이라고 하는 다른 객체를 받는 기술이다. 일반적으로 수신 객체를 클라이언트라 하고 전달된(주입된) 객체를 서비스라고 한다. 서비스를 클라이언트에 전달하는 코드를 인젝터라고 한다. 클라이언트가 사용할 서비스를 지정하는 대신 인젝터는 클라이언트에게 사용할 서비스를 알려준다. 주입은 종속성(=서비스)을 사용하는 클라이언트로 전달하는 걸 말한다. 서비스는 클라이언트 상태의 일부가 된다. 클라이언트가 서비스를 빌드하거나 찾도록 허용하는 대신, 서비스를 클라이언트에 전달하는 것이 패턴의 기본 요구 사항이다. 의존성 주입의 목적은 객체의 구성과 사용에 대한 관심을 분리하는 것이다. 이것은 가독성과 코드 재사용을 증가시킬 수 있다. 종속성 주입은 제어 역전의 광범위한 기술의 한 형태다. 일부 서비스를 호출하려는 클라이언트는 해당 서비스를 구성하는 방법을 알 필요가 없다. 대신 클라이언트는 외부 코드(인젝터)에 위임한다. 클라이언트는 인젝터를 모른다. 인젝터는 존재하거나 인젝터 자체에 의해 구성될 수 있는 서비스를 클라이언트에 전달한다. 그 다음 클라이언트는 서비스를 사용한다. 이것은 클라이언트가 인젝터, 서비스 구성 방법 또는 실제로 사용 중인 서비스에 대해 알 필요가 없음을 의미한다. 클라이언트는 서비스의 인터페이스만 알면 된다. 이런 인터페이스는 클라이언트가 서비스를 사용할 수 있는 방법을 정의하기 때문이다. 이것은 사용의 책임과 건설의 책임을 분리한다
의존성 주입이란 클래스 간 의존성을 클래스 외부에서 주입하는 걸 말한다. 더 자세하게는 의존성 주입은 클래스에 대한 의존성의 인터페이스화를 통한 코드 유연성 증대 + 클래스의 인스턴스를 외부에서 생성해 주입하는 걸 말한다. 객체 지향 프로그래밍에서 클래스 간에 의존성이 있다는 건 클래스 간에 의존관계가 있다는 걸 말한다. 즉, 클래스 간에 의존(Dependency)관계가 있다는 건 한 클래스가 바뀔 때 다른 클래스가 영향을 받는다는 걸 말한다
https://www.section.io/engineering-education/android-dependency-injection-using-koin/
종속성 주입은 클래스를 종속성에서 독립적으로 만드는 프로그래밍 기술이다. 이것은 생성에서 객체의 사용을 분리함으로써 가능하다...(중략)...클래스 A와 B가 있다. B는 어떤 작업을 수행하기 위해 A의 인스턴스가 필요하다. B가 A에 직접 의존한다고 말하는 게 맞다. 따라서 종속 클래스를 사용하거나 매개변수로 전달하기 전에 종속 클래스의 인스턴스를 만드는 경우가 많다. 이것들은 모두 의존성 주입의 형태다. 이것은 소규모 프로젝트에 적합하다. 그러나 프로젝트가 확장됨에 따라 유지관리 및 테스트가 어려워진다. 여기서 의존성 주입 프레임워크가 작동한다.
https://medium.com/@lazysoul/dependency-injection%EC%9D%B4%EB%9E%80-7ff65bdf624
안드로이드는 context의 영향을 많이 받는 플랫폼이라 할 수 있다. 가장 큰 예로 액티비티 생명주기에 따라 자원을 생성하고 사용할 수 있다. 즉 액티비티, 프래그먼트 안에서 선언되고 사용되는 인스턴스들은 액티비티, 프래그먼트의 영향을 받는다. 인스턴스 생성 시 내부 환경의 영향을 받는다면, 같은 인스턴스라도 다른 환경에서 다르게 동작할 수 있다. 하지만 항상 같은 환경에서만 인스턴스를 생성하고 액티비티가 프래그먼트에서는 생성된 인스턴스를 받아서 사용만 한다면 내부 환경과 상관없이 같은 동작을 하며 범용적으로 재사용할 수 있다. 이런 개념을 의존성 주입이라고 한다
의존성 주입을 그림으로 보면 이런 형태다.
1번째 그림은 A 클래스 안에서 B 클래스의 객체를 만들지만 2번째 그림은 밖에서 의존성 주입 컨테이너에 의해 B 클래스 객체가 만들어져 A 클래스로 주입되는 형태다.
이 때 밖에 있는 의존성 주입 컨테이너에서 객체를 관리하게 되는데 이걸 IoC(제어의 역전)이라 한다.
정리하면 의존성 주입이란 이런 것 같다.
- 의존성은 클래스의 객체 형태고, 의존성 주입은 외부에서 객체를 주입하는 걸 말한다
- 의존성 주입은 인터페이스를 활용해서 수행할 수 있다
- 의존성 주입 시 액티비티, 프래그먼트가 객체를 공유해 사용할 수 있다
그럼 안드로이드에서 의존성 주입을 실현하기 위해선 어떤 라이브러리가 있을까?
아래는 현재 안드로이드에서 의존성 주입을 할 수 있도록 제공되는 라이브러리들의 목록이다. 가장 인기있는 건 Dagger라는 라이브러리같고, 이외에도 더 있겠지만 검색했을 때 보이는 것만 나열했다.
- Dagger
- Hilt
- Koin
참고한 블로그)
https://www.charlezz.com/?p=1259
'Android' 카테고리의 다른 글
[Android] java.lang.RuntimeException: Cannot create an instance of class viewmodel 에러 해결 (0) | 2021.09.20 |
---|---|
[Android] Application 클래스란? (0) | 2021.09.18 |
[Android] LiveData의 postValue() vs setValue() (0) | 2021.09.10 |
[Android] 리사이클러뷰 스크롤 중 데이터가 변경될 때 현재 위치를 유지하는 방법 (0) | 2021.08.12 |
[Android] Rxjava와 Retrofit 같이 사용하는 법 (0) | 2021.08.04 |