싱글톤 패턴(singleton pattern)
프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
전역변수를 사용하지 않고 객체를 하나만 생성하도록 하고, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴이다. 하나의 인스턴스만을 생성하여 클래스 내부에 private static으로 지정해 두고 getInstance 메서드로 모든 클라이언트에게 동일한 인스턴스를 반환한다.
- 어떠한 클래스가 유일하게 1개만 존재해야 할 때 사용한다.
- 하나의 자원을 서로 공유해야 할 때 주로 사용한다.
싱글톤 패턴을 사용하는 이유
- 객체를 생성할 때마다 메모리 영역을 할당받지 않기 때문에, 메모리낭비를 방지할 수 있다.
- 싱글톤으로 구현한 인스턴스는 '전역' 이므로, 다른 클래스의 인스턴스들이 데이터를 공유하는 것이 가능하다.
싱글톤 패턴의 문제점
- 의존 관계상 클라이언트가 구체 클래스에 의존한다.
- private 생성자 때문에 테스트가 어렵다.
- 객체 인스턴스를 하나만 생성해서 공유하는 방식 때문에 싱글톤 객체를 stateful 하게 설계했을 경우에
큰 장애 발생 요인이 될 수 있다.
싱글톤의 문제 해결 - statelsess
싱글톤의 단점을 해결하기 위해 무상태(stateless)로 설계해야 한다.
- 특정 클라이언트에 의존적인 필드가 있으면 안 된다.
- 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안 된다.
- 가급적 읽기 전용으로 만들고, 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용한다.
스프링 싱글톤 컨테이너
스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도 싱글톤 패턴의 문제점들을 해결하며,
객체인스턴스를 싱글톤으로 관리해 준다.
스프링 Bean으로 등록한 클래스들은 따로 싱글톤 관련 코드를 작성하지 않아도 싱글톤 패턴으로 관리된다.
위에서 언급한 문제점들인 DIP, OCP, 테스트, private 생성자로부터 자유롭게 싱글톤을 사용할 수 있도록 도와준다.
example) 싱글톤 패턴으로 클래스 만들기
1. 해당 클래스 객체를 private static으로 미리 생성해 둔다.
2. 생성자는 private으로 지정해서 외부에서 호출하는 것을 막아둔다.
3. 해당 객체(인스턴스)를 사용할 때는 getInstance() 메서드를 이용해서 불러온다.
4. getInstance() 메서드에서는 1번에서 미리 생성해 둔 객체를 반환한다.
해당 클래스의 객체는 직접 생성하거나 직접 불러올 수 없게 되고, 항상 SingletonClazz.getInstance() 메서드를 이용한다.
public class Singleton {
private static Singleton instance = new Singleton();
//생성자는 private로 지정 ( 외부에서 호출되는것을 막아줌 )
private Company() {}
//static 메소드로 getInstance()를 만든다.
public static Singleton getInstance() {
if(instance==null) {
instance = new Singleton();
}
return instance;
}
}
public class Test {
public static void main(String[] args) {
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
System.out.println(obj1);
System.out.println(obj2);
//obj1과 obj2의 주소가 같다.
}
}
main에서 객체를 두 개 생성했지만 두 개의 객체의 주소가 같은 것을 확인할 수 있다.
'컴퓨터 공학 > 프로그래밍 이론' 카테고리의 다른 글
[Spring / 스프링 부트 핵심 가이드] 디자인 패턴 정리 (0) | 2023.10.01 |
---|---|
[ComputerScience / 디자인 패턴] 브릿지 패턴(Bridge Pattern, 가교 패턴) (0) | 2023.10.01 |
[Spring / 스프링 부트 핵심 가이드] 레이어드 아키텍처, SpringMVC (0) | 2023.10.01 |
[Spring / 스프링 부트 핵심 가이드] 제어의 역전(IoC, DI, AOP) (0) | 2023.09.30 |
[프로그래밍 이론] 객체지향 4대 특성(캡슐화, 상속, 다형성, 추상화), 5 원칙(SOLID) (0) | 2023.04.20 |