CS 공부

# 싱글톤 패턴

박태정 입니다. 2025. 2. 17. 17:50
반응형

싱글톤 패턴 🏆

자바 스프링 공부와 디자인 패턴을 공부하면서 자주 마주치는 개념이 있다. 바로 싱글톤 패턴 이다.

🎯 싱글톤 패턴이란?

싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다.
보통 클래스는 new 키워드를 통해 여러 개의 개별적인 인스턴스를 만들 수 있다. 하지만 싱글톤 패턴을 적용하면, 클래스에서 단 하나의 인스턴스만 생성되도록 강제할 수 있다.

이게 어디에 많이 쓰이냐면, 데이터베이스 연결 모듈 같은 데서 많이 사용된다고 한다.
예를 들어, 데이터베이스에 연결할 때마다 새로운 커넥션을 생성하는 것보다, 하나의 연결을 유지하면서 여러 곳에서 공유하는 게 더 효율적이다.


❓ "정말 같은 인스턴스일까?"

한번 예제를 보자.

class Singleton {
    private static Singleton instance;

    private Singleton() {} // private 생성자로 외부에서 직접 생성 방지

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

위처럼 getInstance()를 호출할 때마다 같은 인스턴스를 반환한다.
만약 싱글톤 패턴을 사용하지 않는다면?

class NonSingleton {}

NonSingleton a = new NonSingleton();
NonSingleton b = new NonSingleton();

System.out.println(a == b); // false (서로 다른 인스턴스)

하지만 싱글톤 패턴을 적용하면?

Singleton a = Singleton.getInstance();
Singleton b = Singleton.getInstance();

System.out.println(a == b); // true (같은 인스턴스)

이렇게 하면 정말 같은 인스턴스가 반환된다.


💡 싱글톤 패턴의 장점

"왜 굳이 이렇게 하나의 인스턴스를 공유해야 할까?"
그 이유는 바로 비용 절감 때문이다!

예를 들어, I/O 바운드 작업(데이터베이스, 네트워크, 파일 시스템 접근 등)은 상대적으로 실행 속도가 느리다.
데이터베이스 커넥션을 매번 새로 생성하면 성능 저하와 리소스 낭비가 발생할 수 있다.
싱글톤 패턴을 사용하면, 이미 생성된 인스턴스를 재사용하여 이런 문제를 해결할 수 있다.

예를 들면 몽고DB의 경우,

  • RAM이 1GB인데, DB가 50%를 사용하면
  • 서버는 50%밖에 사용하지 못하게 된다.
    이 때문에 보통 서버와 DB를 따로 컨테이너에 배치하는데, 여기서도 싱글톤 패턴을 적용하면 매번 새로운 커넥션을 만들지 않고 유지할 수 있다.

"음... 그렇다면, 싱글톤을 무조건 사용하면 되는 걸까?" 🤔


🚨 싱글톤 패턴의 단점

싱글톤이 항상 좋은 건 아니다. 대표적인 단점은 의존성이 높아진다는 점이다.

그리고 더 큰 문제는 TDD(Test Driven Development)에서 걸림돌이 된다는 것!
단위 테스트를 할 때, 각 테스트는 독립적으로 실행되어야 한다.
하지만 싱글톤 패턴을 사용하면, 하나의 인스턴스를 여러 테스트가 공유하기 때문에 테스트 간에 의존성이 생긴다.

즉,

  • 테스트 실행 순서에 따라 결과가 달라질 수도 있고,
  • 특정 테스트가 다른 테스트에 영향을 줄 수도 있다.

그래서 테스트를 쉽게 하려면 싱글톤을 지양하고, 대신 의존성 주입(Dependency Injection, DI)을 활용하는 게 좋을 수도 있다.


🎭 마무리

싱글톤 패턴은 데이터베이스 커넥션과 같은 비용이 많이 드는 객체를 공유할 때 유용하다. 하지만 테스트나 유지보수에서는 걸림돌이 될 수 있다.

"그럼, 언제 싱글톤을 써야 할까?"
공유해야 하는 자원이 많고, 생성 비용이 큰 경우에 적절하게 사용해야 한다.

몇몇 사람들은 싱글톤 패턴을 안티 패턴이라고 부르기도 한다고 한다. 그렇지만 장점도 확실한 패턴인거 같다.

반응형