공식문서에 있는 내용을 해석해 이해해보자.
bean definition을 정하는 것은, bean definition에 의해 실제 객체가 생성되는 '조리법'을 정하는 것이다. bean definition이 '조리법'이라는 것은 중요하다. 왜냐하면 하나의 '조리법'에 의해 수 많은 객체들이 생성되는 방법을 정하는 것이기 때문이다.
bean definition에 의해 생성되는 객체에 포함되는 다양한 의존성과 설정값을 컨트롤 할 수 있고, 그 객체의 scope 또한 컨트롤 할 수 있다.
이런 방법은 강력하고 유연하다. 왜냐하면 객체의 scope을 자바 클래스 레벨이 아니라 설정을 통해 선택할 수 있다.
bean은 여러개의 scope중 하나로 배포되도록 정의될 수 있다. 스프링은 6개의 scope를 지원한다. 그 중 4개는 web-aware ApplicationContext를 사용할 때만 사용 가능하다. 또한 custom scope를 생성할 수 있다.
(기본값) Spring IoC 컨테이너 당 한 개의 bean definition을 한 개의 객체로 범위를 지정한다.
한 개의 bean definition을 여러개의 객체로 범위를 지정한다.
한 개의 bean definition을 단일 HTTP request로 범위를 지정한다.
즉, 각 HTTP 요청은 single bean definition의 뒤에서 만들어진(????) 자기 자신만의 bean 객체를 가지고 있다.
web-aware Spring ApplicationContext에서만 유효하다.
한 개의 bean definition을 HTTP session의 생명주기로 범위를 지정한다.
web-aware Spring ApplicationContext에서만 유효하다.
한 개의 bean definition을 ServletContext의 생명주기로 범위를 지정한다.
web-award Spring ApplicationContext에서만 유효하다.
한 개의 bean definition을 WebSocket의 생명주기로 범위를 지정한다.
web-award Spring ApplicationContext에서만 유효하다.
스프링 3.0부터 thread scope를 사용할 수 있다. 기본값은 아니다.
출처
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes
https://velog.io/@probsno/Bean-%EC%8A%A4%EC%BD%94%ED%94%84%EB%9E%80