DI
Dependency Injection
의존성 주입
소프트웨어를 레고의 블럭 처럼 쪼개서 여러 부분으로 나눠 사용하는 개념으로 보면 된다.
사실, 레고라는 개념보다 자동화 시스템이 적용된 레고라? 보는게 맞는거 같다.
즉, 엄청나게 큰 물체를 레고로 만들었다.
그런데 가장 깊숙하게 있는 부품을 바꾸려면 모든 레고의 겉면을 까내야 하는데
SW에서는 이렇지 않고 새로운 부품을 정의해주고, 주입만해주면 간편하게
변경이 된다는 것이다.
더 똑똑하고 간편한 방법이다.
물리적인 변형이 아니여서 설계만 잘한다면, 간편하게 수정이 가능하다는 의미이다.
의존성 주입을 왜 하나?
핵심은 이렇게 하면 새로운 기능을 업데이트 하거나 코드를 수정할 때
빠르고
간편하게
수정과 변형이 가능하기 때문이다.
이 점을 분명하게 인식하고 사용법을 익혀야 한다.
DI 의 필요성
1. 변경의 전이
레고의 핵심 부품이 제일 깊숙히 있는 경우?
PC의 cpu를 바꿔야 하는 경우?
물리적인 형태의 물건들은 이러한 것을 직접 띄어내서 바꾸거나
아예 못바꾸는 경우가 많다.
DI를 적용하면, SW상으로는 이런 말도 안되는 행동이 가능하다.
게다가 해당 부품이 연결된 부분이 있는 경우 조건만 잘 맞춰 준다면,
한 방에 모두 변경된 부분의 효과를 적용해 줄 수 있다.
이러한 기능? 을 변경의 전이라고 한다.
이러한 대단한 기능을 구현하려면 Interface가 필요해진다.
중간의 다리를 하나 만드는 것이다. ( 어찌보면 코드가 더 많아지는 경우가 된다. )
2. 제어의 역전 IoC
Inversion of Control
어떠한 일을 수행하도록 만들어진 프레임워크에
제어권한을 위임하여 관심사를 분리하는 것을 의미한다.
간단히 말하면, 객체를 한 class안에서 생성하여 사용했다면,
아예 다른 class에서 객체를 생성하여 가져온다는 것이다.
서로 연관되어있는 기능들을
그냥 다 분리해서 따로따로 놀게 한다고 보면 된다. (맞겠찌?)
의존성 주입의 장단점
장점 |
DI는 인터페이스 기반이다! |
제대로 사용할 줄 알면, 확실히 코드가 유연하다. |
리팩토링이 수월하다! (이게 최대 장점인듯) |
Stub, Mock객체를 사용하여 단위테스트가 가능하다. (최고 장점이라는데, 아직 무슨 의미인지 이해가 안된다.) |
클래스 간의 결합도 DOWN! (결합도는 낮게, 응집도는 크게!) |
여러 개발자가 서로 사용되는 클래스를 개발할 수 있다. (속도가 빠르거나, 다양한 시도를 할 수 있다는 의미인듯하다.) |
단점 |
간단한 프로그램에 적용하면 빡세다. ( 당연하다...) |
동작과 구성의 분리! 그냥 다 분해 되어있어서 가독성 과 이리저리 많이 파일을 이동하면서 파악해야하는 번거로움이 있다.(사용하다보면 익숙해질듯) |
빌드 시간 소요가 좀 더 난다. (@이런거 많이 쓰니깐?) |
DI를 추천하는 방향 일반적인 상용 서비스를 제작하고, 유지보수 해나갈 생각이라면, 추천(이 부분은 격하게 공감한다. 퍼블리싱 단계를 지나 업데이틀 진행하다보면, 점점 코드가 비대해지는게 느껴진다. )
Dagger2?
Dagger2는 자바와 안드로이드를 위한 강력,빠른 DI FrameWork이다. 무슨말인지 모르지만,- 리플렉션을 사용하지 않는다. - 런 타임에 바이트 코드도 생성하지 않는다. - @(어노테이션) 프로세서에 의해 DI와 관련된 모든 코드를 분석하고 자바 소스를 생성한단다.(뭔말인지 모름)
핵심 단어들
Module Inject ComponentSubcomponentProvides
Why Dagger2?
- 자원 공유의 단순화 :: 액티브의 생명주기 내에서는 동일 인스턴스를 제공한다. - 복잡한 DI를 좀 단순하게 설정한다. - 유닛 테스트 쉽다. - 자동 코드 생성 기능 - 아마 DaggerComponent부분을 말하는 듯하다...? - 난독화에서 조금 문제가 덜하다? ( 이건 기분탓) - 라이브러리가 크기가 작아서 부담없다.
내가 보기엔 그닥 쓸만한게 없어서 이거 쓰는 듯하다.
새로운 DI 가 많이 있는듯 하다. Hilt(안드에서미는거).. Dagger... Koin(코틀린적합하다는데 이건)
'Programming > Android' 카테고리의 다른 글
[BottomNavigation] ViewPager2 적용 (0) | 2021.06.09 |
---|---|
[Ad] 광고 도구 (0) | 2020.12.25 |
[Android] Dagger2 (0) | 2020.12.16 |