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 {
}
카테고리: Dagger2Java

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)내에서 동일한 인스턴스 주입을 보장한다는 의미입니다. (재사용)

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.