빈 스코프

바그다드·2023년 3월 2일
0
post-thumbnail

빈 스코프란?

빈이 존재할 수 있는 범위

스프링 빈 생명 주기

컨테이너 생성 -> 스프링 빈 생성 -> DI -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료

빈 스코프 종류

싱글톤

기본값으로 스프링 컨테이너의 시작부터 종료까지 유지

프로토타입

빈을 조회할 때마다 새로운 객체를 생성해서 반환

스프링 컨테이너가 빈의 생성과 의존관계 주입, 초기화까지만 관리한다.
- 때문에 소멸 콜백이 따로 호출되지 않는다

싱글톤과 프로토타입

싱글톤 빈에서 프로토타입 빈을 사용할 때 문제가 발생하는데,

  • 프로토타입 빈은 스프링 컨테이너에 요청할 때 새로 생성되는 것이지 사용할 때 생성되는 것이 아니다.
    싱글톤 빈과 프로토타입 빈이 의존 관계에 있을 때 싱글톤 빈이 생성될 때 DI로 인해 프로토타입 빈이 한번 호출되어 스프링 컨테이너가 프로토타입 빈을 생성하고 이 참조값이 싱글톤 빈에 남아있게 된다.


  • 프로토타입 빈을 싱글톤 빈의 생성 시점에 호출하여 공유하기 때문에 clientBean2가 logic을 호출하는 시점에 count는 1이 아닌 2가 된다.

Provider

위의 경우, 개발자는 프로토타입 빈을 호출할 때마다 새로 생성되는 것을 의도할 것인데 이를 해결해주는 것이 Provider이다.



이런 식으로 provider를 이용하면 싱글톤 빈에서도 호출 할 때마다 새로운 프로토타입을 생성해서 사용할 수 있다

  • 이처럼 직접 필요한 의존관계를 찾는 것을 DL(Dependency Lookup, 의존관계 탐색)이라고 한다.
- provider는 자바 표준 라이브러리이기 때문에 의존성 주입을 추가해줘야 한다.
특징
	- 별도의 라이브러리 필요
    - 다른 컨테이너에서 사용 가능
    - get()메서드 하나의 기능
- 스프링에서 지원하는 기능으로는 ObjectFactory,ObjectProvider가 있는데,
사용법은 provider와 유사하며 (프로토타입)빈 획득 메서드는 getObject()이다.
특징
	- 별도 라이브러리 불필요
	- 스프링에 의존적
    - ObjectProvider의 경우 ObjectFactory를 상속 받으며 옵션, 스트림 처리 등 편의 기능이 많음
    

웹 스코프

request

HTTP요청이 들어오고 나갈 때까지 유지, 각 HTTP 요청마다 별개의 인스턴스 생성

session

session과 동일한 생명주기를 가짐

application

서블릿 컨텍스트와 동일한 생명주기를 가짐

websocket

웹 소켓과 동일한 생명 주기를 가짐
profile
꾸준히 하자!

0개의 댓글