
싱글톤 패턴(Singleton Pattern) 완벽 이해와 구현 방법 – 실무 적용까지
싱글톤 패턴(Singleton Pattern)은 하나의 클래스에 대해 단 하나의 인스턴스만 존재하도록 보장하는 디자인 패턴입니다. 전역에서 동일한 객체를 공유해야 할 때 자주 사용되며, 메모리 절약 및 동기화 제어에 유리합니다. 이 글에서는 싱글톤의 개념, 구현 방식, Thread-safe 버전, 그리고 Spring에서의 활용까지 실무 중심으로 설명합니다.
1. 싱글톤 패턴이란?
싱글톤은 인스턴스를 하나만 생성하도록 보장하고, 이 인스턴스에 글로벌 접근을 제공하는 패턴입니다. 자원 관리를 위해 공통적으로 사용되는 객체 (예: 설정, 로그, 캐시) 등에 자주 적용됩니다.
2. 기본 싱글톤 구현 예제
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
// 생성자 private → 외부에서 생성 금지
}
public static Singleton getInstance() {
return instance;
}
}
사용법
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); // true
→ 두 객체는 동일한 인스턴스입니다.
3. Lazy Initialization (지연 초기화)
객체가 실제 사용될 때 생성하는 방식으로, 메모리 절약에 유리합니다. 단, 멀티스레드 환경에서는 동기화 이슈가 존재합니다.
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
4. Thread-safe 싱글톤 (Double-Checked Locking)
멀티스레드 환경에서 안전하게 Singleton을 구현하기 위해 사용하는 방식입니다.
public class ThreadSafeSingleton {
private static volatile ThreadSafeSingleton instance;
private ThreadSafeSingleton() {}
public static ThreadSafeSingleton getInstance() {
if (instance == null) {
synchronized (ThreadSafeSingleton.class) {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
}
}
return instance;
}
}
5. enum을 이용한 싱글톤 (가장 안전한 방법)
Java의 enum은 직렬화, 리플렉션, 멀티스레드 이슈를 모두 해결합니다. 따라서 가장 간단하면서도 안전한 싱글톤 구현 방식으로 권장됩니다.
public enum EnumSingleton {
INSTANCE;
public void doSomething() {
System.out.println("Doing something...");
}
}
사용
EnumSingleton.INSTANCE.doSomething();
6. Spring에서의 싱글톤
Spring은 기본적으로 Bean 객체를 싱글톤 스코프로 관리합니다.
즉, @Service, @Repository, @Component 등은 기본적으로 싱글톤으로 동작합니다.
예:
@Service
public class UserService {
...
}
위 클래스는 애플리케이션 전역에서 하나의 인스턴스로 관리되며, DI 컨테이너에서 필요 시 자동 주입됩니다.
7. 실무 적용 팁
- 단일 설정, 캐시, 공용 계산기 등 공유가 필요한 객체에 적합
- 동기화 이슈에 주의 – 쓰레드 환경이면 volatile + synchronized 고려
- Spring에서는 직접 싱글톤 구현 없이 Bean으로 대체 가능
- enum 방식은 강력하게 권장됨 (JDK 1.5+)
8. 결론
싱글톤 패턴은 객체 생성을 제어하여 메모리를 절약하고, 전역에서 동일한 인스턴스를 공유하고자 할 때 유용한 패턴입니다. 상황에 따라 기본, lazy, thread-safe, enum 방식 중 하나를 선택해야 하며, Spring을 사용하는 경우에는 Bean 스코프로 대체하는 것이 일반적입니다.