여니의 프로그래밍 study/Spring & Spring Boot

[스프링부트] 싱글톤 컨테이너

여니's 2022. 1. 16. 22:31

출처

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com


순수한 DI 컨테이너

순수한 DI 컨테이너인 AppConfig는 요청을 할 때 마다 

객체를 새로 생성한다.

 

고객 트래픽이 초당 100이 나온다면 

초당 100개 객체가 생성되고 소멸된다. 

즉 메모리 낭비가 심하다.

 

해결방안은 싱글톤 패턴을 이용하여

해당 객체가 딱 1개만 생성되고 공유하도록 설계하면 된다. 

 


싱글톤 패턴

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

private 생성자를 이용하여 

외부에서 new 연산자를 통해 임의로 객체를 생성할 수 없도록 막는 방법이다.


싱글톤 컨테이너

> 스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서

객체 인스턴스를 싱글톤으로 관리한다.

 

스프링 컨테이너 덕분에

고객의 요청이 올 때 마다 객체를 생성하는 것이 아니라,

이미 만들어진 객체를

공유해서 효율적으로 재사용할 수 있다.

 

 

즉, 스프링은 싱글톤 방식으로 동작한다.

 

* 싱글톤 방식의 주의점 * 

싱글톤 방식은 하나의 같은 객체 인스턴트를 여럿이서 공유를 하기 때문에

상태를 유지하게 설계하면 안된다!

즉 무상태(stateless)로 설계해야한다.

 

무상태란 무엇인가?

> 특정 클라이언트에 의존하고 있는 필드가 있으면 안된다.

> 특정 클라이언트가 값을 변경할 수 있으면 안된다.

> 가급적이면 읽기만 가능하도록

> 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.

 

** 공유 필드는 항상 조심 **

스프링 빈은 항상 무상태로 설계를 하자!