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
어노테이션을 사용하거나 바인딩 설정 또는 프로바이더를 통해 간단하게 싱글톤을 사용할 수 있습니다. 이를 활용하면 의존성 관리가 편리해지며, 메모리 사용량과 인스턴스 생성 비용을 줄일 수 있습니다.
관련 자료:
- Guice 공식 문서: https://github.com/google/guice
- Guice 싱글톤 관리 예제 코드: https://github.com/google/guice/wiki/Singleton