티스토리 뷰
싱글톤 패턴이란?
객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다. 즉, 하나의 클래스에 오직 하나의 인스턴스만 가진다.
public class Singleton {
private static Singleton INSTANCE = new Singleton();
private Singleton() {
// 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
}
public static Singleton getInstance() {
return INSTANCE;
}
public void say() {
System.out.println("hi, there");
}
}
생성자를 private으로 선언하고 static 변수에 객체를 담아 그 객체만을 반환하는 메서드를 구현한다.
싱글톤 패턴을 사용하는 이유
메모리 낭비 방지
- 최초 한 번의 new 연산자를 통해 고정된 메모리 영역 사용
- 이미 생성된 인스턴스를 활용하여 속도도 빠름.
다른 클래스 간에 쉬운 데이터 공유
- 전역으로 사용되기 때문에 다른 클래스의 인스턴스들이 접근 가능.
- 하지만, 여러 클래스에서 동시에 접근하면 동시성 문제가 발생할 수 있음.
도메인 관점에서 인스턴스가 한 개만 존재하는 것을 보증하고 싶은 경우
싱글톤 패턴의 문제점
멀티스레드 환경
- 멀티스레드 환경에서 동기화 처리를 안 하면 인스턴스가 두 개가 생성된다든지 하는 경우가 발생할 수 있음
- 따라서 멀티스레드 환경에서 안전하게 싱글 톤 객체를 만드는 방법에 대해 고민해 봐야 함.
의존 관계상 클라이언트가 구체 클래스에 의존하게 됨
- 클래스 안에서 객체를 생성하고 있으므로 SOLID 원칙 중 DIP(의존 역전 원칙)를 위반함
- 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유할 경우 다른 클래스의 인스턴스들 간에 결합도가 높아짐.
테스트 코드 작성의 어려움
- 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행 가능해야 함
- 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 독립적인 인스턴스를 만들기 어려움
- 격리된 환경에서 테스트가 수행되려면 매번 인스턴스의 상태를 초기화해야 함.
정리 및 느낀 점
한 개의 인스턴스 생성을 보증함으로써 효율을 찾을 수 있지만, 객체 지향에 위반하는 사례가 많다고 한다. 스프링 같은 싱글톤 객체 컨테이너를 통해 이를 보완해 나갈 수 있다.
지금까지 개발 공부를 해오면서 싱글톤 패턴을 아주 많이 사용해왔다. 주로 스프링 프레임워크를 통해 개발을 해왔으니 프로젝트를 한다면 항상 싱글톤 패턴을 사용했다고 봐도 될 것 같다. 막상 다시 정리를 해보니 이제껏 잘 모르고 사용해 왔다는 생각이 든다.
참조
'CS > 공통' 카테고리의 다른 글
VO vs DTO vs Entity (0) | 2022.08.01 |
---|---|
Web Server와 WAS(Web Application Server) (0) | 2022.03.18 |
객체지향설계의 5대 원칙 (0) | 2022.02.22 |
댓글