Dagger2를 알아보자 – 기본편
Dagger2를 알아보자 – Scope (You’re here)
Dagger2를 알아보자 – Injection의 종류
Dagger2를 알아보자 – Qualifier
Dagger2를 알아보자 – Binding
Dagger2를 알아보자 – Multibinding
Dagger2를 알아보자 – SubComponent
Dagger2를 알아보자 – Android
Dagger2를 알아보자 – Testing(준비중)
Dagger2를 알아보자 – Dynamic Feature에 적용하기
Dagger의 Scope
@Singleton
Scope 애노테이션을 통해 특정 그래프 Scope내에서 객체의 재사용여부를 지정할 수 있습니다. 일반적으로 @Singleton 애노테이션을 사용하여 Scope를 지정하고 객체를 재사용합니다.
모듈클래스에서 @Provides메소드 또는 인젝트 가능한 클래스에서 @Singleton 애노테이션을 사용하면 됩니다.
@Provides @Singleton String provideName(){ return "Charles"; }
@Singleton public class CC { ... @Inject public CC(AA aa, BB bb){ ... } }
마찬가지로 Component에도 @Singleton 애노테이션을 붙여야합니다.
@Component(modules = {AModule.class, BModule.class}) @Singleton public interface MyComponent { ... }
컴포넌트에 붙은 Scope(범위)내에서 객체들을 관리 하게 되고, 처음 요청시에만 객체를 생성하고 그 다음 부터는 처음에 제공한 같은 인스턴스를 제공합니다.
@Singleton 애노테이션을 붙였다 뗐다하면서, 로그 및 디버깅을 통해 객체의 hashCode() 값을 확인해보시기 바랍니다.
@Reusable
@Reusable도 @Singleton을 비롯한 다른 커스텀 스코프와 비슷한 역할을 합니다. 특정 컴포넌트 스코프에 종속되지 않기 때문에 컴포넌트에 @Reusable을 선언하지 않아도 됩니다. 이전 객체를 재사용가능하면 재사용하고 아니면 새로 생성합니다. 즉 다른 스코프 애노테이션처럼 같은 인스턴스임을 보장하진 않습니다. 항상 동일한 인스턴스를 사용해야하는게 아니라면 메모리 관리측면에서 조금 더 효율적입니다.
Custom scope
물론 @Singleton대신 Custom scope을 만들 수 도 있습니다. Scope내에서 더 작은 Scope를 지정할 때, @Singleton 애노테이션 하나로 Scope를 나눌순 없을테니 말이죠. 아래와 같이 커스텀 스코프를 만들 수 있습니다.
@Scope @Retention(RetentionPolicy.RUNTIME) public @interface UserScope { }
5개의 댓글
BONI · 2020년 4월 14일 12:15 오후
‘Comonent’ -> ‘Component’ 오타 발견입니다 ㅎㅎ
Charlezz · 2020년 4월 15일 8:23 오전
감사합니다 🙂수정했습니다!
cslee · 2022년 9월 23일 9:47 오후
@singleton 의 목적은 객체 재사용 인데 스코프는 범위지정이란 의미죠 무슨 관련성이 있는지 이해가 안되내요
석이 · 2022년 9월 23일 9:48 오후
@singleton 의 목적은 객체 재사용 인데 스코프는 범위지정이란 의미죠 무슨 관련성이 있는지 이해가 안되내요
Charlezz · 2022년 9월 26일 10:26 오전
해당 범위(Scope)내에서 동일한 인스턴스 주입을 보장한다는 의미입니다. (재사용)