싱글톤 패턴

zioo·2022년 1월 24일
0

Backend

목록 보기
23/40

싱글톤 패턴이란 ?

싱글톤(Singleton) 패턴의 정의는 단순하다. 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.

  • 어플리케이션이 시작될 때 어떤 클래스가 최초에 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴이다.
  • 인스턴스가 필요할 때 똑같은 인스턴스를 만들지 않고 기존의 인스턴스를 활용하는 것이다.
  • 생성자가 여러번 호출되어도 실제 객체는 하나이며 최초 생성된 객체를 계속 반환한다.java에서는 생성자를 private으로 선언해 다른 곳에서 생성하지 못하도록 만들고, getInstance() 메소드를 통해 받아서 사용하도록 구현한다
  • 공통된 객체를 여러개 생성해서 사용해야하는 상황에 쓰인다.

싱글턴 패턴

전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴

  • '생성(Creational) 패턴’의 하나

역할이 수행하는 작업

  • Singleton
    하나의 인스턴스만을 생성하는 책임이 있으며 getInstance 메서드를 통해 모든 클라이언트에게 동일한 인스턴스를 반환하는 작업을 수행한다.

장점

  • 객체를 한 번만 생성하고 반환하기 때문에 메모리 영역을 한 번만 할당받으면된다.> 메모리 낭비를 방지할 수 있다.
  • 싱글톤으로 구현한 인스턴스는 '전역'이므로 다른 클래스의 인스턴스들이 데이터를 공유하는 것이 가능하다.
  • 인스턴스가 절대적으로 한개만 존재하는 것을 보증하기에 개발 시 실수를 줄일 수 있다
  • 싱글톤 객체를 사용하지 않는 경우 인스턴스를 생성하지 않는다.
  • 싱글톤을 상속시킬 수 있다.

가장 먼저 떠올릴 수 있는 이점은 아무래도 메모리 측면일 것이다. 최초 한번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다. 뿐만 아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다고 볼 수 있다.

또다른 이점은 다른 클래스 간에 데이터 공유가 쉽다는 것이다. 싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다. 하지만 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있으니 이점을 유의해서 설계하는 것이 좋다.

이 외에도 도메인 관점에서 인스턴스가 한 개만 존재하는 것을 보증하고 싶은 경우 싱글톤 패턴을 사용하기도 한다.

단점

  • 전역변수보다 사용하기가 불편하다
  • 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나 공유시키면 다른 클래스와 결합도가 높아지게된다.> 유지보수가 힘들고 테스트가 원활하게 진행되지 않는다.
  • 멀티 스레드 환경에서 동기화 처리를 하지 않으면 인스턴스가 2개 생성된다.
  • 객체의 파괴 시점을 컨트롤하기 어려울 수 있다.
  • 반드시 싱글톤이 필요한 상황이 아니면 지양하는 것이 좋다고 한다.( 잘 사용한다면 문제없음 ! )

먼저 싱글톤 패턴을 구현하는 코드 자체가 많이 필요하다. 앞서 소개한 구현 방법외에도 정적 팩토리 메서드에서 객체 생성을 확인하고 생성자를 호출하는 경우에 멀티스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해 syncronized 키워드를 사용해야 한다.

두 번째는 테스트하기 어렵다는 것이다. 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화시켜주어야 한다. 그렇지 않으면 어플리케이션 전역에서 상태를 공유하기 때문에 테스트가 온전하게 수행되지 못한다.

세 번째로는 의존 관계상 클라이언트가 구체 클래스에 의존하게 된다. new 키워드를 직접 사용하여 클래스 안에서 객체를 생성하고 있으므로, 이는 SOLID 원칙 중 DIP를 위반하게 되고 OCP 원칙 또한 위반할 가능성이 높다.

이외에도 자식클래스를 만들수 없다는 점과, 내부 상태를 변경하기 어렵다는 점 등 여러가지 문제들이 존재한다. 결과적으로 이러한 문제들을 안고있는 싱글톤 패턴은 유연성이 많이 떨어지는 패턴이라고 할 수 있다.

싱글톤 패턴

var obj = {
    myprop : "my value"
}
var obj2 = {
    myprop : "my value"
}

obj === obj2  // false
obj == obj2   // false
  • 특정 클래스의 객체를 고유한 객체로 유지
  • 리터럴 객체 = 싱글톤

0개의 댓글