강의내용
빈 스코프란?
-> 빈이존재할 수 있는 범위이다.
우리가 알고있던 빈 존재 범위는 사실 싱글콘 빈의 범위이다. 그게 기본값이니까.
하지만 스프링은 다양한 스코프를 지원한다.
1. 프로토타입
2. 웹관련 -request, session, application
스코프 등등이 존재한다.
프로토타입 스코프
매우 짧은 스코프이다.
스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지만 처리한다
-> 그러므로 @PreDestory는 동작하지 않는다.
그리고 싱글톤이 아니니까
이렇게 클라이언트는 서로 다른 빈을 받게된다.
이런 특성을 지닌 프로토타입 빈을 싱글톤과 같이 쓴다면 어떻게 될까?
프로토타입 빈이 호출됐지만, 결국 클라이언트 빈 호출시 한번만 호출되므로, 기대한 결과가 안나오게 된다.
한번만 호출된 빈의 주소값이 싱글톤에 직접 박혀버린다고 생각하면 된다.
이 문제를 어떻게 해결할까?
Provider를 사용하면 된다.
Provider
@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;
public int logic() {
PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
Provider의 사용으로 ac를 또 추가하는 부담스러운 작업 없이 새로운 빈을 획득가능하다.
웹 스코프
종류는
request: HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리된다.
session: HTTP Session과 동일한 생명주기를 가지는 스코프
application: 서블릿 컨텍스트( ServletContext )와 동일한 생명주기를 가지는 스코프
websocket: 웹 소켓과 동일한 생명주기를 가지는 스코프
이런 것들이 있다.
request 스코프에서 provider 대신 프록시를 사용할수있다.
프록시객체는 myLogger를 찾는 방법을 알고있으므로 코드는 그냥 가 myLogger.logic() 을 호출하면 된다.
이 전에서 나왔던 CGLIB가 개입한다.
'Dev > Spring' 카테고리의 다른 글
[Lombok ] 클래스 단위로 @Builder 사용시 주의점 (0) | 2021.08.20 |
---|---|
Servlet 서블릿에 대하여 (0) | 2021.07.17 |
8. 빈 생명주기 콜백 (0) | 2021.03.28 |
7. 의존관계 자동 주입 (0) | 2021.03.28 |
6. 컴포넌트 스캔 (0) | 2021.03.28 |