[본 포스팅은 인프런 스프링 핵심 원리 - 기본 편을 기반으로 작성하였습니다.]
빈 스코프란?
지금까지 우리는 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때까지 유지된다고 학습했다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다.
빈 스코프 종류
- 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.
- 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.
- 웹 관련 스코프
- request: 웹 요청이 들어오고 나갈 때까지 유지되는 스코프이다.
- session: 웹 세션이 생성되고 종료될 때까지 유지되는 스코프이다.
- application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프이다.
싱글톤 스코프
- 스프링에서 사용하는 빈의 스코프를 조회하면 싱글톤 스코프이다.
객체는 하나이고 여러 클라이언트가 공유하며 사용한다.
프로토타입 스코프
- 프로토타입 스코프는 클라이언트가 스프링 컨테이너를 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다.
1. 프로토타입 스코프의 빈을 스프링 컨테이너에 요청한다.
2. 스프링 컨테이너는 이 시점에 프로토타입 빈을 생성하고, 필요한 의존 관계를 주입한다.
3. 스프링 컨테이너는 생성한 프로토타입 빈을 클라이언트에 반환한다.
4. 이후에 스프링 컨테이너에 같은 요청이 오면 항상 새로운 프로토타입 빈을 생성해서 반환한다.
프로토타입 스코프 사용법
public class PrototypeTest {
@Test
void prototypeBeanFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(prototypeBean.class);
System.out.println("find prototypeBean1");
prototypeBean prototypeBean1 = ac.getBean(prototypeBean.class);
System.out.println("find prototypeBean2");
prototypeBean prototypeBean2 = ac.getBean(prototypeBean.class);
System.out.println("prototypeBean1 = " + prototypeBean1);
System.out.println("prototypeBean2 = " + prototypeBean2);
Assertions.assertThat(prototypeBean1).isNotSameAs(prototypeBean2);
ac.close();
}
@Scope("prototype")
static class prototypeBean {
@PostConstruct
public void init() {
System.out.println("prototypeBean.init");
}
@PreDestroy
public void destroy() {
System.out.println("prototypeBean.destroy");
}
}
}
사용방법은 @Scope("prototype")이라고 붙여주면 프로토타입 스코프로 설정이 된다.
그리고 실행시켜보면 위에서 말했던 것처럼 싱글톤과 다르게 서로 다른 객체를 갖게 된다.
또한
- 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.
프로토타입 스코프의 성질 때문에 전체 실행 결과를 보면
destroy()에 @PreDestroy 어노테이션이 붙었음에도 실행되지 않는 것을 볼 수 있다.
'JAVA > Spring' 카테고리의 다른 글
[Spring] Bean Validation이란? / 사용해보기 (0) | 2022.09.19 |
---|---|
[Spring] MVC 패턴의 개요 (feat. 사용 예시) (0) | 2022.09.07 |
[Spring] 롬복(Lombok) 설치 및 간단하게 사용 (feat. 최신 트렌드) (0) | 2022.09.02 |
[Spring] 스프링 컨테이너가 싱글톤을 보장해주는 이유 (0) | 2022.09.01 |
[Spring] 스프링 컨테이너를 사용해야 하는 이유 (싱글톤 패턴의 문제점 해결) 그리고 주의점 (0) | 2022.09.01 |