본문 바로가기
Backend - Java Spring/Spring Core

[SpringCore 핵심원리] Bean 스코프

by VictorMeredith 2024. 2. 18.

1. 빈 스코프란 ? 

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

- 싱글톤 스코프 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프

- 프로토타입 스코프 : 스프링컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않음(초기화메서드까지만 함, 종료메서드가 호출이 안됨)

- 웹 관련 스코프

  : request : 요청이 들어오고 나갈 때까지 유지되는 스코프

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

  : application : 웹 서블릿 컨텍스트와 같은 범위로 유지되는 스코프

 

2. 빈스코프의 등록

- @Scope("prototype") 이렇게 하면됨

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

- 프로토타입인 경우 반환하고 관리안함.

- 프로토타입 스코프의 빈의 경우 @PreDestroy 가 호출이 되지 않는다.

- instance 가 다르다

- init만 호출되고 destroy는 호출되지 않는다.

 

3. 프로토타입과 싱글톤을 함께 사용 시 문제점

- 프로토타입빈과 싱글톤빈과 함께 사용 시 의도대로 동작하지 않음

- 처음에 의존관계 주입 때 싱글톤 빈에 주입받은 프로토타입빈은 그대로 끝나는거다. 스프링컨테이너의 관리대상이 아니게 된다

- 그래서 싱글톤빈에 무언가 요청할 때 주입받은 프로토타입빈은 처음에 주입받은 빈을 그대로 사용하기때문에 매번 생성하게 되는 의도랑은 전혀 관계 없게 된다.

addCount는 프로토타입빈 필드의 int를 증가시키는데, 싱글톤 빈에서 사용하는 경우 isEqualTo(2) 가 된다.

- 여기서는 ClientBean(싱글톤 빈)의 생성시점에 프로토타입빈이 주입된다. 그러고 관리가 끝난다.

- 싱글톤 빈에서 프로토타입 빈 사용 시 싱글톤 빈과 함께 프로토타입 빈이 유지되는 것이 문제다.

4. 사용할때마다 새로 생성하려면 ? Provider

- logic() 메서드에서 ac.getBean(PrototypeBean.class); 해서 가져오는것도 가능함 (프로토타입을 사용할 때마다 스프링컨테이너에 요청) -> Dependency Lookup(의존관계 조회) 라고 한다.

- DL을 대신해주는 것이 있다.

- ObjectFactory , ObjectProvider

- ObjectFactory 라고 해도 됨

- @Autowired는 왜저러는지 모름

되긴 됨

 

- 결론적으로 프로토타입빈을 사용하는 경우는 매우 드물다.

- ObjectProvider, JSR-330 의 표준 방법 등은 프로토타입 뿐만 아니라 DL이 필요한 경우에는 언제든지 사용이 가능하다.

 

댓글