빈 스코프

qkrrnjswo·2023년 4월 17일
0

Inflearn Spring

목록 보기
13/13

빈 스코프란?

  • 빈이 존재할 수 있는 범위를 말한다.

프로토타입 스코프

1. 싱글톤 스코프

  • 기본 스코프, 컨테이너의 시작과 종료까지 유지되는 스코프

2. 프로토타입 스코프

1) 클라이언트의 요청
2) 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 하고 클라이언트에게 반환.(유지 x)
3) 클라이언트가 또 요청한다면, 새로 생성해서 의존관계 주입, 반환

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

1) 싱글톤 타입 빈이 프로토타입 빈을 의존관계 주입으로 주입받았을때 문제가 발생!
2) 싱글톤 빈이 프로토타입 빈의 참조값을 보관
3) A클라이언트의 요청
4) 싱글톤 빈이 프로토타입 빈을 호출
5) B클라이언트의 요청
6) 싱글톤 빈이 같은 프로토타입 빈을 호출
💡 즉 생성 시점에 주입프로토타입 빈을 계속 쓴다!!!!
-> 이러면 굳이 프로토타입 빈을 쓸 이유가 없다.

4. ObjectProvider(스프링이 제공)로 문제 해결

지금 여기서 필요한것은? 항상 새로운 프로토타입 빈을 스프링 컨테이너에 요청하면 됨!

static class ClientBean {
    @Autowired private ApplicationContext ac;
    
    public int logic() {
        PrototypeBean prototypeBean = ac.getBean(프로토타입이름.class);
        prototypeBean.addCount();
        int count = prototypeBean.getCount();
        return count;
    }
}
  • prototypeBeanProvider.getObject() 을 통해서 항상 새로운 프로토타입 빈이 생성
  • 필요한 DL 정도의 기능만 제공한다.

💡DL? 의존관계 검색(Dependency Lookup)
: 의존관계가 필요한 객체에서 직접 검색하는 방식(인터페이스 타입만 지정해서 검색)

5. JSR-330 Provider(자바 표준)

  • 스프링부트 3.0 미만
    javax.inject:javax.inject:1 라이브러리를 gradle에 추가해야 한다.
  • 스프링부트 3.0 이상
    jakarta.inject:jakarta.inject-api:2.0.1 라이브러리를 gradle에 추가해야 한다.
@Autowired
private Provider<PrototypeBean> provider;
    public int logic() {
      	PrototypeBean prototypeBean = provider.get();
      	prototypeBean.addCount();
      	int count = prototypeBean.getCount();
    	return count;
	}
}

웹 스코프

request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다.
session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다.
application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프이다.
websocket: 웹소켓과 동일한 생명주기를 가지는 스코프


스코프와 Provider


스코프와 프록시

0개의 댓글