본문 바로가기
프로그래밍 놀이터/안드로이드, Java

Android 와 DI ( Dependency Injection ) 이야기.

by 돼지왕 왕돼지 2014. 3. 23.
반응형

 Android와 DI ( Dependency Injection ) 이야기

 


Android 와 DI ( Dependency Injection ) 이야기.


의존 관계 주입 ( dependency injection ) 을 활용한 프로그래밍에서는 객체가 자신이 사용할 객체를 스스로 선택하지 않고, 제 3의 객체가 사용할 객체를 주입한다.

이를 의존 관계 역전 ( Inversion of control ) 이라고 부른다.




DI 의 이점은?


1. 객체의 생성 주기를 제어한다.

 이전에는 객체의 생성 지점 통제를 위해 singleton 패턴을 직접 구현했다. ( private 생성자, getInstance() method 등 )

 DI 프레임워크에서는 ApplicationContext, Injector, ObjectGraph 등으로 불리는 통합 객체 저장소에 일반적인 객체 등록하고, 이를 사용하는 쪽에서 @inject 같은 어노테이션으로 표시하여 객체를 주입받는다.



2. 객체에 부가 기능 추가.

 AOP ( Aspect Oriented Programming ) 을 이용하면,

 의존하는 객체에 같은 규약을 유지한 채로 로깅, 보안, 트랜잭션 처리, Exception 처리 등의 부가 기능을 추가할 수 있어 반복되는 코드를 줄이고 유연하게 각종 운영 정책을 변경할 수 있다.



3. 실행 환경에 따라 구현 객체를 바꿔치기한다.




안드로이드에서의 DI 는?


장벽이 꽤 있다.


1. 용량에 부담.

 서버에서는 jar 파일 하나를 추가해도 큰 영향이 없지만,

 모바일 기기에서는 한정된 자원을 이용하기 때문에 jar 파일의 용량, apk 파일의 용량, 메모리 사용량에 민감하다. 따라서 그 이득이 비용을 상쇄할만한지 냉정하게 평가하게 된다.



2. 성능에 부담.

 프레임워크를 사용하면 실행 시 Call Stack 이 늘어날 수 있다.

 일반 호출에 비해 성능이 안 좋은 reflection 도 DI 프레임워크에서 많이 사용된다.



3. Dalvik 에서는 cglib 과 같은 런타임 바이트 코드 생성 라이브러리를 사용할 수 없다.

 프레임워크의 기능이 한정되어 장점이 줄어든다.



4. 대체로 어플 규모가 작아 DI 로 얻는 이득이 크지 않다.



5. 안드로이드 기본 프레임워크과 DI 프레임워크의 조화를 고려해야 한다.

 Activity, Service 등 주요 객체는 이미 android 기본 프레임워크에서 등록되고 고유한 라이프사이클이 정의된다. 모든 객체에 일반화된 접근을 하는 DI 프레임워크를 android framework 에서 특수하게 관리하는 녀석들과 공유하면 어떤 이득이 있는지 확인해야 한다.



참고로 안드로이드는 Enum 과 Interface 의 사용을 권장하지 않는다.







정리


안드로이드에서는 DI 프레임워크가 쓰이기 어려운 장벽으로 용량 부담, 성능 부담, dalvik 의 제약, 어플리케이션 규모 등이 있다.

이를 기준으로 다음과 같은 개선이 되어 사용 가능하다.


1. 용량부담 줄이기

 패키지 구성을 경량화. 서버 쪽에서 쓰이는 녀석이 아닌, 꼭 필요한 녀석만 추려 경량화했다.

 Annotation processing 은 컴파일 타임에 의존하는 부분과 런타임에 의존하는 부분을 구분해서 더욱 용량이 줄었다.



2. 성능 부담 줄이기.

 런타임에서 콜스택을 늘리지 않고, 컴파일 타임에 동작하는 어노테이션 프로세싱을 적극 활용.



3. Dalvik 바이트 코드 조작에 대해여.

 어노테이션 프로세싱을 사용하여 소스를 생성한 후 컴파일 하는 방법으로 대체.



4. 어플리케이션 규모가 작은 문제.

 view 나 resource 같은 자원을 가져오는 코드가 간결해진다는 이점.



추천되는 library 는 roboguice android annotations.






반응형

댓글