본문 바로가기
자바의 봄(Spring)/자바와 스프링 공부하기

스프링 핵심 원리(8/8) - 기본편 빈 스코프

by 종안이 2023. 1. 26.

1월 25일 수요일 - 스프링 핵심 원리(8/8) - 기본편 빈 스코프

1. 빈 스코프 - 빈이 존재할 수 있는 범위를 뜻한다.

  1. 싱글톤 스코프 - 스프링 컨테이너의 시작과 종료까지 유지되는 스코프
  2. 프로토타입 스코프 - 스프링 컨테이너는 프로토 타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다
  3. 웹 관련 스코프
  • 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와 상관 없이 가짜 프록시 클래스를 다른 빈에 주입할 수 있다.

댓글