김영한 스프링 9 빈 스코프
스프링 빈이 스프링 컨테이너랑 같이 띄어져 종료되기 까지의 생명주기를 배웠고
그 이유가 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문!
스코프의 종류
싱글톤 - 기본 스코프이며 스프링의 시작과 종료까지 유지되는 넓은 범위의 스코프
프로토타입 - 스프링컨테이너는 프로토타입 빈의 생성과 의존관꼐 주입까지만 관여하고 초기화까지만 해주는 다른 건 관여 x
짧은 범위의 스코프
(종료 메서드 호출이 안되고 여기서 끝)
웹 관련한 스코프
request - 고객 요청이 들어오고, response로 빠질 때 까지만의 범위를 가지는 스코프
session - 웹 세션이 생성되고 종료될 때 까지 유지하는 스코프
application - 웹의 서블릿 컨텍스트라는 개념( 긴 범위의 개념)때까지 유지되는 스코프
스코프 지정 방법
지금까지 싱글톤을 사용해서 알아봤으니 프로토 타입과 비교해서 알아보자
스프링 컨테이너의 기본인 싱글톤을 조회하면 항상 같은 인스턴스의 스프링 빈을 반환
그러나 프로토타입의 빈을 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해 반환한다!
클라이언트 a가 새로운 빈을 달라고 요청하면 그때 생성 및 DI 해주고 초기화 메서드 호출
그 이후 생성한 프로토타입의 빈을 클라이언트에게 반환하고 더 이상 관리하지 않는다 ( 주고 끝 !)
같은 요청이 또 온다면 같은 작업을 반복 ( 새로 생성해 반환 후 관리 하지 않는 주기)
실제로 만들어 보자
(여기서 예외적으로 singTonBean 클래스에 @Configuration 이나 @Bean 등의 에너테이션을 붙이지 않아도 new AnnotationConfigApplicationContext()에 SingleTonBean.class 를 넘기면 SingleTonBean 클래스가 자동으로 컴포넌트 스캔되어 등록된다 !
이는 AnnotationConfigApplicationContext가 클래스를 스캔하여 빈으로 등록하는 기능을 내부적으로 지원
SingletonBean 객체는 new AnnotationConfigApplicationContext(SingletonBean.class)를 호출할 때 생성되고,
AnnotationConfigApplicationContext는 스프링 컨텍스트를 생성하고 빈을 등록하는 클래스인데, 이 코드를 통해 SingletonBean 클래스의 인스턴스가 생성되고 스프링 컨텍스트에 등록)
파라미터로 넣어주면 자동으로 등록된다는 걸 알 수 있다.
다시 돌아와서
싱글톤인 지 비교 후 닫아주기는 테스트 통과 !
초기화 후 같은 빈 그리고 close 메서드까지 호출 완료
이번엔 프로토타입으로 Scope를 지정하고 테스트해보자!
ac.close()해도 소멸 메서드를 호출하지 않는다! 즉 만들고 주입하고 끝이다 ( 관리 안함)
만약 닫고 싶다면 수동으로 호출해줘야 한다! (클라이언트에서라던지 ,, 필요하다면..)
싱글톤 빈은 스프링 컨테이너가 생성 시점에서 빈을 생성하고 init을 호출하고 계속 같은 걸 쓰지만
프로토타입은 스프링 컨테이너가 생성 시가 아닌 조회시에 빈이 생성되고 초기화 메서드가 작동한다!
그래서 최고하도 두번되고 다른 빈 생성된 것!
프로토타입은 잘 안쓴다!