Published 2022. 1. 14. 08:34
반응형

빈 스코프란?


보통은 싱글톤 빈을 사용하게 된다. 싱글톤 빈은 스프링 컨테이너의 시작 → 종료까지 유지되는 스코프를 가졌다.
스코프라는 것은 빈이 살아있는 범위를 의미한다.

빈 스코프의 종류


  • 싱글톤
    → 기본 스코프, 스프링 컨테이너 시작 → 끝
  • 프로토타입
    → 의존 관계 주입까지 살아있음. 매번 새로운 객체를 생성한다.
    → 싱글톤 빈은 스프링 컨테이너 생성 시점에 초기화 메서드가 실행되지만
    프로토타입은 빈 조회(ac.getBean)할 때 초기화 메서드가 실행이 된다.
    즉, ac.getBean()을 할 때 의존관계 주입이 일어난다.
    → 스프링 컨테이너가 종료될 때 종료 메서드가 호출되지 않는다.
    호출하려면, 조회한 빈에서 직접 호출해주어야 한다.
  • 웹 스코프
    • request : 웹 요청이 들어오고 나갈 때 까지
    • session : 웹 세션이 생성되고 종료될 때 까지
    • applicaiont : 웹의 서블릿 컨텍스트와 같은 범위 ???????

프로토 타입

프로토 타입의 범위를 확인 해보자.

class PrototypeTest {

    @Test
    void prototypeBeanFind() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);

        PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); // 이 시점에 초기화 메서드 호출
        PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); // 이 시점에 초기화 메서드 호출

        assertThat(prototypeBean1).isNotSameAs(prototypeBean2);

        ac.close(); // 종료 메서드 호출되지 않음.
        // 이렇게 직접 종료 해주어야 함. 즉, 스프링 컨테이너의 영역을 벗어난 것.
        prototypeBean1.close();
        prototypeBean2.close();
    }

    @Scope("prototype")
    static class PrototypeBean {

        @PostConstruct
        public void init() {
            System.out.println("SingletonBean.init");
        }

        @PreDestroy
        public void close() {
            System.out.println("SingletonBean.close");
        }
    }
}
반응형
복사했습니다!