💡 Singleton Container
스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다.
지금까지 우리가 학습한 스프링 빈이 바로 싱글톤으로 관리되는 빈이다.
- 스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.
- 이전에 설명한 컨테이너 생성 과정을 자세히 보자. 컨테이너는 객체를 하나만 생성해서 관리한다.
- 스프링 컨테이너는 싱글톤 컨테이너 역할을 한다.
- 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.
- 스프링 컨테이너의 이런 기능 덕분에 싱글턴 패턴의 모든 단점을 해결하면서 객체를 싱글톤으로 유지할 수 있다.
- 싱글톤 패턴을 위한 지저분한 코드가 들어가지 않아도 된다.
- DIP & OCP 위반, 테스트, private 생성자로 부터 자유롭게 싱글톤을 사용할 수 있다.
Singleton 방식의 문제점
- 싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는
싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에
싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. - 무상태(stateless)로 설계해야 한다!
- 특정 클라이언트에 의존적인 필드가 있으면 안된다.
- 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다!
- 가급적 읽기만 가능해야 한다.
- 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.
- 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다!!!
상태를 유지 할 경우 발생하는 문제 예시
- Thread A가 사용자 A 코드를 호출하고 Thread B가 사용자 B 코드를 호출한다고 가정
- StatefulService 의 price 필드는 공유되는 필드인데, 특정 클라이언트가 값을 변경
- 사용자A의 주문금액은 10000원이 되어야 하는데, 20000원이라는 결과가 나옴
- 스프링 빈은 항상 무상태(stateless)로 설계해야함
무상태(stateless) 설계로 변경
- stateful 하게 설계된 코드들을 주석처리하고 무상태(stateless)로 설계 후 테스트
'Inflearn 강의 > Spring 핵심원리 기본' 카테고리의 다른 글
7 - Component Scan (0) | 2022.10.18 |
---|---|
6 - @Confituration과 Singleton / 바이트코드 조작 (0) | 2022.10.17 |
4 - Singleton Pattern (0) | 2022.10.17 |
3 - Bean 조회 (0) | 2022.10.17 |
2 - Spring 사용하여 개발 (1) | 2022.10.15 |