싱글톤 패턴의 사용 이유와 문제점

junhyeong·2023년 5월 26일
5
post-custom-banner

싱글톤(Singleton) 패턴이란?

싱글톤 패턴은 특정 클래스의 인스턴스를 1개만 생성되는 것을 보장하는 디자인 패턴이다. 즉, 생성자를 통해서 여러 번 호출이 되더라도 인스턴스를 새로 생성하지 않고 최초 호출 시에 만들어두었던 인스턴스를 재활용하는 패턴이다.

싱글톤 패턴을 사용하는 이유?

싱글톤 패턴을 사용함으로써 얻을 수 있는 이점 중 하나는 메모리 낭비를 방지할 수 있다.

사용자가 1초에 10번 똑같은 요청을 보내면 요청을 처리하기 위한 똑같은 객체를 1초에 10번 생성하고 소멸되는 메모리 낭비 문제가 발생하게 된다.
하지만 싱글톤 패턴을 사용하면 최초 한번 new로 객체를 생성하고 해당 객체를 이후에도 사용하도록 공유(static)하면 메모리 낭비 문제를 방지할 수 있다.

순수 Java코드로 Singleton 구현

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {
    }
    
    public static Singleton getInstance() {
        return instance;
    }

    public void singleton() {
        System.out.println("Singleton");
    }
}

우선 static영역에 instance 객체를 생성하고 이후 instance가 필요할 때 public static으로 선언된 getInstance() 메서드를 통해 최초에 만들어진 instance를 getInstance() 메서드가 호출될 때마다 항상 사용하도록 한다.

여기서 기본 생성자를 private로 선언하여 외부에서 new 키워드로 새로운 객체 생성을 못하게 막는게 중요하다.

해당 클래스를 테스트를 해보면 아래와 같이 동일한 객체 주소값이 출력되는것을 확인할 수 있다.

@Test
void singletonTest() {
    Singleton instance1 = Singleton.getInstance();
    Singleton instance2 = Singleton.getInstance();

    System.out.println("instance1 = " + instance1);
    System.out.println("instance2 = " + instance2);

    assertThat(instance1).isSameAs(instance2);
}

싱글톤 패턴의 문제점

하지만 이러한 싱글톤 패턴에도 많은 문제점이 존재한다.

1. 의존성이 높아진다.

싱글톤 패턴을 사용하는 경우 클래스의 객체를 미리 생성한 뒤에 필요한 경우 정적 메서드를 이용하기 대문에 클래스 사이에 의존성이 높아지게 된다는 문제점이 있다. (= 높은 결합)

싱글톤의 인스턴스가 변경 되면 해당 인스턴스를 참조하는 모든 클래스들을 수정해야 하는 문제가 발생한다.

2. private 생성자 때문에 상속이 어렵다.

싱글톤 패턴은 기본 생성자를 private로 만들었기 때문에 상속을 통한 자식 클래스를 만들 수 없다는 문제점이 있다. 즉, 자바의 객체지향 언어의 장점 중 하나인 다형성을 적용하지 못한다는 문제로 이어진다.

3. 테스트하기가 힘들다.

싱글톤 패턴의 인스턴스는 자원을 공유하고 있다는 특징이 있다. 이는 서로 독립적이어야 하는 단위 테스트를 하는데 문제가 된다.

독립적인 테스트가 진행이 되려면 전역에서 상태를 공유하고 있는 인스턴스의 상태를 매번 초기화해야 한다. 초기화해주지 않으면 전역에서 상태를 공유 중이기 때문에 테스트가 정상적으로 수행되지 못할 가능성이 존재한다.

이러한 문제점들 때문에 싱글톤 패턴은 안티패턴이라고 불리기도 한다.

그래서 싱글톤 패턴을 직접 구현하기 보다는 스프링의 도움을 받아 위와 같은 문제점을 보완하면서도 싱글톤 패턴의 장점을 누릴 수 있도록 이용하고 있다.

다음번에는 스프링이 어떻게 싱글톤 패턴의 문제점을 보완하고 장점을 누릴 수 있도록 하는지 알아보도록 하겠다.

출처

inflearn - 스프링 핵심 원리(기본 편)

profile
매일매일이 성장하는 하루가 될 수 있도록!
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 3월 20일

2번은 그냥 protected 하면 되는 거 아닌가요?

답글 달기