빈 스코프란?
빈이 존재할 수 있는 범위를 뜻한다.
싱글톤
스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.
프로토타입
스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 범위의 스코프이다.
웹 관련 스코프
웹 환경에서만 동작하며, 빈의 생성부터 종료까지 관여한다.
1.
request : HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리된다.
2.
session : HTTP Session과 동일한 생명주기를 가지는 스코프이다.
3.
application : 서블릿 컨텍스트( ServletContext )와 동일한 생명주기를 가지는 스코프이다.
4.
websocket : 웹 소켓과 동일한 생명주기를 가지는 스코프이다.
빈 스코프 설정 방법
@Scope("scopeName")
@Bean
public MyBean myBean() {
// ...
}
Java
복사
위와 같이 @Scope 어노테이션으로 스코프를 설정하면 된다.
@Scope(value = "prototype")
@Bean
public MyBean myBean() {
// ...
}
Java
복사
위 처럼 prototype 으로 빈 스코프로 설정할 수 있다.
@RequestScope
@Bean
public MyBean myBean() {
// ...
}
@SessionScope
@Bean
public MyBean myBean() {
// ...
}
@ApplicationScope
@Bean
public MyBean myBean() {
// ...
}
Java
복사
request · session · application 스코프의 경우, 정의된 스코프 어노테이션이 있어서 위 처럼 사용하면 된다.
빈 요청
싱글톤
빈이 싱글톤인 경우, 요청이 올때마다 같은 객체 인스턴스의 빈을 반환한다.
프로토 타입
스코프가 프로토 타입인 경우, 클라이언트의 요청 시, DI를 통해 필요한 의존관계를 주입해 매번 새로운 빈을 생성해 반환한다.
빈의 생성하고, 반환까지만 컨테이너가 관여하며 빈의 소멸은 관리하지 않는다.
프로토타입 스코프의 빈은 스프링 컨테이너에서 더 이상 참조되지 않을 때 소멸한다.
이 때, 자바에서는 가비지 컬렉터가 해당 객체를 회수하는 것과 같은 원리로 동작한다.
@PostConstruct 와 @PreDestroy 어노테이션이 붙은 메서드는 빈이 생성되기 전 혹은 후에 정의한 메서드를 실행된다.
싱글톤 빈의 경우, 처음 초기화 되었을 때 1번 · 어플리케이션이 종료되었을 때 1번 호출된다.
프로토 타입 빈의 경우, 매번 빈을 생성할때 마다 @PostConstruct 메서드가 실행된다.
그리고, 반환 후에는 소멸에는 관여를 안하기 때문에, @PreDestroy 어노테이션이 붙은 메서드는 절대 실행되지 않는다.
웹 스코프
클라이언트의 request 요청 당 하나씩 생성되고, 요청이 끝나는 시점에 소멸된다.
프로토 타입 빈과 다른점이, 소멸까지 관리한다는 점이다.