🧠 싱글톤 패턴(Singleton Pattern)이란?
- 클래스의 인스턴스(객체)를 오직 하나만 생성되도록 보장하는 디자인 패턴
- 주로 리소스를 공유하거나 동일한 객체가 반복 생성되는 상황에서 사용됨
📈 왜 싱글톤이 필요한가?
Web Application은 불특정 다수의 고객이 동시에 많은 요청 전송

→ 요청을 할 때마다 객체가 새로 생성되고 처리가 완료되면 소멸
→ 메모리 낭비 심각
싱글톤 패턴 적용
- 객체 인스턴스가 하나만 생성되고 생성된 인스턴스만 사용하도록 만듦
→ 객체가 한번만 생성되어 리소스를 절약할 수 있음
🛠️ 싱글톤 패턴 구현 (기본 Java 방식)
public class Singleton {
private static Singleton instance;
private Singleton() {} // 외부에서 new 막음
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton(); // 최초 1회 생성
}
return instance;
}
}
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); // true (같은 객체)
✅ 장점
❌ 단점
⚠️ 싱글톤의 대표 문제점
Singleton service = SingletonImpl.getInstance();
→ 위처럼 구현체에 직접 접근하면 다른 구현체로 바꾸기 어려움 → DIP 위반
📦 Spring의 싱글톤 컨테이너

→ Spring Container는 싱글톤 패턴의 문제점들을 해결하면서 객체를 싱글톤으로 관리
→ Spring Bean은 싱글톤으로 관리되는 객체
| 특징 | 내용 |
|---|---|
| 생성 타이밍 | 애플리케이션 시작 시 1번만 생성 |
| 공유 방식 | 요청이 올 때마다 같은 Bean 반환 |
| 확장 가능 | 필요 시 프로토타입 등 다른 스코프로 설정 가능 |
@Scope("prototype") // 요청마다 새 객체
@Component
public class PrototypeService {}
🚫 싱글톤 패턴의 주의점
🧨 상태 유지 문제 (stateful)
client1.setValue(42);
client2.setValue(100);
client1.getValue(); // 100 ← 예상과 다른 값
❌ 잘못된 예시 (stateful)
public class StatefulSingleton {
private int value; // 상태 필드
...
}
✅ 올바른 설계 (stateless)
public class StatelessService {
public int process(int input) {
return input * 2; // 내부 상태 저장 없이 처리
}
}