일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 빗버킷 #bitbucket #authorization failed #깃
- MVVM
- #SMS API #안드로이드 SMS #SMS Retriever
- #리사이클러뷰 어댑터
- 안드로이드 익명클래스
- #리사이클러뷰
- #안드로이드
- 레트로핏
- retrofit
- 메모리릭
- #android #안드로이드 #glide #gif #이미지다운로드
- #안드로이드 개발자 #안드로이드 신입 #개발자 이직 #안드로이드 면접 #신입 개발자
- 리사이클러뷰 체크박스
- retrofit2
- 안드로이드
- zeplin
- 안드로이드해상도
- #ContentProvider #App DataShare
- 사용법
- retrofi
- 안드로이드 메모리릭
- 안드로이드 아키텍쳐
- 클린아키텍쳐
- 구글맵안돼요
- 키스토어
- 제플린
- Today
- Total
땀이 삐질삐질 나는 개발 일기
DI(Dependency Injection)이란? 맛만 이라도 보자! 본문
안녕하세요. 개발자 삐질 입니다.
오늘은 Dependency Injection의 개념에 대해 간략하게 설명하겠습니다.
(정말 간략함 )
안드로이드 개발자기에 DI를 지원해주는 라이브러리로 Dagger / Koin을 사용할 수 있지만
오늘은 그런 모듈에 대한 사용보다는 세간에서 하도 DI DI DI DI 하니까 뭔지 맛만 보시라고 ..
한마디로 , 회사가 있다면 그 회사가 안드로이드 포지션이 있다면,
제가 그 개발자로 입사하던 , 이 글을 읽고계시는 분이 입사를 하던
동일하게 '개발'을 하면 된다 쯤?? 너무 추상적이죠? 코드로 한번 설명 해 보겠습니다.
예를들면 저는 T클래스에서 Sorting 작업을 하고 싶습니다.
그러나 Sorting은 Quick ,Bubble ~~ 여러가지가 있을 수 있고, 수행하던 소팅로직은 언제든지 다른 소팅으로 교체할 수 있습니다.
이러한 조건일때 우리가 기본적으로 필요한 곳에서 new를 사용해 수행하려면, 아래와 같이 작성할 수 있습니다.
(코드 간략화기 때문에 정확한 문법은 생략 합니다)
(사수의 코드를 인용)
class T () {
//소팅 클래스를 이용해
fun targetFunc(){
ASort a = new Asort()
//BSort b = new BSort()
a.sort()
//b.sort()
}
}
class ASort implement ISort{
fun sort()
}
class BSort implement ISort{
fun sort()
}
targetFunc가 ASort를 수행해야할땐 Asort 를 만들어서 a.sort()를 수행할 수 있도록 코드를 작성해야하고
아니다, B로 하자 싶다면 , B를 생성해서 b.sort를 수행할 수 있도록 코드를 재작성 해야 합니다.
그렇지만 이렇게 직접적으로 중요한 부위의 펑션을 자꾸 수정하게 되다 보면 내가 예상치 못한 다른 엮여 있는 곳에 영향을 줄 수도 있습니다. 동적으로 테스트를 해볼 수 가 없죠.
그렇지만 인젝션을 통해 주입을 하게 된다면 아래와 같이 수정 해 볼수 있습니다.
class T (Isort object) {
//소팅 클래스를 이용해
fun targetFunc(){
object.sort()
}
}
class ASort implement ISort{
fun sort()
}
class BSort implement ISort{
fun sort()
}
class InjectionModule(){
//외부 객체생성 모듈
val ASort a = new Asort()
val BSort b = new Bsort()
T = new T (ASort);
T = new T(BSort);
}
위와 같이 InjectionModule(외부에 객체생성을 담당하는 하나의 모듈공간) 에서 필요한 객체 또는 대체 될 객체들을 생성하고 T에 바꿔 주입하게되면 T는 나에게 주입되는 객체가 ASort , BSort 인지 몰라도 어쩃든 두놈다 Interface로 fun sort()라는 것을 구현하고 있기 떄문에 , T입장에서는 받은 객체로 object.sort()만 호출하게 되면 되죠.
그렇게 되면 T의 메인 로직은 전혀 수정할 게 없게 됩니다.
이로써 메인 로직에 의해서 T가 바뀌어야하는 결합도가 낮아지고
테스트 코드를 작성할 때 , 내가 원하는 어떤 로직을 쓰던, 최소한의 펑션 인터페이스(ex, ISort)만 구현해준다면
구현 내용부는 달라지던 같던 상관없게되니까 어떤 객체던 주입해서 원하는 결과를 테스트 해 볼수 있습니다.
가장 중요한 포인트는 ,
T클래스의 내용을 절대 변경하고 싶지 않다 !! 에요. (하다보면 어쩔 수 없이 변경될 수 있겠지만.. 이건 다음번 설명으로..
라이브러리에서 Deprecated시키는 이유 중 하나)
이떄문에 , 안드로이드 구조로 예를 들자면
VC (뷰 컨트롤러 ) ⇒ Model에 디펜던시가 강하게 걸리던 부분이 외부에서 주입해 주기 때문에 VC / M과의 결합도가 낮아지게 되는 것 입니다.
다만, DI의 장점은 강력하게는
- 테스트가 용이함
- 재사용성이 우수함
등이 있지만,
단점으로는
- 일단 클래스 복잡도 , 프로젝트 복잡도가 상당하게 증가
- 일관되게 이 패턴의 Rule을 지키는 것이 매우어렵고, 이 Rule을 지키기 위해 난잡해 질 가능성이 다분함
- 테스트 코드, 재사용을 위해 기초 설계를 매우 탄탄하게 해야 하기 때문에 상대적으로 개발의 비용이 큼
등이 있습니다.
둘다 스스로에게 허락 된 상황에 맞게 사용하면 장단을 잘 이용할 수 있을거라 생각합니다.
초급 안드로이드 개발자를 위한 카카오톡 오픈 채팅방을 운영 중 입니다.
(저는 마냥 친절한 방장은 아닙니다. 다만, 다 같이 성장하고 싶은 방장이며 개발자 입니다)
https://open.kakao.com/o/gn4xqQ6open.kakao.com/o/gH0XvThcopen.kakao.com/o/gH0XvThc
'개발 Tip' 카테고리의 다른 글
초보 카카오톡 오픈 채팅방 URL이 변경되었습니다. (0) | 2021.04.06 |
---|---|
[안드로이드]요즘 핫한 안드로이드 Mvvm 패턴을 공부하는 것.. (4) | 2020.08.26 |
[안드로이드] 아키텍쳐? 패턴 ? 처음엔 아무것도 모른다면 이것 만이라도.. (0) | 2020.04.30 |
[안드로이드] 심심해서 찍어본 Retrofit 동기 / 비동기 Feat.Rx (0) | 2020.04.22 |
[안드로이드] 기본적인 Recyclerview ViewType으로 홀더 나누기, 다른 Layout만들기 (0) | 2020.04.16 |