본문 바로가기
스터디/Spring

[Spring] 싱글톤 패턴 (Singleton pattern)

by zoodi 2021. 8. 17.
728x90

1. 싱글톤 패턴이란 (Singleton pattern)

소프트웨어 디자인 패턴에서 싱글톤 패턴을 따르는 클래스는 , 생성자가 여러 차례 호출되더라고 실제로 생성되는 객체는 1개이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.

 

Why? 

싱글톤 패턴을 왜 사용할까? 만약 DI 컨테이너가 매번 클라이언트에서 요청이 들어올때마다 각 로직을 담당하는 오브젝트를 생성한다고 가정해보자. 요청이 엄청 많은 트래픽 사이트에서는 계속 객체를 생성하게되어 메모리 낭비가 심해지고 서버가 감당하기 힘들어진다.

그래서 싱글톤 패턴을 사용한다!

 

2. 싱글톤 패턴 구현

2-1.  DI Container

AppConfig appConfig = new AppConfig();

// 호출 할 때마다 다른 객체 생성
MemberService memberService1 = appConfig.memberService();
MemberService memberService2 = appConfig.memberService();

- 객체를 생성하면 매번 새로운 객체가 생성된다.

- 객체를 생성할 수록 메모리 낭비가 심해진다.

 

2-2. 싱글톤 패턴 구현

// 1.static 영역에 객체를 딱 1개만 생성
private static final SingletonService instance = new SingletonService();


// 2. static method를 통해서만 객체를 생성
public static SingletonService getInstance(){
	return instance;
 }
 
 //3. private 생성자를 통해 외부에서 new 로 객체 생성하는 것을 막음
 private SingletonService() { }
 
 
 void singletoneContainer() {
	SingletonService singletonService1 = SingletondService.getInstance();
    SingletonService singletonService1 = SingletondService.getInstance();
  }

- 객체를 미리 생성해둔다. 이미 만들어진 객체를 공유해서 사용한다.

 

3. 싱글톤 패턴 문제점

1. 싱글톤 패턴을 구현하는 코드가 많다.

2. 의존관계상 클라이언트가 구체 클래스에 의존

3. 테스트하기 어려움

4. private 생성자로 자식 클래스 만들기 어려움

등등등...

싱글톤 패턴을 적용하면 유연성이 떨어진다.

 

이 문제점을 스프링에서 해결해준다!!!!!

 

4. 스프링의 싱글톤 패턴

4-1. 스프링 컨테이너

스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도 스스로 객체를 싱글톤으로 관리한다. 이 기능 덕분에 싱글톤 패턴의 문제점을 해결하고 객체를 싱글톤으로 유지 할 수 있다. 서블릿(java의 서비스 오브젝트)은 멀티 스레딩 환경에서 싱글톤으로 동작하며, 서블릿 클래스 하나당 하나의 객체를 생성, 클라이언트 요청 처리를 담당하는 스레드 들이 해당 객체를 공유해서 사용한다. 

이러한 싱글톤을 저장 및 관리해주는 것이 ApplicationContext이다. 그래서 ApplicationContext를 싱글톤 레지스트리로도 불린다.

 

How?

스프링은 어노테이션 설정만으로 ApplicationContext에 제어권을 넘겨줌으로써 싱글톤으로 Bean을 설정 및 생성하여 사용한다.

(@Repository, @Service, @Controller 등)

 

4-2. 주의점

스프링에서 객체 인스턴스를 하나만 생성해서 공유하는 상황일 때, 객체 인스턴스를 공유하므로 객체 상태를 무상태성(stateless)을 지켜야한다. 즉 공유하는 변수(필드)를 값을 유지하는 방향으로 설계하면 안된다.(=클래스 내부에 상태 정보를 가지고 있으면 안됨)

 


참고:

https://velog.io/@jaeeunxo1/spring-singleton

 

스프링 핵심원리 - 싱글톤패턴

웹 애플리케이션과 싱글턴 1. 싱글턴 패턴(Singleton pattern) > 소프트웨어 디자인 패턴에서 싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최

velog.io

https://webdevtechblog.com/싱글턴-패턴-singleton-pattern-db75ed29c36

 

싱글턴 패턴(Singleton Pattern)

자바와 스프링의 싱글턴 패턴(Singleton Pattern)과 차이점

webdevtechblog.com

 

728x90

댓글