Pink Spider/Singleton Pattern

Created Mon, 26 May 2025 20:20:45 +0900 Modified Mon, 08 Dec 2025 08:41:47 +0900
655 Words 3 min

자바(Java)에서 **싱글톤 패턴(Singleton Pattern)**은 특정 클래스의 인스턴스를 하나만 생성하고, 전체 애플리케이션에서 공유할 수 있도록 보장하는 디자인 패턴입니다. 주로 공통된 설정, 로깅, 스레드 풀, 캐시, DB 연결 관리 등에 사용됩니다.


✅ 싱글톤 패턴의 핵심 개념

  • 클래스의 인스턴스를 하나만 생성.
  • 전역 접근점(Global Access Point) 제공.
  • 생성자를 private으로 숨김.
  • 정적 메서드로 인스턴스를 반환.

📦 싱글톤 패턴 구현 예제

1. 기본 싱글톤 (Lazy Initialization)

public class Singleton {
    private static Singleton instance;

    // 생성자를 private으로 설정하여 외부에서 new로 인스턴스 생성하지 못하도록 함
    private Singleton() {}

    // 인스턴스를 필요할 때 생성
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public void showMessage() {
        System.out.println("Hello from Singleton!");
    }
}

사용 예시:

public class Main {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        singleton.showMessage();
    }
}

2. 스레드 안전한 싱글톤 (Thread-safe)

public class ThreadSafeSingleton {
    private static ThreadSafeSingleton instance;

    private ThreadSafeSingleton() {}

    // synchronized로 동기화
    public static synchronized ThreadSafeSingleton getInstance() {
        if (instance == null) {
            instance = new ThreadSafeSingleton();
        }
        return instance;
    }
}

3. 이중 체크 잠금(Double-Checked Locking)

public class DoubleCheckedLockingSingleton {
    private static volatile DoubleCheckedLockingSingleton instance;

    private DoubleCheckedLockingSingleton() {}

    public static DoubleCheckedLockingSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckedLockingSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckedLockingSingleton();
                }
            }
        }
        return instance;
    }
}

4. 정적 내부 클래스 방식 (가장 권장)

public class StaticInnerClassSingleton {
    private StaticInnerClassSingleton() {}

    private static class Holder {
        private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
    }

    public static StaticInnerClassSingleton getInstance() {
        return Holder.INSTANCE;
    }
}
  • JVM이 클래스 로딩 시점에 한 번만 초기화하므로 스레드 안전하고 성능도 우수합니다.

⚠️ 주의사항

  • 테스트 시 단위 테스트 격리에 어려움이 생길 수 있음.
  • 멀티스레드 환경에서는 스레드 안정성 확보 필요.
  • 필요 이상의 전역 상태 사용을 유도할 수 있어 남용은 금물.

🤖 자주 사용하는 예

  • Spring Framework의 @Component, @Service, @Repository Bean 들은 기본적으로 싱글톤 스코프입니다.
  • DB Connection Pool, Configuration Manager 등에 자주 사용됩니다.