싱글톤 패턴(Singleton Pattern)은 애플리케이션 전체에서 클래스의 인스턴스(객체)가 오직 단 하나만 생성되도록 강제하고, 어디서든 그 인스턴스에 접근할 수 있도록 전역적인 접근점(Global Access Point)을 제공하는 생성(Creational) 디자인 패턴입니다.
1. 싱글톤 패턴의 구조 (UML)
외부에서 new 키워드를 사용해 객체를 마구잡이로 찍어내는 것을 막기 위해 생성자를 Private으로 숨기는 것이 핵심입니다.
2. 싱글톤 패턴의 장단점
장점 (Pros)
단점 및 한계 (Cons)
1. 메모리 낭비 방지: 수많은 요청이 들어와도 객체를 매번 생성하지 않으므로 메모리를 크게 절약합니다.
2. 상태 공유 용이: 전역 인스턴스이므로 다른 클래스의 인스턴스들이 이 싱글톤 객체의 데이터를 쉽게 공유할 수 있습니다.
1. 멀티스레드 동시성 문제: 여러 스레드가 동시에 인스턴스를 생성하려 할 때 락(Lock) 처리를 제대로 안 하면 인스턴스가 2개 생길 수 있습니다.
2. 단위 테스트(Unit Test)의 어려움: 상태를 공유하는 전역(Global) 성격을 띠기 때문에 각 테스트가 독립적으로 실행되기 매우 까다롭습니다.
💡 실무 지식: 어디에 쓰나요? (Use Cases)
애플리케이션 내에서 공용으로 사용해야 하고, 여러 개가 만들어지면 로직이 꼬이거나 리소스가 낭비되는 객체들에 사용합니다. 대표적으로 데이터베이스 커넥션 풀(DB Connection Pool), 로거(Logger), 애플리케이션 환경 설정(Configuration Manager), 스레드 풀(Thread Pool) 관리자 등이 있습니다.
// 📂 DatabaseConnection.js (JavaScript)
// 모듈 스코프나 클로저를 활용한 싱글톤 패턴
class DatabaseConnection {
constructor() {
if (DatabaseConnection.instance) {
return DatabaseConnection.instance;
}
console.log("데이터베이스 연결 초기화 완료");
DatabaseConnection.instance = this;
return this;
}
executeQuery(query) {
console.log(`쿼리 실행: ${query}`);
}
}
// 📂 main.js (사용 예시)
const db1 = new DatabaseConnection();
const db2 = new DatabaseConnection();
console.log("인스턴스가 동일한가?:", db1 === db2); // true
db1.executeQuery("SELECT * FROM users");