Java/Spring

Spring Gradle 09. 빈 스코프

shin96bc 2022. 6. 15. 21:36

(10) 빈 스코프
     1) 빈 스코프란?
         <1> 스프링 빈은 기본적으로 싱글톤 스코프로 생성되기 때문에 아무 설정도 안하면, 스프링의 빈이 

                스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다.
         <2> 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다.
         <3> 스프링은 다양한 스코프를 지원한다.
             1> 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.
             2> 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 

                  관리하지 않는 매우 짧은 범위의 스코프이다.
             3> 웹( WEB ) 관련 스코프
                 1. request: 웹 요청이 들어오고 나갈때까지 유지되는 스코프이다.
                 2. session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다.
                 3. application: 웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프이다.

             4> 빈 스코프의 지정 방법
                 1. 컴포넌트 스캔 자동 등록
                     ex) 

@Scope("prototype")
@Component
public class HelloBean {}

                 2. 수동 등록
                     ex) 

@Scope("prototype")
@Bean
PrototypeBean HelloBean() {
	return new HelloBean
}



     2) 싱클톤 스코프
         <1> 싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다. 
         <2> 싱글톤의 빈 요청
             1> 싱클톤 스코프의 빈을 스프링 컨테이너에 요청한다.
             2> 스프링 컨테이너는 본인이 관리하는 스프링 빈을 반환한다.
             3> 이후에 스프링 컨테이너에 같은 요청이 와도 같은 객체 인스턴스의 스프링 빈을 반환한다.
             4> 스프링 컨테이너가 관리한다.


     2) 프로토타입 스코프
         <1> 프로토타입 스코프는 스프링 컨테이너에 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 

                반환한다.
         <2> 프로토타입의 빈 요청1
             1> 프로토타입 스코프의 빈을 스프링 컨테이너에 요청한다.
             2> 스프링 컨테이너는 이 시점에 프로토타입 빈을 생성하고, 필요한 의존관계를 주입한다.
             3> 스프링 컨테이너는 생성한 프로토타입 빈을 클라이언트에 반환한다.
             4> 이후에 스프링 컨테이너에 같은 요청이 오면 항상 새로운 프로토타입 빈을 생성해서 반환한다.
             5> 스프링 컨테이너가 괸리하지 않는다.
         <3> 정리
             1> 여기서 핵심은 '스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지만

                  처리한다'는 것이다.
             2> 클라이언트에 빈을 반환하고 이후 스프링 컨테이너는 생성된 프로토타입 빈을 관리하지 않는다.
             3> 프로토타입 빈을 관리할 책임은 프로토타입 빈을 받은 클라이언트에 있다. '그래서 @PreDestory 

                  같은 메서드가 호출되지않는다'.


             ex) 

@Scope("prototype")
static class PrototypeBean {}


             4> 싱글톤 빈은 스프링 컨테이너 생성 시점에 초기화 메서드가 실행되지만, 프로토타입 스코프의 

                  빈은 스프링 컨테이너에서 빈을 조회할 때 생성되고, 초기화 메서드도 실행된다.
             5> 프로토타입 빈을 2번 조회 했으므로 완전히 다른 스프링 빈이 생성되고, 초기화도 2번 실행된 

                  것을 확인할 수 있다.
             6> 싱글톤 빈은 스프링 컨테이너가 관리하기 때문에 스프링 컨테이너가 종료될 때 빈의 

                  종료 메서드가 실행되지만, 프로토타입 빈은 스프링 컨테이너가 생성과 의존관계 주입 그리고

                  초기화 까지만 관여하고, 더는 관여하지 않는다.
             7> 따라서 프로토타입 빈은 스프링 컨테이너가 종료될 때 @PreDestory 같은 종료 메서드가 전혀 

                  실행되지 않는다.

         <4> 프로토타입 빈의 특징 
             1> 스프링 컨테이너에 요청할 때 마다 새로 생성된다.
             2> 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입 그리고 초기화까지만 관여한다.
             3> 종료 메서드가 호출되지 않는다.
             4> 그래서 프로토타입 빈은 프로토타입 빈을 조회한 클라이언트가 관리해야 한다.
             5> 종료 메서드에 대한 호출도 클라이언트가 직접 해야한다.

 

 

 

참고자료:

인프런 -> 김영한 스프링 핵심원리 - 기본편

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

'Java > Spring' 카테고리의 다른 글

Spring Gradle 08. 빈 생명주기 콜백  (0) 2022.06.15
Spring Gradle 07. 다양한 의존관계 주입 방법  (0) 2022.06.15
[Spring] Maven 세팅하기  (0) 2022.06.15