Spring - Singleton(싱글톤) 패턴

지니·2023년 8월 20일
0

spring

목록 보기
11/13

이번 포스트에서는 스프링의 Singleton 패턴에 대해서 알아보자

1. Singleton 패턴이란

  • Singleton 패턴은 객체지향 프로그래밍에서 사용되는 디자인 패턴으로, 클래스의 인스턴스가 오직 한 개만 생성되도록 보장하는 패턴이다.

  • 이는 전역적인 접근이 필요한 객체에 대해 단 하나의 인스턴스를 생성하고, 이를 모든 사용자에게 제공한다.


2. Singleton 패턴의 활용

  1. 전역적인 리소스에 접근해야 하는 경우

  2. 설정 정보, 로그 기록 등의 중요한 데이터를 관리해야 하는 경우

  3. 비용이 큰 작업을 수행하는 경우


3. Singleton 패턴의 구현 방법

  • Singleton 패턴을 구현하는 방법은 여러 가지가 있지만, 일반적으로 다음과 같은 특징을 갖는다.

프라이빗 생성자(private constructor):

  • Singleton 클래스는 외부에서 직접 인스턴스를 생성하지 못하도록 생성자를 private으로 선언한다. 이로써 외부에서 new 키워드를 사용하여 인스턴스를 생성하는 것을 방지한다.

정적 메서드(static method)로 유일한 인스턴스 반환:

  • Singleton 클래스 내부에 자신의 유일한 인스턴스를 담을 정적 필드(static field)를 선언하고, 이를 반환하는 정적 메서드(static method)를 제공한다. 이를 통해 Singleton 클래스의 인스턴스에 접근할 수 있다.

지연 초기화(Lazy Initialization):

  • 인스턴스가 필요한 시점에서 인스턴스를 생성한다. 처음으로 인스턴스가 요청되기 전까지는 인스턴스가 생성되지 않는다. 이를 통해 자원의 낭비를 방지할 수 있다.

스레드 안전성(Thread Safety):

  • Singleton 패턴은 다중 스레드 환경에서 안전하게 동작해야 한다. 동시에 여러 스레드가 getInstance() 메서드에 접근할 때 문제가 발생하지 않도록 스레드 안전성을 보장해야 한다.

4. 자바의 Singleton 패턴 예시코드

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // private 생성자
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  • 위의 코드에서 Singleton 클래스는 인스턴스가 단 하나만 생성되도록 보장한다. instance라는 정적 필드를 선언하고, getInstance() 메서드를 통해 유일한 인스턴스를 반환하게 된다.

  • private Singleton():

    • 클래스의 생성자를 private으로 선언하여 외부에서 인스턴스를 직접 생성하는 것을 막는다.
  • public static synchronized Singleton getInstance():

    • 정적 메서드인 getInstance()를 통해 Singleton 클래스의 유일한 인스턴스를 반환한다. 이 메서드는 동기화된 방식으로 인스턴스를 생성하므로 스레드 안전성을 보장한다.
  • 위의 예시 코드는 지연 로딩 방식을 사용하고 있으며, 처음으로 인스턴스가 요청되는 시점에 인스턴스를 생성한다. 또한, synchronized 키워드를 사용하여 다중 스레드 환경에서의 스레드 안전성을 보장한다.

  • Singleton 패턴을 사용하면 전역적인 접근이 필요한 객체를 효율적으로 관리할 수 있다. 하지만 Singleton 패턴은 과도한 사용은 코드의 유연성을 감소시킬 수 있으므로, 적절한 상황에서 사용하는 것이 중요하다.


5. Spring과 Singleton의 관계

  • Spring Framework에서 빈(Bean)을 관리하는 기본적인 방식은 Singleton 패턴과 관련이 있다. Spring은 기본적으로 빈을 Singleton으로 관리하며, 한 개의 인스턴스를 생성하고 모든 요청에 대해 동일한 인스턴스를 반환한다.

Spring에서 빈이 Singleton으로 관리되는 이유는 다음과 같다.

  • 성능 및 자원 관리:

    • Singleton으로 관리되는 빈은 애플리케이션 전반에서 하나의 인스턴스를 공유하여 메모리와 자원을 효율적으로 관리할 수 있다. 매번 새로운 인스턴스를 생성하는 비용을 줄이고, 중요한 리소스를 공유하여 성능을 향상시킬 수 있다.
  • 일관성과 데이터 공유:

    • Singleton으로 관리되는 빈은 여러 컴포넌트에서 동일한 인스턴스를 사용하므로, 데이터의 일관성과 공유가 용이하다. 예를 들어, 설정 정보, 데이터베이스 연결, 캐시 등의 중요한 데이터를 한 곳에서 관리하고 공유할 수 있다.
  • 의존성 주입(Dependency Injection)의 편의성:

    • Singleton으로 관리되는 빈은 의존성 주입을 통해 다른 컴포넌트로 주입되기 쉽다. 하나의 인스턴스를 공유하므로, 의존성 주입을 받은 컴포넌트들은 동일한 인스턴스를 사용하여 의존성을 해결할 수 있다.
  • 관계 정리

    • Spring에서는 개발자가 직접 싱글톤 패턴을 구현하거나 인스턴스를 관리하지 않아도 된다. Spring 컨테이너가 빈의 생명주기를 관리하고, 필요한 곳에 필요한 빈을 주입하여 Singleton 패턴과 관련된 작업을 대신 처리해 준다.

    • 또한, SpringSingleton 이외의 다른 스코프(scope)도 지원한다. Prototype, Request, Session, Application 등 다양한 스코프를 제공하여 필요에 따라 인스턴스를 생성하고 관리할 수 있다. 이렇게 함으로써 더 세밀한 객체 생명주기 관리와 다양한 요구사항을 처리할 수 있다.

  • 요약하자면, Spring Framework에서의 SingletonSpring 컨테이너가 빈을 관리하는 기본적인 방식이며, Singleton 패턴은 빈 관리와 의존성 주입을 위한 편의성과 성능 향상을 위한 목적으로 사용된다.
profile
탐구하는 Backend 개발자

0개의 댓글

관련 채용 정보