Singleton 패턴은 객체지향 프로그래밍에서 사용되는 디자인 패턴으로, 클래스의 인스턴스가 오직 한 개만 생성되도록 보장하는 패턴이다.
이는 전역적인 접근이 필요한 객체에 대해 단 하나의 인스턴스를 생성하고, 이를 모든 사용자에게 제공한다.
전역적인 리소스에 접근해야 하는 경우
설정 정보, 로그 기록 등의 중요한 데이터를 관리해야 하는 경우
비용이 큰 작업을 수행하는 경우
프라이빗 생성자(private constructor):
정적 메서드(static method)로 유일한 인스턴스 반환:
지연 초기화(Lazy Initialization):
스레드 안전성(Thread Safety):
public class Singleton {
private static Singleton instance;
private Singleton() {
// private 생성자
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
위의 코드에서 Singleton 클래스는 인스턴스가 단 하나만 생성되도록 보장한다. instance라는 정적 필드를 선언하고, getInstance() 메서드를 통해 유일한 인스턴스를 반환하게 된다.
private Singleton():
public static synchronized Singleton getInstance():
위의 예시 코드는 지연 로딩 방식을 사용하고 있으며, 처음으로 인스턴스가 요청되는 시점에 인스턴스를 생성한다. 또한, synchronized 키워드를 사용하여 다중 스레드 환경에서의 스레드 안전성을 보장한다.
Singleton 패턴을 사용하면 전역적인 접근이 필요한 객체를 효율적으로 관리할 수 있다. 하지만 Singleton 패턴은 과도한 사용은 코드의 유연성을 감소시킬 수 있으므로, 적절한 상황에서 사용하는 것이 중요하다.
Spring에서 빈이 Singleton으로 관리되는 이유는 다음과 같다.
성능 및 자원 관리:
일관성과 데이터 공유:
의존성 주입(Dependency Injection)의 편의성:
관계 정리
Spring에서는 개발자가 직접 싱글톤 패턴을 구현하거나 인스턴스를 관리하지 않아도 된다. Spring 컨테이너가 빈의 생명주기를 관리하고, 필요한 곳에 필요한 빈을 주입하여 Singleton 패턴과 관련된 작업을 대신 처리해 준다.
또한, Spring은 Singleton 이외의 다른 스코프(scope)도 지원한다. Prototype, Request, Session, Application 등 다양한 스코프를 제공하여 필요에 따라 인스턴스를 생성하고 관리할 수 있다. 이렇게 함으로써 더 세밀한 객체 생명주기 관리와 다양한 요구사항을 처리할 수 있다.