Wiki Home

Dagger

의존성이란?

  • 코드에서 두 모듈간의 연결.
  • 두 클래스 간의 관계.
  • 의존성이 크다는 것은 Coupling(결합도)이 높다는 것.
  • 모듈이 n개 일 때 하나의 모듈 변경으로 인해 n-1개의 모듈이 영향 받음.

의존성 주입

  • 특정 객체의 인스턴스가 필요한 경우 이를 직접 생성하지 않고 외부에서 생성된 객체를 전달하는 기법.
  • 각 객체는 다른 객체의 생성에는 관여하지 않고, 객체를 필요로 하는 부분과 독립된 별도의 모듈이 객체 생성과 주입을 전담.

의존성 주입의 목적

  • 모듈을 testable하게 만들 수 있음. 모듈별 테스트 코드 작성 가능.
  • 하나의 모듈이 변경되어도 다른 모듈들이 영향 받지 않아 유지보수가 편해짐.
  • 모듈 내에서 다른 모듈을 초기화(new)하면 결합도가 모듈 간 높아짐. new 사용 x.
  • 클래스의 독립성이 증가되어 재사용성이 좋아짐.

의존성 주입의 이점

  • 목적에 따라 동작을 변경하기 쉬워짐.
  • 생성한 객체를 쉽게 재사용할 수 있음.
  • 객체를 생성하거나 사용할 때 발생할 실수를 줄여줌.(수정이 간편)

Dagger?

  • 자바, 안드로이드를 위해 만들어진 컴파일 타임 의존성 주입 프레임워크.
  • 추적가능한 boilerplate code를 컴파일 타임에 자동으로 생성함.
  • 리플렉션 사용(성능 이슈가 있음)이 없기 때문에 애용됨.

Annotation Processor의 이해

Annotation

  • 어노테이션은 메타데이터 클래스로 다른 클래스나 메소드, 필드, 심지어 또다른 어노테이션과 결합되어 사용됨.
  • 자바 어노테이션은 XML이나 Java마커 인터페이스처럼 추가적인 정보를 제공하는 대안.

Annotation Processor

  • 어노테이션 프로세서는 코드를 자동으로 생성해주는 역할을 함. 따라서 boilerplate code를 없앨 수 있음.
  • Dagger2는 어노테이션 기반으로 동작하여, 모든 코드는 컴파일 타임에 생성됨.
  • 그래서 퍼포먼스에 대한 오버헤드가 없고 에러에 대한 추적이 가능한 코드 생성.
  • 각 객체 간의 의존 관계는 어노테이션을 사용하여 정의함.
  • 정의된 의존관계는 어노테이션 프로세서를 통해 문제가 없는지 분석 절차를 거치며, 문제가 없다면 각 객체를 생성하는 코드 생성.
  • 의존 관계 검증과정과 필요한 코드를 생성하는 과정이 빌드 단계에서 일어나므로, 잘못된 의존관계로 인한 문제를 사전에 방지 가능.

SubComponent

Dagger는 component 를 생성할 때 builder pattern을 사용합니다. @Component 의 경우 코드가 generate 되기 때문에 기본적으로 builder 역시 generate 됩니다. 그러나 @Subcomponent 는 @Component 클래스 안에서 코드가 생성될 때 @Subcomponent.Builder 가 붙은 interface 가 없으면 builder 가 자동으로 생성되지 않습니다. 그러므로 @Subcomponent.Builder 가 꼭 필요합니다. Builder 에는 build 하기 전에 모듈을 파라미터로 넣을 수 있습니다. 이는 멤버변수를 가지고 있는 모듈이 있을 때 유용하게 사용할 수 있습니다. 참고로 create() 의 경우 자동으로 생성된 DaggerXXXComponent 클래스 안에 Builder().build() 를 리턴하도록 되어 있음.

@Binds는 추상메서드를 이용해서 좀 더 간략하게 binding을 구현할 때 사용합니다.