싱글톤 패턴(1)

김세빈·2025년 4월 14일

디자인패턴

목록 보기
2/7

소프트웨어 개발을 하다 보면 시스템 리소스를 효율적으로 사용하고, 불필요한 객체 생성을 줄이기 위한 설계 패턴을 적용하게 됩니다. 그 중 대표적인 패턴 중 하나가 싱글톤 패턴(Singleton Pattern)입니다.


✅ 싱글톤 패턴이란?

싱글톤 패턴은 하나의 클래스에서 오직 하나의 인스턴스만을 생성하도록 보장하는 디자인 패턴입니다. 즉, 전역에서 해당 인스턴스를 공유하여 사용하도록 설계하는 방식입니다.

📌 예시

가장 흔한 예시로는 데이터베이스 연결 모듈이 있습니다. 데이터베이스와의 연결은 자원 소모가 크기 때문에, 매번 새롭게 연결 객체를 만들기보다는 하나의 인스턴스를 공유하는 것이 효율적입니다.


✅ 장점

  • 인스턴스가 하나만 생성되므로 객체 생성 비용을 줄일 수 있습니다.
  • 특히 DB, 파일, 네트워크 등 IO 작업에서 리소스를 절약하는 데 유리합니다.
  • 전역 상태를 공유하기에 관리 포인트가 명확해집니다.

⚠️ 단점

  • 하나의 인스턴스를 모든 곳에서 공유하기 때문에 의존성이 높아집니다.
  • 단위 테스트(TDD) 환경에서는 독립적인 테스트를 구성하기 어려워 테스트의 유연성이 떨어집니다.
  • 경우에 따라 멀티스레드 환경에서 동기화 문제를 신경 써야 할 수 있습니다.

✅ IO Bound란?

IO Bound(입출력 바운드)는 작업이 CPU 처리보다는 입출력(디스크, 네트워크, DB) 등 외부 자원에 의해 성능이 결정되는 작업을 의미합니다.

📌 예시

  • 네트워크 요청
  • 데이터베이스 쿼리
  • 파일 읽기/쓰기

Node.js 환경에서 많이 사용하는 Mongoose는 MongoDB와의 연결을 담당하는 ORM 라이브러리로, 이러한 IO Bound 환경에서 활용됩니다. Mongoose는 싱글톤 인스턴스를 기반으로 여러 모듈에서 같은 DB 연결 객체를 공유합니다.


✅ 자바에서 싱글톤 구현 예시

Java에서는 다음과 같이 중첩 클래스(static inner class)를 활용한 싱글톤 패턴을 사용할 수 있습니다. 이 방식은 lazy initializationthread-safe를 동시에 보장할 수 있는 안정적인 방식입니다.

class Singleton {
  // 중첩 클래스 방식: JVM의 클래스 로딩 특성을 활용해 정적 초기화
  private static class SingletonHolder {
    private static final Singleton INSTANCE = new Singleton();
  }

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

이 방식은 클래스가 로드될 때까지 인스턴스가 생성되지 않으며, 동시에 여러 스레드가 접근해도 안전한 구조입니다.


✅ 마무리

싱글톤 패턴은 리소스 절약과 효율적인 관리가 필요한 시스템에서 유용하게 사용됩니다. 하지만 무분별한 사용은 테스트나 구조 설계에 악영향을 줄 수 있으므로 필요한 상황에 한해 신중히 사용하는 것이 중요합니다.

또한 IO Bound 작업이 많은 시스템에서는 싱글톤 패턴을 통해 공유 가능한 연결 객체를 관리하는 것이 효율적인 방식입니다.

지속적으로 객체 생성과 리소스 관리 방식에 대한 고민은 더 나은 시스템 설계로 이어지는 밑거름이 됩니다.

0개의 댓글