본문 바로가기
개발

스프링과 싱글턴

by PilYeooong 2024. 5. 26.

# 싱글턴이 무엇인가?

  • 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴
  • 손쉽게 객체의 유일성을 보장할 수 있다.
public class Singleton {
	private static final Singleton instance = new Singleton();

	private Singleton() {}

	public static Singleton getInstance() {
		return instance;
	}
}

// Lazy한 방식으로도 구현이 가능하다.
public class LazySingleton {
	private static LazySingleton instance;

    private LazySingleton() {}

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

 

 

# 싱글턴의 장단점

  • 장점
    • 자원 절약
      • 이미 만들어진 객체를 공유함으로써 메모리 사용량을 줄이는 효과가 있다.
      • 객체를 반복적으로 생성하고 소멸시키는 작업은 성능에 영향을 준다.
        객체 생성과 초기화 비용을 한 번만 지불하고 이후에는 동일한 객체를 재사용함으로써 성능을 향상시키는 효과가 있다.
      • 손쉽게 객체의 유일성을 보장할 수 있다.
  • 단점
    • 싱글턴 인스턴스는 전역 상태를 가지므로, 예기치 않은 상태 변경으로 인해 버그가 발생할 수 있다.
    • ex ) A, B라는 두 곳에서 동일한 싱글턴 인스턴스를 사용하고 있는 상황.
            A에서 인스턴스 상태 혹은 내부 데이터를 변경하는 경우 B에서 에러 발생 가능성이 존재한다.
    • 멀티스레드 환경에서의 문제
      • 멀티스레드 환경에서 여러 개의 스레드가 싱글톤 인스턴스에 동시에 접근할 경우 인스턴스가 여러 번 생성될 수 있다. 이것을 해결하기 위해서 동기화 처리를 해주어야하는데, 이 처리 자체가 성능에 영향을 미칠 수 있다. (자바에서는 synchronized 키워드를 통해 처리 할 수 있다고한다.)
    • 객체 지향적이지 못하다.
      • DIP를 위반할 수 있게된다. 싱글턴 패턴 사용시 다른 클래스(클라이언트)와의 결합도가 높아질 수 있게 된다.
        싱글턴 클래스의 수정이 일어나는 경우, 결합 되어있던 다른 클래스들에도 변경이 일어나게 된다.

 

 

# 스프링에서의 싱글턴

  • 스프링 컨테이너는 싱글턴 컨테이너 역할을 한다.
    싱글턴 객체를 생성, 관리하는 기능을 싱글턴 레지스트리라 한다.
  • 스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글턴으로 관리한다.
  • 스프링 빈(Bean)의 인스턴스를 하나만 생성하고, 여러 요청이 있을 때 동일한 인스턴스를 반환한다.
  • 동작 방식
    • 컨테이너 초기화: 스프링 애플리케이션이 시작되면, 스프링 컨테이너(ApplicationContext 또는 BeanFactory)는 설정 파일(XML, Java Config, 어노테이션)을 읽어들이고 빈 정의를 분석한다.
    • 빈 인스턴스 생성: 각 빈의 정의에 따라 인스턴스를 생성한다. 이때, 스프링 컨테이너는 각 빈의 인스턴스를 하나만 생성하고, 이를 싱글턴 레지스트리에 저장한다.
    • 빈 인스턴스 반환: 클라이언트가 빈을 요청하면, 스프링 컨테이너는 이미 생성된 인스턴스를 반환한다. 만약 해당 빈이 아직 생성되지 않았다면, 그때 생성하여 반환한다.

'개발' 카테고리의 다른 글

비행기표 조회 자동화  (0) 2024.08.09
RDB에서 인덱스를 사용하지 않는 케이스들  (0) 2024.05.31
스프링과 SOLID 원칙  (0) 2024.05.21
Kotlin 간단 정리  (0) 2024.04.16