spring

스프링 스터디_마지막

조쿼카 2022. 2. 24. 19:12

빈 스코프

-스코프 : 빈이 존재할 수 있는 범위

 

-스프링은 다음의 다양한 스코프를 지원

1. 싱글톤 2. 프로토타입 3. 웹 관련 스코프 (request, session, application)

 

 

-빈 스코프 지정 방법

1. 컴포넌트 스캔 자동 등록

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

2. 수동 등록

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

 

 

프로토타입 스코프

-프로토타입 스코프를 스프링 컨테이너에 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환함

 

-싱글톤 빈 요청

1. 싱글톤 스코프의 빈을 스프링 컨테이너에 요청

2. 스프링 컨테이너는 본인이 관리하는 스프링 빈을 반환

3. 이후 스프링 컨테이너에 같은 요청이 와도 같은 객체 인스턴스의 스프링 빈을 반환

 

-프로토타입 빈 요청

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

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

 

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

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

 

※ 스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지만 처리한다!

 

 

프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점

- 스프링은 일반적으로 싱글톤 빈을 사용하므로 싱글톤 빈이 프로토타입 빈을 사용하게 된다. 

그런데 싱글톤 빈은 생성 시점에만 의존관계 주입을 받기 때문에, 프로토타입 빈이 새로 생성되기는 하지만

싱글톤 빈과 함께 유지되는 것이 문제 !!

=> 우리가 원하는 건 사용할 때마다 새로 생성되는 것

 

프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결

1. 싱글톤 빈이 프로토타입을 사용할 때 마다 스프링 컨테이너에 새로 요청

2. ObjectFactory, ObjectProvider

- 지정한 빈을 컨테이너에 대신 찾아주는 DL 서비스를 제공하는 것

3. javax.inject.Provider라는 JSR-330 자바 표준을 사용

 

 

웹 스코프

-웹 환경에서만 동작

-프로토타입과는 다르게 스프링이 해당 스코프의 종료시점까지 관리 = 종료 메서드가 호출됨

-종류

1. request

2. session

3. application

4. websocket

 

request 스코프 예제

-> 오류 발생 : 이유 - 스프링 애플리케이션을 실행하는 시점에 싱글톤 빈은 생성해서 주입이 가능하지만, 

request 스코프 빈은 아직 생성되지 않는다. 실제 고객의 요청이 와야 생성할 수 있음!

 

 

-위의 해결방안:

스코프와 Provider

-ObjectProvider 사용 : ObjectProvider.getObjcet()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있음

-ObjcetProvider.getObjcet()를 호출하는 시점에는 HTTP 요청이 진행중이어서 request scope빈의 생성이 정상 처리됨

 

스코프와 프록시

-코드를 더 줄이는 방법

 

-프록시 방법

- proxyMode = ScopedProxyMode.TARGET_CLASS 추가 (클래스면 TARGET_CLASS, 인터페이스면 INTERFACES)

@Component
  @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
  public class MyLogger {
  }

 

'spring' 카테고리의 다른 글

스프링 스터디 6주차  (0) 2022.02.17
스프링 스터디 5주차  (0) 2022.02.10
스프링 스터디 4주차  (0) 2022.02.03
스프링 스터디 3주차  (0) 2022.01.27
스프링 2주차 스터디  (0) 2022.01.20