백엔드

디자인 패턴 : 싱글톤 패턴(Singleton Pattern)

Newbie Developer 2025. 5. 8. 22:28

 

소프트웨어를 설계할 하나의 인스턴스만 존재해야 하는 객체필요할 때가 있습니다. 예를 들어 설정값을 저장하는 Config 객체, 로그 시스템, 데이터베이스 연결 등은 여러 개의 인스턴스를 만들기보다 전역에서 하나만 존재해야 효율적입니다.

이런 요구를 만족시키기 위해 사용되는 디자인 패턴이 바로 싱글톤 패턴(Singleton Pattern) 입니다.


🔍 싱글톤 패턴이란?

싱글톤 패턴클래스의 인스턴스를 오직 하나만 생성하고, 어디서든 인스턴스에 접근할 있는 전역적인 접근 지점을 제공하는 생성 패턴입니다.

쉽게 말해, 프로그램 전체에서 하나만 존재해야 하는 객체를 보장하는 패턴입니다.


📦 언제 사용하나요?

  • 설정 정보(Config)환경값을 어디서나 접근해야
  • 로깅 시스템, 캐시, 데이터베이스 커넥션 풀처럼 공유 자원하나로 통제해야
  • 전역 상태유지해야 하는 객체가 필요할

🔧 Java 싱글톤 패턴 예제

public class Singleton {
    private static Singleton instance;

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

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

문제점: 멀티스레드 환경에서는 instance여러 생성될 있음


🛡 Thread-Safe 싱글톤 (Double-Checked Locking)

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

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

🧼 깔끔한 방법: 정적 내부 클래스 방식

public class Singleton {
    private Singleton() {}

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

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

 

  • JVM 클래스 로딩 시점의 특성이용해 lazy loading + thread-safe 구현 가능
  • 성능도 좋고 코드도 깔끔해서 많이 쓰입니다

🚫 싱글톤의 단점

  • 테스트하기 어려움: 전역 상태로 인해 테스트 의존성이 생김
  • 유연성 부족: 의존성 주입(DI)사용한 구조와 충돌할 있음
  • 숨겨진 의존성: 코드에서 의존 관계가 명확하게 드러나지 않음

🔁 싱글톤 vs 전역 변수

항목 싱글톤 패턴 전역 변수
인스턴스 통제 하나로 통제 여러 가능
객체 캡슐화 객체 중심 데이터 노출
테스트 용이성 어려움 어려움
설계 철학 객체지향적 절차적

마무리

싱글톤 패턴은 강력한 도구이지만, 잘못 사용하면 코드의 결합도(coupling)높이고 테스트를 어렵게 만들 있습니다.

의존성 주입 프레임워크(Spring 등)사용하는 경우에는 빈(bean) 스코프를 싱글톤으로 설정하여 대체하는 것이 현대적인 방식입니다.