스프링 컨테이너가 관리하는 자바 객체
Bean은 POJO 기반 객체로, Spring IoC(Inversion of Control, 제어의 역전) 컨테이너에 의해 인스턴스화, 생성, 관리된다.
어노테이션(Annotation)인 @Bean을 사용하거나 설정 메타 데이터를 통해 일반 객체를 Bean으로 등록이 가능하다.
Bean Scope는 기본적으로 빈이 존재하는 범위를 뜻한다.
상황과 필요에 따라 Bean을 사용할 때
하나만 만들어야 할 수도 있고, 여러개가 필요할 때도 있고, 어떤 한 시점에서만 사용해야 할 수도 있다.
=> Scope를 설정해서 Bean의 사용 범위를 설정할 수 있다.
Bean의 객체는 기본적으로 singleton의 범위를 가지기 때문에 따로 scope을 지정하지 않을 경우 특정 타입의 Bean을 딱 하나만 만들고 모두 공유해서 사용한다.
singleton
하나의 Bean 정의에 대해서 Spring IoC Container 내에 단 하나의 객체만 존재한다.
prototype
하나의 Bean 정의에 대해서 다수의 객체가 존재할 수 있다.
request
하나의 Bean 정의에 대해서 하나의 HTTP request의 생명주기 안에 단 하나의 객체만 존재한다. 즉, 각각의 HTTP request는 자신만의 객체를 가진다.
session
하나의 Bean 정의에 대해서 하나의 HTTP Session의 생명주기 안에 단 하나의 객체만 존재한다.
global session
하나의 Bean 정의에 대해서 하나의 global HTTP Session의 생명주기 안에 단 하나의 객체만 존재한다. 일반적으로 portlet context 안에서 유효하다.
request, session, global session의 scope는 일반 spring 어플리케이션이 아닌 Spring MVC Web Application에서만 사용된다.
=> Web-aware Spring ApplicationContext 안에서만 유효하다.
📝 Scope은 Bean으로 등록하는 클래스에 @Scope 어노테이션으로 설정해줄 수 있다.
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Scope("prototype")
@Component
public class UserController {
}