Link Search Menu Expand Document

빈 스코프

목차

  1. 빈 스코프?
  2. 프로토타입 스코프
  3. 프로토타입 스코프의 문제와 해결
  4. 웹 스코프
  5. 스코프와 Provider
  6. 스코프와 프록시

본 문서는 인프런에서 수강할 수 있는 스프링 핵심 원리 - 기본편을 수강한 후, 공부한 내용을 정리한 문서입니다. 본 문서의 모든 저작권은 해당 강의의 저자이신 김영한 우아한형제들 기술이사님께 있습니다.

문서 공사중입니다.

빈 스코프?

빈의 생명주기가 적용되는 범위, 변수의 스코프에서의 그 스코프 맞다.

프로토타입 스코프

Spring 빈의 기본 스코프는 싱글톤이다. 싱글톤 스코프는 객체가 생성된 다음 스프링 컨테이너가 종료될 때까지 살아있지만, 프로토타입 스코프로 지정하면 한번 생성되서 의존관계만 주입해주고 스프링 컨테이너에서도 지워진다.

프로토타입 스코프의 문제와 해결

프로토타입 스코프를 싱글톤 스코프 객체 안의 필드에 저장하게 되면 프로토타입의 특징을 잃는다. 생성할 때마다 매번 새로운 객체가 들어오는 것을 기대하지만 이미 필드에 저장된 객체를 불러오기 때문에 같은 객체를 참조하게 된다. 이것을 해결하는 방법이 Provider.

웹 스코프

웹 스코프는 웹 환경에서만 동작한다. 웹 스코프는 프로토타입과 다르게 스프링이 해당 스코프의 종료 시점까지 관리한다. (생성은 웹 요청 시에 생성된다.) 문제는 웹 요청 시에 빈이 생성되기 때문에 컨테이너가 올라가고 로직이 실행될 때 없는 빈을 참조하기 때문에 예외가 발생한다.

스코프와 Provider

이런 예외를 해결하기 위해서 첫 번째 방법으로 Provider가 있다. DL(Dependency Lookup)을 사용하는 Provider는 getObjec()를 호출하는 시점까지 빈의 생성을 지연한다.

스코프와 프록시

스코프 애노티에션에 proxyMode 어트리뷰트를 활용해 프록시 방식을 적용할 수 있다. Provider 사용 시와는 다르게 싱글톤 스코프와 같은 코드로도 빈의 생성이 정상적으로 이루어진다. 이것이 가능한 이유는 CGLIB 라이브러리를 활용해 내가 작성한 클래스(빈)을 상속한 가짜 “프록시” 객체를 만들어서 대신 주입하고 HTTP Request가 왔을 때 가짜 “프록시” 객체가 내부 로직(위임)을 통해 진짜 객체(빈)의 로직을 실행한다. 이는 다형성의 장점이다.(클라이언트는 객체가 가짜 프록시 객체인지 진짜 스프링 빈인지 알 필요가 없다.) 꼭 웹 스코프가 아니더라도 프록시는 사용 가능하다.