1월 25일 수요일 - 스프링 핵심 원리(8/8) - 기본편 빈 스코프
1. 빈 스코프 - 빈이 존재할 수 있는 범위를 뜻한다.
- 싱글톤 스코프 - 스프링 컨테이너의 시작과 종료까지 유지되는 스코프
- 프로토타입 스코프 - 스프링 컨테이너는 프로토 타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다
- 웹 관련 스코프
- request - 웹 요청이 들어오고 나갈때까지 유지되는 스코프
- session - 웹 세션이 생성되고 종료될 때까지 유지되는 스코프
- application - 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프
2. 프로토 타입 스코프
- 프로토 타입 스코프는 매번 생성될 때마다 서로 다른 객체가 생성된다.
@Test
void prototypeBeanFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);
System.out.println("find prototypeBean1");
PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class);
System.out.println("find prototypeBean2");
PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class);
System.out.println("prototypeBean1" + prototypeBean1);
System.out.println("prototypeBean2" + prototypeBean2);
assertThat(prototypeBean1).isNotSameAs(prototypeBean2);
ac.close();}
@Scope("prototype")
static class PrototypeBean {
@postconstruct public void init() {
System.out.println("ProtoTypeBean.init"); }
@PreDestroy public void destroy() {
System.out.println("ProtoTypeBean.destroy"); }
}
위와 같이 프로토 타입 클래스를 정의하고
빈을 호출하게 되면 , 생성될 때마다 빈이 새로 생성 된다는 것을 확인할 수 있다.
빈 1과 빈2 객체가 다른 것을 확인할 수 있다.
즉 요청할 때마다 새로 생성되어
프로토 타입 스코프는 싱글톤이 아니라는 것을 알 수 있다.
3. 프로토 타입 스코프 - 싱글톤 빈과 함께 사용시 문제점
- 스프링 컨테이너에 프로토 타입 스코프의 빈을 요청하면 위에서 본 것처럼 항상 새로운 객체를 만들어서 반환하는 것을 확인할 수 있다. 그런데 문제는 싱글톤 빈과 함께 프로토 타입 빈을 사용하게 되면 원래 존재하던 빈이 의도한대로 작동하지 않는 문제가 발생한다.
- 의존 관계를 주입받는게 아니라 직접 의존관계를 찾는 것을 Dependency Lookup 이라고 한다.
4. 프로토 타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결
- 스프링의 애플리케이션 컨텍스트 전체를 주입받게 되면 , 스프링 컨테이너에 종속적인 코드가 된다.
- 지정한 프로토 타입 빈을 컨테이너에서 대신 찾아주는 Dependency Lookup의 기능을 수행하는 무엇인가가 필요하다.
5. 웹 스코프
6. request 스코프 예제 만들기
7. 스코프와 Provider
- 동시에 어떤 HTTP request 요청이 들어와도 컨트롤러에서 각각의 request scope가 생성되고 한번 생성된 스코프를 통해서 각각의 클라이언트는 서로 요청이 섞이지 않고 자신의 요청만 받을 수 있게 된다.
8. 스코프와 프록시
- proxyMode를 사용하게 되면 , MyLogger 의 가짜 프록시 클래스를 만들어두고 , HTTP request와 상관 없이 가짜 프록시 클래스를 다른 빈에 주입할 수 있다.
'자바의 봄(Spring) > 자바와 스프링 공부하기' 카테고리의 다른 글
JPA @MapsId와 @Embeddedid에 대하여 (1) | 2023.11.09 |
---|---|
DI(Dependency Injection)란 무엇인가 (0) | 2023.09.09 |
스프링 핵심 원리(6/8) - 기본편 의존관계 자동 주입 (0) | 2023.01.26 |
스프링 핵심 원리(5/8) - 기본편 컴포넌트 스캔 (0) | 2023.01.26 |
[Spring] 김영한 스프링 핵심 원리 (2/8) 강의 정리 (0) | 2023.01.18 |
댓글