싱글톤패턴

반응형
SMALL

"싱글톤(Singleton)"은 객체를 오직 하나만 생성해 모든 곳에서 공유하여 사용하도록 하는 디자인 패턴입니다.

싱글톤의 주요 개념

  1. 인스턴스 하나만 생성: 애플리케이션 전체에서 하나의 인스턴스만 존재하도록 제한합니다. 예를 들어, 같은 타입의 객체가 여러 개 생성되면 메모리를 더 많이 사용하게 되는데, 싱글톤을 통해 이런 메모리 낭비를 줄일 수 있어요.
  2. 애플리케이션 전역에서 동일 객체 참조: 싱글톤 객체는 애플리케이션 어디에서든 같은 인스턴스를 공유하기 때문에, 상태가 유지되어야 하는 경우 유용하게 사용할 수 있습니다.
  3. 글로벌 접근: 싱글톤 인스턴스는 어디서든 접근할 수 있어요. 보통 getInstance() 같은 메서드를 통해 접근합니다.

스프링과 싱글톤

Spring에서는 모든 빈이 기본적으로 싱글톤으로 관리됩니다. 즉, 특정 빈을 여러 곳에서 주입받아 사용해도 실제로는 하나의 인스턴스를 참조하게 됩니다. 이를 통해 중복된 객체 생성 비용을 줄이고, 효율성을 높일 수 있어요.

싱글톤 사용 예시 (일반적인 싱글톤 패턴)

Java에서 싱글톤 패턴을 구현하려면, 보통 다음과 같이 구현해요

public class SingletonExample {
    private static SingletonExample instance;

    // private 생성자를 통해 외부에서 객체를 생성하지 못하게 막음
    private SingletonExample() {}

    // 인스턴스를 얻는 메서드
    public static SingletonExample getInstance() {
        if (instance == null) {
            instance = new SingletonExample();
        }
        return instance;
    }
}

위의 코드에서 getInstance() 메서드를 호출하면 항상 같은 인스턴스를 반환하게 됩니다.

스프링에서 싱글톤의 장점과 주의점

장점

  • 자원 절약: 여러 개의 객체를 생성할 필요 없이 하나의 인스턴스를 공유해 메모리와 CPU 자원을 절약할 수 있습니다.
  • 성능 최적화: 객체 생성 비용이 높은 경우, 싱글톤 패턴으로 초기화 비용을 한 번만 부담할 수 있어요.

주의점

  • 상태 유지에 주의: 싱글톤 빈은 애플리케이션 전체에서 공유되므로, 내부 상태를 변경할 수 있는 필드를 가지면 안 됩니다. 만약 필드의 값이 변하면, 이를 사용하는 모든 곳에 영향을 미칠 수 있어요. 그래서 싱글톤 빈은 주로 **무상태(stateless)**로 사용되는 것이 권장됩니다.
  • 동시성 문제: 싱글톤 빈이 내부적으로 상태를 유지해야 한다면, 여러 스레드가 동시에 접근할 경우 동시성 문제가 발생할 수 있어요. 따라서 스프링 빈을 사용할 때는 최대한 상태를 갖지 않게 설계하고, 만약 상태가 필요하다면 프로토타입 빈을 사용하거나 상태를 외부에서 관리하도록 설계해야 해요.

이처럼 싱글톤은 전역적으로 하나의 인스턴스를 사용하는 효율적인 방식이지만, 잘못된 사용으로 인해 예상치 못한 문제를 발생시킬 수 있기 때문에 주의가 필요합니다.

반응형
LIST