소프트웨어를 설계할 때 하나의 인스턴스만 존재해야 하는 객체가 필요할 때가 있습니다. 예를 들어 설정값을 저장하는 Config 객체, 로그 시스템, 데이터베이스 연결 등은 여러 개의 인스턴스를 만들기보다 전역에서 하나만 존재해야 더 효율적입니다.
이런 요구를 만족시키기 위해 사용되는 디자인 패턴이 바로 싱글톤 패턴(Singleton Pattern) 입니다.
🔍 싱글톤 패턴이란?
싱글톤 패턴은 클래스의 인스턴스를 오직 하나만 생성하고, 어디서든 그 인스턴스에 접근할 수 있는 전역적인 접근 지점을 제공하는 생성 패턴입니다.
쉽게 말해, 프로그램 전체에서 단 하나만 존재해야 하는 객체를 보장하는 패턴입니다.
📦 언제 사용하나요?
- 설정 정보(Config)나 환경값을 어디서나 접근해야 할 때
- 로깅 시스템, 캐시, 데이터베이스 커넥션 풀처럼 공유 자원을 하나로 통제해야 할 때
- 전역 상태를 유지해야 하는 객체가 필요할 때
🔧 Java 싱글톤 패턴 예제
public class Singleton {
private static Singleton instance;
private Singleton() {
// private 생성자: 외부에서 new 금지
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
문제점: 멀티스레드 환경에서는 instance가 여러 번 생성될 수 있음
🛡 Thread-Safe 싱글톤 (Double-Checked Locking)
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
🧼 더 깔끔한 방법: 정적 내부 클래스 방식
public class Singleton {
private Singleton() {}
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
- JVM 클래스 로딩 시점의 특성을 이용해 lazy loading + thread-safe 구현 가능
- 성능도 좋고 코드도 깔끔해서 많이 쓰입니다
🚫 싱글톤의 단점
- 테스트하기 어려움: 전역 상태로 인해 테스트 간 의존성이 생김
- 유연성 부족: 의존성 주입(DI)을 사용한 구조와 충돌할 수 있음
- 숨겨진 의존성: 코드에서 의존 관계가 명확하게 드러나지 않음
🔁 싱글톤 vs 전역 변수
항목 | 싱글톤 패턴 | 전역 변수 |
인스턴스 통제 | ✔ 하나로 통제 | ✘ 여러 개 가능 |
객체 캡슐화 | ✔ 객체 중심 | ✘ 데이터 노출 |
테스트 용이성 | ✘ 어려움 | ✘ 더 어려움 |
설계 철학 | ✔ 객체지향적 | ✘ 절차적 |
✨ 마무리
싱글톤 패턴은 강력한 도구이지만, 잘못 사용하면 코드의 결합도(coupling)를 높이고 테스트를 어렵게 만들 수 있습니다.
의존성 주입 프레임워크(Spring 등)를 사용하는 경우에는 빈(bean) 스코프를 싱글톤으로 설정하여 대체하는 것이 더 현대적인 방식입니다.
'백엔드' 카테고리의 다른 글
디자인 패턴 : 어댑터 패턴(Adapter Pattern) (0) | 2025.05.06 |
---|---|
트랜잭션이란 무엇이고, ACID는 무엇인가요? (0) | 2025.05.06 |
메모리 누수: Memory Leak (1) | 2025.02.23 |
객체지향 설계 원칙 (SOLID) 개념과 적용 방법 (0) | 2025.02.17 |
Java의 Error와 Exception 차이점 (1) | 2025.02.15 |