본문 바로가기
[Spring]/Spring 기본

빈 스코프

by 황원용 2023. 3. 7.
728x90

스프링의 빈 스코프

  • 스프링 컨테이너에서 빈이 존재하는 범위를 의미한다.
  • 스프링은 다양한 스코프를 지원한다.

 

 

싱글톤

  • 스프링의 기본 스코프로, 스프링 컨테이너의 시작부터 종료까지 유지되는 가장 넓은 범위의 스코프이다.

프로토타입

  • 스프링 컨테이너는 프로토타입 빈의 생성과 의존 관계 주입, 초기화까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.
  • 클라이언트에 생성된 빈을 반환하게 되면 이후 빈을 관리할 책임은 클라이언트에 있다.
  • 따라서 @PreDestory와 같은 종료 메서드가 호출되지 않는다.
  • 스프링 컨테이너에 요청할 때마다 새로 생성된다.

 

 

프로토 타입 스코프의 빈과 싱글톤 빈을 함께 사용할 때의 문제점

  • 싱글톤 빈이 의존 관계 주입을 통해 프로토타입 빈을 주입받아서 사용하는 경우,
  • 싱글톤 빈은 보통 스프링 컨테이너 생성 시점에 함께 생성되고 의존 관계 주입도 발생한다.
  • 싱글톤 빈은 의존 관계 주입 시점에 스프링 컨테이너에 프로토 타입 빈을 요청한다.
  • 스프링 컨테이너는 프로토타입 빈을 생성해서 싱글톤 빈에 반환한다.
  • 싱글톤 빈은 프로토타입 빈의 참조값을 내부 필드에 보관한다.
  • 이때 여러 클라이언트가 싱글톤 빈을 요청하여 싱글톤 빈 안의 프로토타입 빈의 메서드를 호출할 때 문제가 발생한다.
  • 이때의 프로토타입 빈은 싱글톤 빈에 의해 이미 의존 관계 주입이 되었기 때문에 새로 생성된 프로토 타입 빈이 아니다.
  • 결국 싱글톤 빈과 함께 유지되어 여러 클라이언트가 공유하게 된다.

 

 

해결 방법

ObjectFactory, ObjectProvider 사용

  • 의존 관계를 외부에서 주입받는 것이 아니라 직접 필요한 의존관계를 찾는 것을 Dependency Lookup(DL, 의존관계 조회 or탐색)이라고 한다.
  • 지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공하는 것이 ObjectProvider이다.
  • ObjectProvider는 ObjectFactory에 여러 편의 기능이 추가되어 만들어졌다.

ObjectFactory

  • 기능이 단순하며, 별도의 라이브러리가 필요 없고, 스프링에 의존한다.

ObjectProvider

  • ObjectFactory 상속, 옵션, 스트림 처리 등 편의 기능이 많고, 별도의 라이브러리가 필요 없고, 스프링에 의존한다.

 

 

JSR-330 Provider 사용

  • gradle에 javax.inject:javax.inject:1 라이브러리를 추가해야한다.
  • 자바 표준이고, 기능이 단순하므로 단위테스트를 만들거나 mock 코드를 만들기 훨씬 쉽다.

 

 

참고

싱글톤 빈 VS 프로토타입 빈

  • 매번 의존관계 주입이 완료된 새로운 객체가 필요하면 프로토타입 빈을 사용하면 되지만 실무에서 대부분의 문제는 싱글톤 빈으로 해결가능하다.

 

ObjectProvider VS JSR-330 Provider

  • ObjectProvider는 DL을 위한 편의 기능을 제공해 주고 스프링 이외에 별도의 의존관계 추가가 필요 없기 때문에 스프링이 아닌 다른 컨테이너에서 사용해야 하는 경우가 아니면 ObjectProvider를 사용하면 된다.

 

 

웹 스코프

웹 스코프의 특징

  • 웹 스코프는 웹 환경에서만 동작한다.
  • 웹 스코프는 프로토타입과 다르게 스프링이 해달 스코프의 종료시점까지 관리한다.
  • 따라서 종료메서드가 호출된다.

 

 

웹 스코프의 종류

request

  • 웹 요청이 들어오고 나갈 때까지 유지되는 스코프이다.

session

  • 웹 세션이 생성되고 종료될 때까지 유지되는 스코프이다.

application

  • 웹의 서블릿 콘텍스트와 같은 범위로 유지되는 스코프이다.

websocket

  • 웹 소켓과 동일한 생명주기를 가지는 스코프이다.

 

 

참고

김영한 - 스프링 핵심 원리

 

 

728x90