공부 자료/Spring

[Spring Core] 빈 스코프(Bean Scope)

희희웃는청바지 2022. 10. 13. 18:17

* 스프링은 기본적으로 모든 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)을 써야함