카테고리 없음

김영한 스프링 9 빈 스코프

ernest45 2024. 1. 4. 20:20

 

 

스프링 빈이 스프링 컨테이너랑 같이 띄어져 종료되기 까지의 생명주기를 배웠고

그 이유가 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문! 

 

스코프의 종류

싱글톤 - 기본 스코프이며 스프링의 시작과 종료까지 유지되는 넓은 범위의 스코프

 

프로토타입 - 스프링컨테이너는 프로토타입 빈의 생성과 의존관꼐 주입까지만 관여하고 초기화까지만 해주는 다른 건 관여 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을 호출하고 계속 같은 걸 쓰지만

프로토타입은 스프링 컨테이너가 생성 시가 아닌 조회시에 빈이 생성되고 초기화 메서드가 작동한다!

그래서 최고하도 두번되고 다른 빈 생성된 것!

 

 

 

프로토타입은 잘 안쓴다!