CS공부 18일차. 오늘은 스프링에서 빈이 적용되는 범위인 scope의 종류와 적용 방법에 대해 토비의 스프링 3.1을 읽고 알아보았습니다.
스프링 빈의 스코프는 싱글톤이 디폴트이다.
ApplicationContext 마다 Bean Object가 한 개씩만 만들어진다는 의미이다.
매번 애플리케이션 로직을 담은 오브젝트를 새로 만들지 않기 때문에 효율적이다.
하나의 빈 오브젝트에 동시에 여러 스레드가 접근한다.
상태값을 인스턴스 변수에 저장하지 않고 읽기전용 값만 저장한다.
여러개의 빈에서 DI를 해도 매번 동일한 오브젝트가 주입된다.
@Scope(“prototype")
매번 새로운 오브젝트를 생성한다.
컨테이너가 빈을 전적으로 관리하는 IoC 기본원칙을 따르지 않고 생성된 이후에는 주입받은 빈이 관리한다. 따라서 한번 만들어진 빈을 다시 컨테이너를 통해 가져올 수 없다.
사용자의 요청에 따라 매번 독립적인 오브젝트를 만들어야 하며 DI가 필요할 때 사용된다.
오브젝트 중심적이고 확장이 유연하다.
DI는 데이터를 덮어쓰기 때문에 적절하지 못하고 DL 방식으로 사용해야 한다.
ApplicationContext를 @Autowired를 통해 DI 받은 후에 getBean으로 직접 호출
ObjectFactory를 사용하여 ApplicationContext를 DI받게 하고 이 Factory를 DI받아서 getObject로 호출
메소드 주입
abstract public ServiceRequest getServiceRequest();
public void serviceForm(HttpServletRequest request){
ServiceRequset sr = this.getServiceRequest();
...
}
@Autowired
Provider <ServiceRequest> serviceRequestProvider;
public void serviceForm(HttpServletRequest request){
ServiceRequset sr = this.serviceRequestProvider.get();
...
}
하나의 웹 요청 안에서 만들어지고 해당 요청이 끝날 때 제거
빈 오브젝트 내에 상태값 저장 가능
각 요청마다 독립적으로 빈이 만들어지므로 동시에 여러 사용자가 많은 요청을 보내도 처리 가능
코드에서 생성한 정보를 프레임워크 레벨의 서비스에 전달할 때 사용
사용자별로 만들어지고 브라우저를 닫거나 세션 타임이 종료될 때까지 유지되는 세션과 같은 존재 범위를 가진다.
세션에 저장되는 정보를 모든 계층에서 이용 가능
서블릿 컨텍스트에 저장되는 빈 오브젝트
싱글톤과 범위가 같지만 드물게 ApplicationContext와 Web Application의 존재 범위가 다를 경우 사용된다.