Dagger
by eunkyung
Dagger 입문
회사에서 팀이동을 하며 새로운 프로젝트에 합류하게 되었다. 새로운 프로젝트에는 mvvm과 dagger를 사용한다고 하여 새로 공부를 하며 정리를 해볼까 한다.
Dagger
Dagger : Java 주석을 기반으로하는 컴파일 타임 JSR-330 종속성 주입 프레임 워크.
Dependency injection(DI)
의존성 주입(dependency injection)이란? Dependency Injection (Inversion of Control 또는 IoC라고도 함)은 주어진 클래스가 의존하는 클래스를 작성하거나 제공하는 방법을 알아야 할 필요가 없다는 아이디어를 기반으로 한다. 이러한 종속성을 제공하는 것은 클래스 사용자 (또는 별도의 클래스 또는 팩토리)의 책임이어야 한다.
예를 들어 클래스 C와 클래스 D에 종속적 인 클래스 B를 사용하는 클래스가 있다고 가정 해 보자. 실제적으로 BusinessLogicClass에 의존하는 응용 프로그램과 계산기 및 데이터베이스에 따라 달라질 수 있다. A a = new A(new B(new C(), new D()))
의존성 삽입 프레임 워크는 모든 클래스에 대해 자동으로 팩토리를 생성하므로 종속성 또는 종속성의 종속성에 대한 걱정없이 A를 만들 수 있다. A a = new AFactory().getA()
의존성 주입 프레임 워크는 대개 바인딩이라고하는 매핑을 지정하는 언어와 함께 제공된다. 클래스는 클래스가 F Class를 요청할 때 클래스가 E Interface 또는 F Subclass를 요청할 때 E Impl을 만들어야한다고 지시하는 방법 일뿐이다. 이 언어를 사용하면 새 인스턴스를 생성 할시기를 선택할 수 있다. 모든 요청에 대해 전체 앱 ( “싱글 톤”) 또는 기타로 한 번 선택한다. Spring은 XML을 사용하고 Guice는 이를 위해 사용자 정의 Java 클래스 언어를 사용한다. Dagger는 Java 인터페이스, 클래스 및 주석을 사용한다.
DI를 사용하면 코드간 커플링을 감소시킬수 있고 재사용 및 유지보수를 용이하게 할 수 있다.
Dagger 에서 사용하는 기본적인 annotation 은 네 가지.
-
@Component : 실제 의존성 주입이 구현될 interface 또는 abstract class 에 사용되는 annotation. dagger는 이 annotation 이 달려있는 인터페이스에 의존성 주입 코드를 generate 한다. Component 클래스를 통해 우리는 의존성 주입을 할 수 있다.
-
@Module : 의존성 관계를 설정하는 클래스에 사용되는 annotation. 실제 객체 주입 관계에 대한 설정이 들어가 있다.
-
@Provides : 객체를 제공하기 위한 메서드에 달아주는 annotation.
-
@Inject : DI를 진행할 멤버변수와 생성자에 달아줌으로서 DI 대상을 확인할 수 있다. 또는 제공하고자 하는 클래스의 생성자에 달아줌으로서 제공 대상을 확인 할수 있게 해줌.
JSR 330
Java는 일부 인터페이스와 주석을 “JSR 330”으로 표준화하여 종속성 삽입 프레임 워크를 쉽게 전환하고 모든 프레임 워크에서 작동하는 라이브러리를 쉽게 작성할 수있게한다. Dagger는 Spring과 Guice처럼이 표준을 준수함.
Dagger를 사용하면 왜 컴파일 시간이 늘어날까?
Spring과 Guice를 포함한 다른 의존성 삽입 프레임 워크는 런타임에 구성을 수행함. Java 리플렉션을 사용하여 클래스의 생성자, 메소드 및 필드를 검사한다. 이는 서버 및 데스크톱의 제작 속도가 느릴 수 있으며 VM 차이 및 모바일 프로세서 / 메모리 제약 조건으로 인해 Android의 속도가 매우 느리게 된다. 결과적으로 Square와 Google의 팀은 Dagger와 Dagger 2에게 Java 주석 처리를 사용하여 컴파일시 클래스를 검사하고 일반 Java 객체에 대한 표준 Java 코드를 위의 팩토리처럼 작동하도록 작성했다. 리플렉션이 없는 일반 자바이기 때문에 Android 및 임베디드 시스템에서 훨씬 빠를 수 있으며 기존 도구를 사용하여 최적화 할 수 있다. Dagger 2 프로젝트는 Dagger를 구성하는 방법 및 리플렉션 사용을 피하는 방법에 대한 몇 가지 세부 사항을 변경하는 Google에서 관리하는 Dagger를 다시 작성한다. Dagger와 Dagger 2는 모두 Java에 대한 주석 기반 컴파일 타임 종속성 주입 프레임 워크.
Java Refelction
리플렉션이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법을 말한다. 투영, 반사 라는 사전적인 의미를 지니고 있다. reflection 은 자바의 특징이다. 실행중인 자바프로그램 내부를 검사하고 내부의 속성을 수정할 수 있도록 한다. 예를 들어, 어떤 자바클래스가 가진 모든 멤버의 이름을 얻거나 보여줄 수 있다. 자바에서 클래스가 그 자신을 조사하고 수정하는 것이 많다고 할수는 없으나 다른 언어에서는 볼수 없는 특징이다. reflection 이 구체적인 쓰임중에 하나가 빌더툴을 이용해서 소프트웨어 콤포넌트를 만드는 곳에서 이다. 툴은 reflection 을 사용해서 동적으로 로딩되는 자바 콤포넌트(클래스)의 속성을 얻을 수 있다.
Subscribe via RSS