본문 바로가기
Java&Spring

[디자인패턴] 싱글톤 패턴

by JINJINC 2025. 1. 9.
728x90
반응형

싱글톤 패턴 (Singleton Pattern)


1. 싱글톤 패턴이란?

싱글톤 패턴은 클래스의 인스턴스를 단 하나만 생성하고, 어디서든 이 인스턴스에 접근할 수 있도록 하는 디자인 패턴입니다.
주로 다음과 같은 경우에 사용됩니다:

  • 전역적으로 하나의 객체만 존재해야 하는 경우
  • 객체 간의 공유 자원 관리가 필요한 경우

싱글톤 패턴의 구현 과정

1. 정적 변수를 선언

private static SingleTon instance;
  • 클래스 내에 유일한 인스턴스를 저장하기 위해 static으로 선언합니다.
  • 외부에서 직접 접근하지 못하도록 private 접근 제어자를 사용합니다.

2. 생성자를 private로 선언

private SingleTon() {}
  • private 생성자를 선언하여 외부에서 new 키워드를 통해 인스턴스를 생성하지 못하도록 제한합니다.

3. 인스턴스 반환 메서드 제공

public static synchronized SingleTon getInstance() {
    if (instance == null) {
        instance = new SingleTon();
    }
    return instance;
}

 

  • getInstance 메서드를 통해 인스턴스를 반환합니다.
  • instance가 없을 경우에만 초기화하여 **Lazy Initialization (지연 초기화)**를 수행합니다.
  • synchronized 키워드를 사용하여 멀티스레드 환경에서 안전하게 동작하도록 만듭니다.

 

싱글톤의 특징

  1. 인스턴스 유일성
    • 클래스의 인스턴스가 단 하나만 존재합니다.
    • 동일한 인스턴스를 전역적으로 접근 가능.
  2. Lazy Initialization
    • 필요할 때 인스턴스를 생성하여 메모리를 효율적으로 사용.
  3. Thread Safety
    • 멀티스레드 환경에서도 유일한 인스턴스를 보장하도록 구현.
  4. Global Access
    • getInstance 메서드를 통해 프로그램 어디서든 동일한 인스턴스에 접근 가능합니다.

싱글톤 패턴의 장점과 단점

장점

  1. 메모리 절약: 유일한 인스턴스를 재사용하므로 메모리 낭비를 줄일 수 있습니다.
  2. 전역 상태 관리: 하나의 객체를 통해 상태를 관리할 수 있습니다.
  3. 캡슐화 강화: 외부에서 직접 인스턴스를 생성하지 못하므로 캡슐화가 강화됩니다.

단점

  1. 테스트 어려움: 전역 상태로 인해 단위 테스트 작성이 어렵습니다.
  2. 결합도 증가: 싱글톤 객체에 의존하는 코드가 많아질 경우 결합도가 증가할 수 있습니다.
  3. 멀티스레드 성능 저하: synchronized 키워드로 인해 동시성이 낮아질 수 있습니다.

멀티스레드 환경에서의 싱글톤 문제와 해결

문제: 동시 접근 시 인스턴스 생성 중복 가능성

멀티스레드 환경에서는 두 개 이상의 스레드가 동시에 getInstance 메서드를 호출할 경우, 두 스레드 모두 if (instance == null) 조건을 만족하여 인스턴스가 여러 개 생성될 위험이 있습니다.

해결: Thread Safety 보장

  1. synchronized 메서드
    • getInstance 메서드에 synchronized를 사용하여 한 번에 하나의 스레드만 접근 가능하도록 설정.
    •  
public static synchronized SingleTon getInstance() {
    if (instance == null) {
        instance = new SingleTon();
    }
    return instance;
}

 

 

    • 장점: 간단하고 구현하기 쉽습니다.
    • 단점: 메서드 전체가 락을 걸기 때문에 성능 저하 가능.
  • Double-Checked Locking
    • synchronized를 최소화하기 위해 두 번의 체크를 수행합니다.
    •  
public static SingleTon getInstance() {
    if (instance == null) { 
        synchronized (SingleTon.class) {
            if (instance == null) {
                instance = new SingleTon();
            }
        }
    }
    return instance;
}

 

 

    • 장점: instance가 이미 생성된 경우 성능이 개선됩니다.
    • 단점: 구현 복잡성 증가.
  • 정적 초기화 (Eager Initialization)
    • 클래스 로딩 시점에 인스턴스를 생성합니다.
private static final SingleTon instance = new SingleTon();

public static SingleTon getInstance() {
    return instance;
}

 

 

    • 장점: 간단하며 멀티스레드 환경에서도 안전.
    • 단점: 초기화 시점에 메모리 사용.
  • Enum을 사용한 싱글톤
    • 자바의 Enum은 JVM에서 싱글톤을 보장하기 때문에 가장 안전하고 간단한 방식으로 평가받습니다.
public enum SingleTon {
    INSTANCE;

    public void someMethod() {
        // 메서드 구현
    }
}

 

    • 장점: 직렬화와 멀티스레드 안전성이 자동으로 보장됩니다.
    • 단점: Enum이 싱글톤을 표현하는 데는 지나치게 단순하다는 비판.

싱글톤의 활용 사례

  1. 데이터베이스 연결 관리
    • 하나의 연결 객체를 재사용하여 관리.
  2. 캐싱
    • 특정 데이터를 전역적으로 저장하고 활용.
  3. 로그 관리
    • 애플리케이션 전체에서 동일한 로그 객체 사용.
  4. 설정 관리
    • 전역 설정 값을 관리하는 객체.
728x90
반응형

댓글