• 싱글톤 패턴은 안티 패턴인가? :: 마이구미
    디자인 패턴 2017. 12. 6. 21:18
    반응형

    이 글은 싱글톤 패턴(Singleton Pattern) 에 대해 다룬다.

    디자인 패턴 중 가장 기본적이고 쉬운 패턴이다.

    싱글톤 패턴에 대한 편중된 글이 아닌 전체적인 모습을 다뤄본다.

    위키 - https://en.wikipedia.org/wiki/Singleton_pattern


    제목과 같이 "싱글톤 패턴에 대한 우려"에 대한 글이다.

    본인의 경우에는 "싱글톤 패턴은 사용하지 않는 것이 좋다" 에 대한 입장이다.

    먼저 무엇인지부터 천천히 보면서 근거들을 확인해보자.


    싱글톤(Singleton) 패턴은 무엇인가?


    싱글톤 패턴은 한번쯤은 사용해봤거나 현재도 사용하고 있을 것이다.

    실제 프로젝트에서도 사용하는 정도로 많이 알려진 패턴이다.


    클래스의 객체를 하나로 제한한다.

    즉, 생성자를 여러번 호출한다하더라도 최초로 생성된 객체을 반환하여 사용한다.


    클래스 다이어그램과 코드를 보면 쉽게 이해할 수 있다.


    싱글톤


    public final class Singleton {
        private static final Singleton INSTANCE = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return INSTANCE;
        }
    }


    생성된 객체를 getInstance 메소드를 통해 가져와 사용한다.

    그로 인한 결과는 다음과 같다.


    1. 오직 하나의 객체만을 보장한다.
    2. 전역 객체로써, 어디서든 접근이 가능하다.


    싱글톤 패턴은 어디에서 사용하는가? 


    DB 커넥션을 예로 들어보자. (실제로 사용하지만 정답은 아니다)

    DB 요청에 따라 DB 커넥션 인스턴스가 생성된다.

    10개의 요청이 오면 10개의 인스턴스를 만드는 꼴이 된다.

    결국 나중에는 관련 에러 이슈가 발생한다.

    이러한 경우 싱글톤을 통해 구현한다면, 무분별한 객체 생성을 막을 수 있게 된다.


    사실 위와 같은 경우는 실제로 싱글톤을 통해 많이 처리되고 있다.

    싱글톤의 대안으로는 DB 커넥션 풀을 사용하는 것이다.


    싱글톤 패턴은 안티 패턴인가?


    보는 사람마다 다르겠지만, 본인의 견해는 싱글톤 패턴은 안티 패턴이다.

    안티 패턴이란 실제로 많이 사용하지만 비효율적인 코드를 뜻한다.

    싱글톤 패턴에 대해 좋게 보지 않는 이유들은 다음과 같다.


    • 전역이다. (상태를 확인하기 힘들어 테스트 및 디버깅 어려움)
    • 싱글톤 코드로 인해 단단한 결합이 형성된다.
    • 코드가 복잡해질 수 있다. 즉, 디자인의 흐름이 깨진다.

    이외에도 관련 이유들이 존재한다.

    싱글톤 패턴은 모든 곳에서 사용하지 말아야하는가?


    그렇지는 않다.

    실제 어플리케이션 구현 코드 - No

    Logging, reports, utilities 등 - Yes


    결론적으로는 실제 시스템에 영향이 있는 코드에서는 싱글톤 패턴 사용을 신중히 고민해야한다.


    싱글톤에 대한 좋은 문장이 있어 가져와본다.

    => 싱글톤을 없애는 것은 까다로울 수 있지만 가치있는 노력이다.



    반응형

    댓글

Designed by Tistory.