싱글톤 패턴 알아보기

Bruce Han·2022년 4월 8일
1
post-thumbnail

싱글톤 패턴은 디자인 패턴인 생성 패턴의 종류 중 하나이다. 실제 서비스에 자주 적용될 만큼 장점이 확실한 개념이므로 Java 관점에서 이를 알아보고자 한다.

싱글톤 패턴 정의와 특징

어플리케이션이 실행될 때 클래스가 최초 한 번만 메모리를 할당하고(static) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 인스턴스가 필요하다면 미리 만들어 둔 기존의 인스턴스를 활용한다.
특징을 정리하자면 아래와 같다.

  • 프로그램 시작부터 종료까지 클래스에 의하여 메모리에 올려져 존재하는 단 하나의 객체만을 생성하고 이를 보장
  • 생성자로 한 번 호출한 이후 다시 그 생성자가 호출되면 이미 생성한 객체를 반환
  • 여러 스레드에서 동시에, 어디에서나 해당 인스턴스에 접근 가능
  • 이런 멀티 스레드 환경에서도 동작 가능하도록 구현되어야 하기 때문에 Thread-safe가 보장되어야 한다.

    Thread-safe란?

    멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻함

싱글톤 패턴 사용 예

싱글톤은 말 그대로 인스턴스가 한 개이다. 이 한 개만 사용하게 되는 예시를 들어보겠다.

싱글톤 패턴


사무실에서 스낵바 1개를 여러 사람이 사용하는 경우


요즘 회사의 사무실에는 스낵바가 1개씩 있다. 회사가 정말 큰 곳이 아닌 이상 스낵바를 굳이 여러 개 있을 필요는 없다. 스낵바 한 곳에 과자 여러개만 둬도 직원들이 같이 충분히 즐길 수 있기 때문이다. 스낵바를 두 개 둘 필요없이 딱 1개만 있으면 된다.

이를 정리하자면

  • 스낵바는 딱 1개만 존재한다.
  • 여러 사람이 1개의 스낵바로 같이 즐길(공유할) 수 있다.

프로그램 내에서는 어떻게 될까

위 스낵바 예시에 비추어 프로그램 내에서는 어떻게 될까.
프로그램 내에서 단 1개만 존재해야 하는 객체가 있으면, 이를 프로그램 내부의 여러 곳에서 호출하여 사용하게 된다.

예를들어 프로그램 내부에서 발생하는 이벤트들을 스케줄링하고 이를 처리하는 객체가 있다고 하자. 프로그램 내부의 모든 이벤트는 하나의 같은 스케줄링 에 들어가서 처리되어야 한다. 이벤트 발생 때마다 큐를 생성하게 되면 개발하려는 의도와는 다르게 된다.

싱글톤 패턴을 사용하면 얻는 이점

  • 메모리 낭비를 방지할 수 있다
    최초 한 번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에, 추후 해당 객체에 접근할 때 메모리를 절약할 수 있다.

  • 이미 생성된 객체를 활용해서 속도의 향상을 기대할 수 있다

  • 다른 클래스 간 데이터 공유가 쉽다
    싱글톤 객체는 전역으로 사용되기 때문에 다른 클래스의 객체들이 접근하여 사용할 수 있다.

그런 싱글톤 패턴에도 단점이 있다

  • 동시성(Concurrency) 문제가 발생할 수 있다
    여러 클래스의 객체가 싱글톤 객체의 데이터에 동시에 접근하면 데이터 공유가 쉽지만, 그에 따른 동시성 이슈가 발생할 수 있다. 이슈를 처리하지 않으면, 인스턴스가 2개 이상이 생성되는 경우가 발생할 수 있다.

  • 동시성 문제 때문에 테스트하기 어렵다
    싱글톤 객체는 자원을 공유하고 있기 때문에, 격리된 환경에서 테스트하려면 매번 객체의 상태를 초기화해야 한다. 그렇지 않으면 어플리케이션 전역에서 상태를 공유하느라 테스트가 온전하게 수행되지 못할 수 있다. 과학 실험에서 서로 같은 일정한 조건에서 실험하는 것을 생각하면 된다.

  • SOLID 원칙 중 DIP와 OCP원칙에 위배될 수 있다.
    new키워드를 직접 사용하여 클래스 안에서 객체를 직접 생성하는데, 이는 의존 관계상 클라이언트가 구체 클래스에 의존하게 된다. 많은 데이터를 공유하게 되면 결합도가 높아지게 된다. 이는 내부 상태를 변경하기 어렵게 만들어 유지보수를 더 힘들게 할 수 있다.

  • 자식 클래스를 만들 수 없다

그래서 싱글톤 패턴은 쓸 일이 있을 때 써야 한다

싱글톤 패턴은 오직 한 개의 인스턴스 생성을 보증하여 그에 따흔 효율을 볼 수 있지만, 그만큼의 위험성도 있다. 양날의 검인 셈이다.
하지만, 스프링 컨테이너같은 프레임워크의 도움을 받으면 싱글톤 패턴의 단점을 보완하면서 장점까지 누릴 수 있다. 예를 들어, 스프링에서의 빈은 컨테이너의 도움을 받아 싱글톤 스코프로 관리되고 있다.
그래도 프레임워크의 도움 없이 패턴을 적용하고 싶다면, trade-off를 잘 고려해서 사용하는 것이 좋을 것이다.

References

profile
만 가지 발차기를 한 번씩 연습하는 사람은 두렵지 않다. 내가 두려워 하는 사람은 한 가지 발차기를 만 번씩 연습하는 사람이다. - Bruce Lee

0개의 댓글