Development/Java

싱글톤 패턴(Singleton Pattern) 완벽 이해와 구현 방법 – 실무 적용까지

최라온 2025. 5. 26. 12:58
728x90
반응형
SMALL

싱글톤 패턴(Singleton Pattern) 완벽 이해와 구현 방법 – 실무 적용까지

싱글톤 패턴(Singleton Pattern)은 하나의 클래스에 대해 단 하나의 인스턴스만 존재하도록 보장하는 디자인 패턴입니다. 전역에서 동일한 객체를 공유해야 할 때 자주 사용되며, 메모리 절약동기화 제어에 유리합니다. 이 글에서는 싱글톤의 개념, 구현 방식, Thread-safe 버전, 그리고 Spring에서의 활용까지 실무 중심으로 설명합니다.

1. 싱글톤 패턴이란?

싱글톤은 인스턴스를 하나만 생성하도록 보장하고, 이 인스턴스에 글로벌 접근을 제공하는 패턴입니다. 자원 관리를 위해 공통적으로 사용되는 객체 (예: 설정, 로그, 캐시) 등에 자주 적용됩니다.

2. 기본 싱글톤 구현 예제

public class Singleton {

    private static final Singleton instance = new Singleton();

    private Singleton() {
        // 생성자 private → 외부에서 생성 금지
    }

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

사용법

Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();

System.out.println(s1 == s2); // true

→ 두 객체는 동일한 인스턴스입니다.

3. Lazy Initialization (지연 초기화)

객체가 실제 사용될 때 생성하는 방식으로, 메모리 절약에 유리합니다. 단, 멀티스레드 환경에서는 동기화 이슈가 존재합니다.

public class LazySingleton {

    private static LazySingleton instance;

    private LazySingleton() {}

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

4. Thread-safe 싱글톤 (Double-Checked Locking)

멀티스레드 환경에서 안전하게 Singleton을 구현하기 위해 사용하는 방식입니다.

public class ThreadSafeSingleton {

    private static volatile ThreadSafeSingleton instance;

    private ThreadSafeSingleton() {}

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

5. enum을 이용한 싱글톤 (가장 안전한 방법)

Java의 enum은 직렬화, 리플렉션, 멀티스레드 이슈를 모두 해결합니다. 따라서 가장 간단하면서도 안전한 싱글톤 구현 방식으로 권장됩니다.

public enum EnumSingleton {
    INSTANCE;

    public void doSomething() {
        System.out.println("Doing something...");
    }
}

사용

EnumSingleton.INSTANCE.doSomething();

6. Spring에서의 싱글톤

Spring은 기본적으로 Bean 객체를 싱글톤 스코프로 관리합니다.
즉, @Service, @Repository, @Component 등은 기본적으로 싱글톤으로 동작합니다.

예:

@Service
public class UserService {
    ...
}

위 클래스는 애플리케이션 전역에서 하나의 인스턴스로 관리되며, DI 컨테이너에서 필요 시 자동 주입됩니다.

7. 실무 적용 팁

  • 단일 설정, 캐시, 공용 계산기 등 공유가 필요한 객체에 적합
  • 동기화 이슈에 주의 – 쓰레드 환경이면 volatile + synchronized 고려
  • Spring에서는 직접 싱글톤 구현 없이 Bean으로 대체 가능
  • enum 방식은 강력하게 권장됨 (JDK 1.5+)

8. 결론

싱글톤 패턴은 객체 생성을 제어하여 메모리를 절약하고, 전역에서 동일한 인스턴스를 공유하고자 할 때 유용한 패턴입니다. 상황에 따라 기본, lazy, thread-safe, enum 방식 중 하나를 선택해야 하며, Spring을 사용하는 경우에는 Bean 스코프로 대체하는 것이 일반적입니다.

728x90
반응형
LIST