[Spring] 빈 스코프

hi·2022년 11월 7일

빈 스코프
빈이 존재할 수 있는 범위

싱글톤 스코프

@Scope("singletone")
static class BeanScopeEx {

}
  • 기본 스코프
  • 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프
  • 항상 같은 인스턴스의 스프링 빈 반환

프로토타입 스코프

@Scope("prototype")
static class BeanScopeEx {

}
  • 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고
    그 이후는 관리하지 않음 👉 @PreDestroy 같은 종료 메서드 호출 X

  • 매우 좁은 범위의 스코프

  • 요청시마다 새로운 인스턴스를 생성하여 반환


🔎 싱글톤 빈과 함께 사용시 문제점

  • 스프링은 일반적으로 싱글톤 빈을 사용하므로, 싱글톤 빈이 프로토타입 빈을 사용
    그런데 싱글톤 빈은 생성 시점에만 의존관계 주입을 받기 때문에,
    프로토타입 빈이 새로 생성되기는 하지만 싱글톤 빈과 함께 계속 유지되는 것이 문제

프로토타입 빈을 주입 시점에만 새로 생성하는게 아니라, 사용할 때 마다 새로 생성해서 사용하려면 ?


ObjectFactory, ObjectProvider

ObjectProvider

  • ObjectProvider 의 getObject() 를 호출하면
    지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공

  • ObjectFactory 에 편의 기능을 추가한 것

  • 스프링이 제공하는 기능을 사용하며 기능이 단순
    단위테스트, mock 코드를 만들기 쉬움

DL (Dependency Lookup)
의존관계를 외부에서 주입(DI) 받는게 아니라 직접 필요한 의존관계를 찾는 것


JSR-330 Provider

  • javax.inject.Provider 라는 JSR-330 자바 표준을 사용
    스프링이 아닌 다른 컨테이너에서도 사용 가능

  • javax.inject:javax.inject:1 라이브러리를 gradle에 추가하여 사용

  • provider.get() 을 통해서 항상 새로운 프로토타입 빈이 생성됨

  • 기능이 단순하여 단위테스트, mock 코드를 만들기 쉬움


스프링이 더 다양하고 편리한 기능을 제공해주기 때문에
특별히 다른 컨테이너를 사용할 일이 없다면 스프링이 제공하는 기능을 사용


웹 관련 스코프

  • 웹 환경에서만 동작 -> 라이브러리 추가 필요
implementation 'org.springframework.boot:spring-boot-starter-web'
  • 해당 스코프의 종료시점까지 관리

🔎 라이브러리 추가시 스프링 부트는 내장 톰캣 서버를 활용하여 웹 서버와 스프링을 함께 실행

웹 라이브러리 X : AnnotationConfigApplicationContext 기반으로 구동
웹 라이브러리 O : AnnotationConfigServletWebServerApplicationContext 기반으로 구동

request

HTTP 요청 하나가 들어오고 나갈때 까지 유지되는 스코프
각 HTTP 요청마다 별도의 빈 인스턴스가 생성, 관리됨

session

HTTP Session과 동일한 생명주기를 가지는 스코프

application

서블릿 컨텍스트( ServletContext )와 동일한 생명주기를 가지는 스코프

websocket

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

0개의 댓글