본문 바로가기

🧑🏻‍💻 Dev/Java

[디자인 패턴] 싱글톤 패턴

싱글톤 패턴은 디자인 패턴 중에서 가장 자주 사용되는 패턴이기도 하면서 가장 많은 비판을 받는 패턴이다. 이런 싱글톤 패턴은 매우 조심해서 사용해야 하거나 피해야 할 패턴이라고 말하기도 한다.

 

스프링 공부를 하면서 싱글톤이라는 패턴 용어를 보게 되었고, 정리해보자는 생각에 작성하게 됩니다.

 

싱글톤 패턴이란 무엇인가?

객체의 인스턴스가 오직 하나만 존재하도록 강제하는 패턴을 말한다. 이렇게 하나만 만들어지는 클래스의 오브젝트는 애플리케이션 내에서 전역적으로 접근이 가능하다. 단일 오브젝트만 존재해야 하고, 이를 애플리케이션의 여러 곳에서 공유하는 경우에 주로 사용하는 패턴이다.

 

 

자바 코드로 확인

자바에서는 싱글톤패턴을 구현하는 방법은 다음과 같다.

 

  1. 클래스 밖에서는 오브젝트를 생성하지 못하도록 생성자를 private로 만든다.
  2. 생성된 싱글톤 오브젝트를 저장할 수 있는 자신과 같은 타입의 스태틱 필드를 정의한다.
  3. 스태픽 팩토리 메서드인 getInstance()를 만들고 이 메서드가 최초로 호출되는 시점에서 한 번만 오브젝트가 만들어지게 만든다. 생성된 오브젝트는 스태틱 필드에 저장된다. 또는 스태틱 필드의 초기값으로 오브젝트를 미리 만들어둘 수도 있다.
  4. 한번 오브젝트가 만들어지고 난 후에는 getInstance() 메서드를 통해 이미 만들어져 있는 스태틱 필드에 저장해둔 오브젝트를 넘겨준다.
public class Singleton {
    public static Singleton instance = new Singleton();
    
    private Singleton() { }; // 외부에서 객체를 생성하지 못하도록 설정
    
    public static Singleton getInstance() {
    	return instance;
    }
}

Singleton이라는 클래스는 오직 하나의 instance만을 갖도록 만든다. 생성자는 외부에서 객체를 생성하지 못하도록 private로 설정한다. 만들어진 인스턴스를 가져오고 싶다면 getInstance() 메서드를 사용하여 오직 하나의 instance만을 사용할 수 있도록 한다.

 

 

싱글톤 패턴의 특징

싱글톤 패턴은 오직 한 번의 new 연산자를 사용하기 때문에 메모리 측면에서 이점을 가져올 수 있다. 그리고 이미 만들어져 있는 인스턴스를 사용하기 때문에 속도 차원에서도 이득을 얻을 수 있다.

 

그리고 인스턴스가 오직 하나만 있기 때문에 전역적으로 해당 인스턴스에 접근을 할 수 있어 데이터를 공유하기 쉽다는 것이다. 하지만 데이터 공유에 대한 이점도 있지만 만약 동시에 여러 곳에서 해당 인스턴스에 접근하여 사용하게 되었을 때, 동시성 문제가 발생할 수 있다는 단점이 있다.

 

자원을 공유하기 때문에 발생하는 문제는 테스트하기 어렵다는 것이다. 완벽히 격리된 상태에서 테스트하기 위해서는 매번 인스턴스를 초기화해주는 작업을 진행해야 한다. 그렇지 않으면 해당 인스턴스가 전역적으로 사용되기 때문에 원활한 테스트를 진행할 수 없다.

 

이외에도 내부 상태를 변경하기 힘들고, 자식 클래스를 만들 수 없다는 문제점이 존재한다. 자식 클래스를 만들 수 없다는 것은 확장에 닫혀있다는 것을 의미하고, 객체지향 SOLID 원칙 중에서 OCP에 위배된다는 것을 의미한다. 즉, 싱글톤 패턴의 클래스는 유연성이 많이 떨어지는 문제점이 존재한다.

 

하지만 스프링 프레임워크의 도움을 받게되면 싱글톤 패턴의 문제점을 보완하면서 장점의 혜택을 누릴 수 있다. 

 

reference

싱글톤(Singleton) 패턴이란?

토비의 스프링