싱글톤 컨테이너

이호인·2022년 7월 30일
0

Spring

목록 보기
6/6

📌 서버 애플리케이션과 싱글톤

스프링의 특성

  • 스프링이 적용되는 대상은 자바 엔터프라이즈 기술을 사용하는 서버환경이다.
  • 태생적으로 스프링은 엔터프라이즈 시스템을 위해 고안된 기술이기 때문에 서버 환경에서 사용될 때 그 가치가 있다.
  • 이 말은 이런 특성 때문에 서버 하나당 초당 수십에서 수백 번 씩 브라우저나 여타 시스템으로부터 요청이 올 수 있음을 의미한다.

사용 이유

  • 그 때마다 각 로직을 담당하는 오브젝트를 새로 만들어서 사용한다면 서버가 감당하기 힘들어질 것이다.

예시

Ex) 요청 한번에 5개의 오브젝트가 만들어진다고 해보자.

초당 500개의 요청이 들어온다면
- 초당 2500개
- 1분의 15만 개
- 한시간에 900만 개
이 정도의 새로운 오브젝트가 만들어져야한다.

그래서 애플리케이션 안에 제한된 수, 대개 한 개의 오브젝트만 만들어서 공유하며 사용한다.

📌 싱글톤 패턴

정의

  • 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.

구현 방법

  • 클래스 밖에서는 오브젝트를 생성하지 못하도록 생성자를 private로 만든다.
  • 생성된 싱글톤 오브젝트를 저장할 수 있는 자신과 같은 타입의 static 필드를 정의한다.
  • 스태틱 팩토리 메소드인 getInstance()를 만들고 이 메소드가 최초 호출되는 시점에서 한번만 오브젝트가 만들어지도록 한다. 생성된 오브젝트는 스태틱 필드에 저장되거나 스태틱 필드의 초기값으로 오브젝트를 미리 만들어 둘 수 있다.
  • 한번 오브젝트가 만들어지고 난 후에는 getInstance() 메소드를 통해 이미 만들어져 스태틱 필드에 저장해둔 오브젝트를 넘겨준다.

📌 싱글톤 패턴의 한계

1. private 생성자를 가지고 있기 때문에 상속할 수 없다.

  • private 생성자를 가진 클래스는 다른 생성자가 없다면 상속이 불가능하다.
  • 이는 객체지향의 장점인 상속과 이를 이용한 다형성을 적용할 수 없음을 의미한다.

2. 싱글톤은 테스트하기가 힘들다.

  • 싱글톤은 만들어지는 방식이 제한적이기 때문에 테스트에서 사용될 때 목 오브젝트 등으로 대체하기가 쉽지 않다.
  • 테스트용 오브젝트로 대체하기 힘든 경우가 많다.
  • 테스트는 엔터프라이즈의 개발의 핵심인데 테스트를 만드는 데 지장이 있다는 것은 큰 단점이 된다.

3. 서버 환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.

  • 서버에서 클래스 로더를 어떻게 구성하고 있느냐에 따라 하나 이상의 오브젝트가 만들어 질 수 있다.
  • 예를 들면 여러 개의 JVM에 분산돼서 설치가 되는 경우 각각 독립적으로 오브젝트가 생기기 때문에 싱글톤으로서의 가치가 떨어지게 된다.

4. 싱글톤의 사용은 전역 상태를 만들 수 있기 때문에 바람직하지 못하다.

  • 싱글톤은 사용하는 클라이언트가 정해져 있지 않다.
  • 싱글톤의 스태틱 메소드를 이용해 언제든지 싱글톤에 쉽게 접근할 수 있기 때문에 애플리케이션 어디서든지 사용될 수 있어 자연스럽게 전역 상태로 사용되기 쉬워진다.
  • 아무 객체나 자유롭게 접근하고 수정하고 공유할 수 있는 전역 상태를 갖는 것은 객체지향 프로그래밍에서는 권장되지 않는 프로그래밍 모델이다.

📌 싱글톤 레지스트리

  • 이처럼 자바의 기본적인 싱글톤 패턴의 구현 방식은 여러 가지 단점이 있기 때문에 스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공한다. 이것을 '싱글톤 레지스트리' 라고한다.

장점

  • 스태틱 메소드와 private 생성자를 사용해야 하는 비정상 클래스가 아니라 평범한 자바 클래스를 싱글톤으로 활용할 수 있게 해준다.
  • IoC 방식의 컨테이너를 사용하여 생성과 관계설정, 사용 등에 대한 제어권을 컨테이너에게 넘겨 손쉽게 싱글톤 방식으로 만들어져 관리되게 한다.
  • 싱글톤 레지스트리 덕분에 public 생성자를 가질 수 있게 된다.

스프링은 위에 설명한 자바 싱글톤의 단점을 해결하고 싱글톤의 장점(메모리 등)만 가지고 사용할 수 있게 해준다! 😀😀😀

📌 주의해야 할 점

  • 싱글톤은 멀티스레드 환경이라면 여러 스레드가 동시해서 접근해서 사용할 수 있기 때문에 상태 관리에 주의를 기울여야 한다.
  • 서비스 형태의 오브젝트로 사용되는 경우에는 상태정보를 내부에 갖지 않도록 무상태 방식으로 만들어야한다.
  • 필드 대신에 자바에서 공유되지 않는 파라미터, 로컬 변수, ThreadLocal 등을 사용해야 한다.

reference!

인프런 - 스프링 핵심 원리 기본편 (김영한)
토비의 스프링 3.1

profile
공부 기록

0개의 댓글