[Spring] Singleton Pattern

이연우·2025년 7월 25일

TIL

목록 보기
45/100

🧠 싱글톤 패턴(Singleton Pattern)이란?

  • 클래스의 인스턴스(객체)를 오직 하나만 생성되도록 보장하는 디자인 패턴
  • 주로 리소스를 공유하거나 동일한 객체가 반복 생성되는 상황에서 사용됨

📈 왜 싱글톤이 필요한가?

  • Web Application은 불특정 다수의 고객이 동시에 많은 요청 전송

    → 요청을 할 때마다 객체가 새로 생성되고 처리가 완료되면 소멸
    메모리 낭비 심각

  • 싱글톤 패턴 적용
    - 객체 인스턴스가 하나만 생성되고 생성된 인스턴스만 사용하도록 만듦
    → 객체가 한번만 생성되어 리소스를 절약할 수 있음

🛠️ 싱글톤 패턴 구현 (기본 Java 방식)

public class Singleton {
    private static Singleton instance;

    private Singleton() {} // 외부에서 new 막음

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton(); // 최초 1회 생성
        }
        return instance;
    }
}
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();

System.out.println(s1 == s2); // true (같은 객체)

✅ 장점

  • 메모리 절약
  • 객체 관리 일원화

❌ 단점

  • 코드 복잡도 증가
  • 유연성 ↓ → OCP, DIP 위반 가능성 있음

⚠️ 싱글톤의 대표 문제점

  • DIP / OCP 위반 예시
Singleton service = SingletonImpl.getInstance(); 

→ 위처럼 구현체에 직접 접근하면 다른 구현체로 바꾸기 어려움DIP 위반


📦 Spring의 싱글톤 컨테이너

  • Spring은 Web Application을 만들 때 주로 사용


Spring Container는 싱글톤 패턴의 문제점들을 해결하면서 객체를 싱글톤으로 관리
Spring Bean싱글톤으로 관리되는 객체

  • 싱글톤 컨테이너 특징
특징내용
생성 타이밍애플리케이션 시작 시 1번만 생성
공유 방식요청이 올 때마다 같은 Bean 반환
확장 가능필요 시 프로토타입 등 다른 스코프로 설정 가능
@Scope("prototype") // 요청마다 새 객체
@Component
public class PrototypeService {}

🚫 싱글톤 패턴의 주의점

🧨 상태 유지 문제 (stateful)

  • ❗ 싱글톤 객체는 무상태(stateless) 로 설계해야 함
  • 상태값이 필드에 저장되면 → 여러 사용자가 같은 객체를 공유할 때 데이터 충돌 발생
client1.setValue(42);  
client2.setValue(100);  
client1.getValue(); // 100 ← 예상과 다른 값

❌ 잘못된 예시 (stateful)

public class StatefulSingleton {
    private int value; // 상태 필드
    ...
}

✅ 올바른 설계 (stateless)

public class StatelessService {
    public int process(int input) {
        return input * 2; // 내부 상태 저장 없이 처리
    }
}

0개의 댓글