싱글톤(Singleton) 패턴

김범진·2022년 5월 1일
4

Design Patterns

목록 보기
1/1
post-thumbnail

싱글톤(Singleton)이란?

OOP에서 싱글톤은 해당 객체가 단 하나임을 보장한다는 의미를 가진다. 싱글톤 패턴은 이러한 싱글톤을 보장하는 패턴이다.

다시 말해, 어플리케이션이 시작될 때 어떤 클래스가 한 번만 메모리에 할당되고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다.

왜 사용해야 하는가

기본적인 연산, 객체가 생성되는 힙 영역의 메모리, 그리고 소요되는 시간까지 객체를 생성하는 것은 비용이 드는 행위이다.

하지만 어플리케이션을 구성하는데 있어서 객체가 단 하나만 존재해도 되는 경우는 꽤 많으며 객체가 싱글톤임을 보장한다면 위에서 말한 많은 비용을 줄일 수 있게 된다.

또한 싱글턴 객체는 전역에서 접근가능한(global) 객체이므로, 해당 객체에 상태(field)가 존재하면 이를 공유하기 매우 편해진다.

구현을 해보자

Java 코드를 통해 싱글톤 패턴을 구현하는 방법은 여러 가지가 존재한다.
그 중 가장 추천하는 방법 2가지를 소개하고자 한다.

static inner class 활용

static inner class를 활용한 방법은 해당 클래스를 호출하는 시점에서 로딩이 일어나고(지연 로딩) 그때 내부 인스턴스가 static으로 초기화되기 때문에, 지연 초기화 싱글톤을 구현할 수 있다. inner class를 참조하여 호출하는 코드가 존재하지 않기 때문에 해당 클래스 로딩시 클래스를 초기화하지 않는다.

싱글톤 객체 생성과정에서 별도의 동기화 처리를 하지 않아도 클래스 로딩되는 과정 자체가 JVM에서 동기화 환경을 제공하기 때문에 멀티 스레드 환경에서도 안전한 것이다. 그렇기 때문에 sychronized 키워드를 사용하지 않아도 thread-safe를 보장하는 아주 좋은 방법이라고 할 수 있다.

이걸 깨뜨린다고?

리플렉션(Reflection) 사용

자바 Reflection API를 사용하면 prviate으로 선언된 생성자 또는 필드에 자유롭게 접근이 가능하기 때문에 이를 통해 캡슐화된 객체에 접근하여 생성자를 강제로 호출시킬 수 있다. 생성자를 강제로 호출하면 새로운 인스턴스가 생성되기 때문에 싱글톤 패턴을 깨뜨릴 수 있게 된다.

직렬화(Serializable) & 역직렬화 사용

싱글톤 클래스에 직렬화 기능을 추가하기 위해 'implements Serializable'만 추가하면 역직렬화될 때마다 새로운 인스턴스가 생기게 된다.
싱글톤 특성을 유지하면서 직렬화 기능을 추가하기 위해서는 모든 필드를 transient로 선언하고 readResolve 메서드를 추가해야 한다.

Enum 활용

Enum은 자바 언어 차원에서 해당 객체가 단 하나임을 보장하기 때문에, Enum을 통해 싱글톤 객체를 구현하면 Reflection을 통한 생성자 접근이나, 직렬화시 객체 재생성을 원천적으로 차단할 수 있다.

하지만 Enum의 용도를 고려해보면 Enum을 통해 싱글톤 클래스를 구현하는 것이 옳은지에 대해서는 고민해볼 필요가 있다.

싱글톤 패턴을 활용해야 할 경우가 생긴다면, 팀원들과 합의를 통해 위 2가지 방법 중 선택하여 사용하면 좋을 것 같다.

실제 구현 코드는 이 곳에서 볼 수 있다.

단점도 존재한다?

  1. OCP 원칙을 위반한다.
    • 객체지향 원칙 중 하나인 OCP(Open-Closed Principal) 원칙은 확장에는 열려있지만, 변경에는 폐쇄적인 원칙이다.
    • 많은 데이터를 공유할 경우 다른 클래스의 인스턴스들 간의 결합도가 높아지기 때문이다.
  2. 동시성 문제가 발생한다.
    • 멀티쓰레드 환경에서 동기화 처리를 안하게 되면 인스턴스 2개가 생성될 수 있는 가능성이 생긴다.
    • 물론, 이 문제는 동기화 처리를 잘 해준다면 해결된다.

꼭 필요한 환경이 아니라면 사용을 지양하는 것이 좋다.

실제 사용되는 예

  • Spring에서 IoC 컨테이너의 Bean 스코프 중에 하나인 싱글톤 스코프
  • java.lang.Runtime
  • 다른 디자인 패턴(빌더, 퍼사드, 추상 팩터리 등) 구현체의 일부

결론

디자인 패턴 중 가장 널리 알려져 있는 싱글톤 패턴에 대해서 알아보았다. 평소에 싱글톤 패턴에 대해 객체를 하나만 생성한다는 정도만 알고 있었지만, 직접 여러 가지 방법으로 구현해보면서 각 방법의 장, 단점에 대해 알게되었다.

싱글톤 패턴은 장점이 많이 있지만 단점 또한 존재하므로 적절한 상황에 알맞게 사용하는 것이 좋겠다고 생각한다.

사용하는 방법보다 필요한 이유에 대해서 이해해보자!

출처
백기선님의 코딩으로 학습하는 GoF 디자인 패턴

profile
새로운 도전은 즐겁고 책임은 무겁다

0개의 댓글