티스토리 뷰

JAVA/Spring

Spring - 빈 스코프란?

realizers 2021. 4. 12. 22:47
728x90
반응형

빈(Bean)이란?

Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부릅니다.

우리가 자바에서 new 연산자로 어떠한 객체를 생성했을 때 그 객체는 빈이 아닙니다.

ApplicationContext.getBean()으로 얻을 수 있는 객체가 빈입니다. 

즉 Spring에서 빈은 ApplicationContext가 알고 있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고 있는 객체를 의미합니다.

 

빈(Bean)의 스코프

ㆍ싱클톤 - 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프입니다.

ㆍ프로토타입 - 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프입니다.

 

ㆍ웹 관련 스코프

   1. request - 웹의 요청이 들오어고 나갈때 까지 유지되는 스코프

   2. session - 웹의 세션이 생성되고 종료될 때 까지 유지되는 스코프

   3. application - 웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프

 

싱글톤 빈

ㆍ 싱글톤 빈은 클라이언트 A, B, C는 memberService를 요청해도 항상 같은 memberService를 반환한다.

 

 

결과 화면

bean1과 bean2를 출력해보면 같은 객체인 것을 확인해 볼 수 있습니다.

 

 

프로토타입 빈

ㆍ 1. 프로토타입 스코프 빈을 스프링 컨테이너에 요청

ㆍ 2. 스프링 컨테이너는 요청받은 시점에 프로토타입 빈을 생성하고, 필요한 의존관계를 주입

ㆍ 3. 스프링 컨테이너는 생성한 프로토타입 빈을 클라이언트에게 반환

ㆍ 4. 이후 스프링 컨테이너에 같은 요청이 들어오면 항상 새로운 프로토타입 빈을 생성해서 반환

* 정리 - 스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지만 처리합니다. 클라이언트 빈을 반환하고, 이후 스프링 컨테이너는 프로토타입 빈을 관리하지 않습니다. 프로토타입 빈을 관리할 책임은 프로토타입 빈을 받은 클라이언트에게 있습니다. 그래서 @PreDestory 같은 종료 메서드가 호출되지 않습니다.

 

 

결과 화면

@Scope를 prototype으로 설정을 한다면 요청을 할 때 마다 프로토타입 빈이 생성되는 것을 알 수 있습니다. 

또한 각각의 객체는 서로 다르며 @PreDestory를 애노테이션을 선언한 메서드는 호출이 안되는 것을 확인할 수 있습니다.

 

* 참고 @PreDestory를 선언한 메서드를 호출하고 싶다면 직접 선언을 하여 사용해야 합니다.

 

결과 화면

728x90
반응형