- 인스턴스를 하나만 만들어 관리하는 패턴
- 주로 DB 커넥션을 관리할 때 싱글톤 패턴을 사용한다, 커넥션 인스턴스를 하나만 생성하고 관리하여 생성 비용을 아끼는 것
- Node.js에서 MongoDB, MySQL 연동할 때 쓰는 라이브러리들도 실제로 싱글톤 패턴으로 구현되어 있음
- TDD 기법에선 단점이 생기는데, 주로 단위 테스트는 독립적으로 실행을 해야 하는데 싱글톤 패턴은 미리 생성된 하나의 인스턴스로 구현되다 보니, 각 테스트마다 독립적으로 인스턴스를 만들기 어려운 점이 있다
- 사용하기 쉽고 실용적이지만, 모듈 간의 결합을 강하게 만드는 단점도 있는데, 이는 DI를 통해 의존성을 주입받는걸로 추상화를 시키면 결합을 조금 느슨하게 만들어줄 순 있다
class SingleTon {
static final SingleTon instance = new SingleTon();
private SingleTon() {
// 초기화
}
public SingleTon getInstance() {
return instance;
}
}
public class TestCode {
public static void main(String[] args) {
SingleTon a = SingleTon.getInstance();
SingleTon b = SingleTon.getInstance();
System.out.println(a == b); // true
}
}
- Spring에서의 싱글톤 패턴은 관리 면에서 다른 부분이 있다
- 일반 Java의 싱글톤은 JVM에서 제어를 할 수 있으나, Spring에선 Spring Context에 의해 제어가 된다
- 이는 인스턴스 생성이 Spring Context에 의해 만들어지기 때문에 관리를 할 수 있으며, Thread Safety를 보장한다고 한다, 반면 일반 Java 싱글톤은 보장하진 못한다