스프링 : 빈 스코프

Jaemin_Eun·2024년 11월 18일

스프링 빈은 스프링 컨테이너의 시작과 함께 생성되어서 종료될 때까지 유지됨. => 빈이 기본적으로 싱글톤 스코프로 생성되기 때문임.
스코프 = 빈이 존재할 수 있는 범위

  • 싱글톤 : 기본 스코프, 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위
  • 프로토타입 : 스프링컨테이너가 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프

+ 웹 관련 스코프

  • request : 웹 요청이 들어오고 나갈 때까지 유지
  • session : 웹 세션이 생성되고 종료될 때까지 유지되는 스코프
  • application : 웹의 서블릿 컨텍스와 같은 범위로 유지

싱글톤 스코프인 빈을 조회하면 항상 같은 인스턴스를 반환 : 싱글톤

프로토타입의 경우에는 스프링 컨테이너가 항상 새로운 인스턴스를 생성하고 의존관계를 주입한 후 반환, 그리고 더이상 관리하지 않음
따라서 생성 콜백, 의존관계 주입, 초기화에는 스프링 컨테이너가 관여하지만, 반환 후에는 더 이상 관리하지 않기 때문에 소멸 콜백은 동작하지 않음


프로토타입 빈을 싱글톤 빈과 함께 사용할 때 문제점
: 싱글톤 빈에 프로토타입 빈이 주입되었을 때, 프로토타입 빈의 메소드를 호출한다면 어떻게 될까? 다른 클라이언트가 싱글톤 빈을 통해 프로토타입 빈을 사용한다면, 이미 과거에 주입이 끝난 빈이기 때문에 계속 같은 프로토타입 빈을 유지함 => 의도와는 다른 결과

만약 싱글톤 빈이 프로토타입 빈을 사용할 때마다 컨테이너에 새로 요청을 한다면?
: 매번 ac.getBean()을 통해서 계속 새로운 빈이 생성됨
: 의존관계를 외부에서 주입(DI)받는게 아니라 직접 필요한 의존관계를 찾는 것을 Dependency Lookup, 의존관계 조회 라고 한다.

하지만 위와 같은 방법을 쓰면, 스프링 컨테이너에 종속적인 코드가 되고 테스트도 어려워진다.
문제 해결에는 지정한 프로토타입 빈을 컨테이너에서 대신 찾아주는 DL 기능만 필요하다.


해결법 1 : ObjectFactory, ObjectProvider
지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공한다.

특징
: 스프링이 제공하는 기능이지만, 기능이 단순해서 단위 테스트, mock코드를 만들기 훨씬 쉬워짐
: ObjectProvider는 Factory의 상속 옵션임. 스트림 처리등 편의 기능이 많고 별도의 라이브러리 필요 없음

해결법 2 : JRS-330 Provider
자바 표준 라이브러리를 사용하는 방법
import jakarta.inject.Provider

특징
: 별로 라이브러리 필요
: 자바표준이므로 스프링이 아닌 컨테이너에서도 사용 가능
: 기능이 매우 단순, get()을 통한 DL기능만 제공

0개의 댓글