공부/디자인 패턴

[공부/디자인 패턴] Singleton 패턴

오잎 클로버 2022. 3. 19. 08:20
728x90

Singleton Pattern

인스턴스를 하나만 생성하는 패턴으로 메모리 측면에서 낭비를 방지하고, 이미 생성된 인스턴스를 활용하기에

속도 측면에서 이점이 있습니다. 또, 데이터 공유가 쉽습니다. 

물론, 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근할 경우, 동시성 문제가 발생할 수 있습니다.

Singleton Pattern Structure

public class Singleton {

    public static Singleton instance = new Singleton();

    private Singleton() {
        // 외부 생성자 차단
    }

    public static Singleton getInstance() {
        return instance;
    }

    public void say() {
        System.out.println("Hello, World!");
    }

}

Singleton Pattern 단점

1. 동시성 문제가 발생하게 됩니다.

단 하나의 인스턴스를 구현하기에 동시에 사용할 수 없기에 synchronized 키워드를 사용하여 동기화하여 순차적으로 사용할 수 있지만, 그에 따라 속도가 느려진다는 문제점이 새롭게 제기될 수 있습니다.

2. 테스트가 어렵다.

 자원을 공유하고 있기에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화시켜야 온전하게 수행됩니다.

3. SOLID 원칙 중 DIP 및 OCP 원칙 위반 가능성

 의존 관계상 클라이언트가 구체 클래스에 의존하게 되기에 new 키워드를 직접 사용하여 클래스 안에서 객체를 생성하고 있기에 SOLID 원칙 중 DIP(의존성 역전 원칙)과 OCP(개방-폐쇄 원칙)을 위반할 수 있습니다.

 

결론

Singleton 패턴은 안티 패턴이라는 말이 있을 정도로 문제점들이 많이 발생할 수 있습니다.

하지만 Spring 컨테이너(container)와 같은 프레임워크를 사용하게 된다면 많은 문제점들을 예방 및 해결할 수 있게 됩니다. 

 

 

이상입니다.

'공부 > 디자인 패턴' 카테고리의 다른 글

[공부/디자인 패턴] Prototype 패턴  (0) 2022.03.20
[공부/디자인 패턴] Strategy 패턴  (0) 2022.03.16