[java] Guice의 싱글톤(Singleton) 관리

Guice는 자바 의존성 주입(Dependency Injection) 프레임워크로, 의존성 관리를 편리하게 해주는 많은 기능을 제공합니다. 그 중 하나는 싱글톤(Singleton) 관리입니다. 싱글톤은 한 개의 인스턴스만을 생성하여 여러 곳에서 공유해서 사용하는 디자인 패턴입니다. Guice를 사용하여 싱글톤을 관리하는 방법에 대해 알아보겠습니다.

@Singleton 어노테이션 사용

Guice는 @Singleton 어노테이션을 사용하여 클래스를 싱글톤으로 지정할 수 있습니다. 해당 어노테이션을 클래스에 추가하면 Guice가 해당 클래스의 싱글톤 인스턴스를 관리합니다.

import com.google.inject.Singleton;

@Singleton
public class MySingleton {
    // ...
}

위의 예제에서 MySingleton 클래스에 @Singleton 어노테이션을 추가하면 MySingleton의 인스턴스는 Guice에서 싱글톤으로 관리됩니다. Guice는 해당 타입에 대해 한 번만 인스턴스를 생성하고 이후에는 동일한 인스턴스를 반환합니다.

바인딩(Binding) 설정

Guice는 바인딩 설정을 통해 클래스와 인터페이스의 의존성을 매핑합니다. 싱글톤으로 관리하고자 하는 클래스의 바인딩 설정에 Singleton.class를 사용하면 해당 클래스가 싱글톤으로 관리됩니다.

import com.google.inject.AbstractModule;

public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(MySingleton.class).in(Singleton.class);
    }
}

위의 예제에서 MySingleton 클래스를 싱글톤으로 관리하도록 bind 메서드와 Singleton.class를 사용하여 바인딩 설정을 하였습니다.

프로바이더(Provider) 사용

Guice는 프로바이더(Provider)를 통해 싱글톤 인스턴스를 제공할 수 있습니다. 프로바이더는 해당 타입의 인스턴스를 제공하는 역할을 합니다.

import com.google.inject.Provider;

public class MySingletonProvider implements Provider<MySingleton> {
    private static final MySingleton INSTANCE = new MySingleton();

    @Override
    public MySingleton get() {
        return INSTANCE;
    }
}

위의 예제에서 MySingletonProvider 클래스는 MySingleton의 인스턴스를 제공하는 프로바이더입니다. Guice에게 MySingletonProvider를 등록하여 MySingleton의 싱글톤 인스턴스를 반환할 수 있습니다.

import com.google.inject.AbstractModule;

public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(MySingleton.class).toProvider(MySingletonProvider.class);
    }
}

위의 예제에서 bind 메서드와 toProvider 메서드를 사용하여 MySingletonProvider를 등록하였습니다.

결론

Guice를 사용하여 싱글톤을 관리하는 방법에 대해 알아보았습니다. @Singleton 어노테이션을 사용하거나 바인딩 설정 또는 프로바이더를 통해 간단하게 싱글톤을 사용할 수 있습니다. 이를 활용하면 의존성 관리가 편리해지며, 메모리 사용량과 인스턴스 생성 비용을 줄일 수 있습니다.

관련 자료: