[Spring Core] 빈 스코프(Bean Scope)
* 스프링은 기본적으로 모든 bean을 singleton으로 생성하여 관리함
Scope | Description |
Singleton | (Default) 각 Spring 컨테이너에 대한 단일 객체 인스턴스에 대한 단일 bean definition의 범위를 지정 |
prototype | 스프링 컨테이너는 프로토타입 빈의 생성과 의존 관계 주입까지만 관여하고 더는 관리하지 않는 짦은 범위의 스코프 |
request | 웹 요청이 들어오고 나갈때까지 유지되는 스코프 |
session | 웹 세션이 생성되고 종료될 때까지 유지되는 스코프 |
application | 웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프 |
websocket | 단일 bean definition 범위를 WebSocket의 라이프사이클까지 확장. Spring ApplicationContext의 컨텍스트에서만 유효 |
* request ~ websocket은 web scope의 종류로 웹 환경에서만 동작하는 스코프
* Spring Framework에서는 6개의 범위를 지원, ApplicationContext를 사용하는 경우에는 6개 중 4개만 사용 가능
* 싱글톤의 경우 가장 보편적인 scope로, bean 등록 시 따로 설정하지 않을 경우 자동으로 singleton으로 등록 (기본설정)
싱글톤(Singleton)
: 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴
>> 객체 인스턴스가 2개 이상 생성되지 못하도록 막아야 함
: 싱글톤 빈의 하나의 공유 인스턴스만 관리(여러번 호출해도 모두 같은 인스턴스 참조 주소값을 지님)하게 되며 private 생성자를 사용해 외부에서 임의로 new를 사용하지 못하도록 막음
: 단일 인스턴스는 싱글톤 빈의 캐시에 저장됨
: 스프링 컨테이너의 시작과 함께 생성되어 스프링 컨테이너가 종료될 때까지 유지 (스프링 컨테이너 종료시 소멸 메서드도 자동 실행)
: bean definition과 일치하는 ID 또는 ID를 가진 빈에 대한 모든 요청은 스프링 컨테이너에서 특정 빈 인스턴스를 반환
문제점)
: 싱글톤 패턴을 구현하는 코드 자체가 많음
: 의존관계상 클라이언트가 구체 클래스에 의존함
: 지정해서 가져오기 때문에 테스트가 어려움
: private 생성자를 사용해 자식 클래스를 만들기 어려워 유연성이 떨어짐
: 속성 공유
- 멀티 쓰레드 환경에서 싱글톤 객체의 속성은 여러 쓰레드에 의해 변경될 수 있음
- 쓰레드에서 속성값을 변경하고 출력하는 과정에서 다른 쓰레드가 속성값을 변경할 경우 기존 쓰레드에서 예상치 못한 값이 나올 수 있음 (1개의 인스턴스에서 속성값을 공유하기 때문)
: Application 초기 구동 시 인스턴스를 생성하기 떄문에 싱글톤 빈이 많을수록 구동 시간이 증가할 수 있음
주의점)
: 하나의 인스턴스를 생성해 공유하기 때문에 객체의 상태를 유지하게 설계하면 안됨 (무상태로 설계해야 함)
: 특정 클라이언트에 의존적이거나 값을 변경할 수 있는 필드가 있으면 안됨
: 가급적 읽기만 가능해야 함
: 필드 대신 공유되지 않는 지역변수, 파라미터, 쓰레드로컬(ThreadLocal)을 써야함