1. 빈 스코프
빈 스코프에 대해서 알아보겠습니다.
우선 스프링 빈은 많이 들어봤겠지만 스코프는 생소하실 수 있습니다.
스코프는 범위라는 뜻으로 빈 스코프는 빈이 존재할 수 있는 범위를 뜻합니다.
이전 글에 적었던 @PostConstruct, @PreDestroy 글 2024.09.07 - [Spring/Spring] - [Spring] @PostConstruct, @PreDestroy 에서 설명했던 스프링 빈의 생명주기를 다시 보자면 이렇습니다.
스프링 빈의 생명주기
- 스프링 컨테이너 생성
- 스프링 빈 생성
- 의존관계 주입
- 사용
- 스프링 종료
스프링의 스코프 종류입니다.
- 싱글톤 : 기본 스코프로 스프링 컨테이너와 똑같이 시작과 종료를 함께 하는 가장 넓은 범위의 스코프입니다.
- 프로토타입 : 프로토타입 빈을 생성하면 스프링 컨테이너가 빈의 생성부터 의존관계 주입까지만 관여하게 되는 짧은 범위의 스코프 입니다. (프로토타입 : 무언가 제품을 만드는 과정에서 시험용으로 미리 만들어보는 물건)
생명 주기로 비교해보면
싱글톤 스코프는 1번 ~ 5번까지 함께하고
프로토타입 스코프는 2번~3번 + 초기화까지만 함께합니다.
2. 프로토타입 스코프
싱글톤 스코프 : 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다.
프로토타입 스코프 : 빈을 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 반환한다.
프로토타입 스코프
1. 프로토타입 스코프의 빈을 스프링 컨테이너에 요청
2. 스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입
3. 스프링 컨테이너는 생성한 프로토타입 빈을 클라이언트에 반환
4. 이후 스프링 컨테이너에 같은 요청이 들어오면 항상 새로운 프로토타입 빈을 생성해서 반환
** 위에도 말했듯이 프로토타입 스코프는 2번까지만 관여하기 때문에 스프링 컨테이너가 프로토타입 빈을 생성하고 의존관계를 주입하고 초기화까지 했다면 이후의 책임은 클라이언트한테 있다. 스프링 컨테이너가 프로토타입 빈을 더 이상 관리하지 않는다. @PreDestroy 종료 메서드 호출 불가**
public class PrototypeTest{
@Test
void prototypeBeanFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);
System.out.println("find prototypebean1");
PrototypeBean bean1 = ac.getBean(PrototypeBean.class);
System.out.println("find prototypebean2");
PrototypeBean bean2 = ac.getBean(PrototypeBean.class);
System.out.println("bean1 = " + bean1);
System.out.println("bean2 = " + bean2);
Assertions.assertThat(bean1).isNotSameAs(bean2);
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");
}
}
}
코드를 통해 본 프로토타입 스코프의 특징을 다시 한 번 보겠습니다.
- 프로토타입 스코프는 빈의 생명주기에 있어서 빈의 스프링 빈 생성, 의존관계 주입 단계, 초기화만 함께 한다.
- 실행 결과를 보았을 때 스프링 컨테이너에서 빈을 조회할 때 생성되고, init 메서드를 통해 초기화 메서드도 생성된다.
- 스프링 컨테이너에 요청할 때마다 새로 생성된다. (항상 다른 인스턴스)
- 스프링 빈을 클라이언트에 준 뒤 더는 관여하지 않기 때문에 종료 메서드 @PreDestroy가 실행되지 않는다.
싱글톤 스코프
public class SingletonTest {
@Test
void singletonBeanFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class);
SingletonBean bean1 = ac.getBean(SingletonBean.class);
SingletonBean bean2 = ac.getBean(SingletonBean.class);
System.out.println("bean1 = " + bean1);
System.out.println("bean2 = " + bean2);
Assertions.assertThat(bean1).isSameAs(bean2);
ac.close();
}
@Scope("singleton") //singleton이 default이므로 굳이 안 써도 된다.
static class SingletonBean {
@PostConstruct
public void init() {
System.out.println("SingletonBean.init");
}
@PreDestroy
public void destroy() {
System.out.println("SingletonBean.destroy");
}
}
}
코드를 통해 본 싱글톤 스코프 특징을 보겠습니다.
- 프로토타입 스코프와 달리 스프링 컨테이너 생성 시점에 초기화 메서드 (init 메서드)가 실행됩니다.
- 싱글톤이라는 이름답게 항상 같은 객체를 공유합니다.
- 스프링 빈의 생명주기를 끝까지 함께하기 때문에 @PreDestroy 종료 메서드가 호출됩니다.
출처 : 인프런 - 스프링 핵심 원리 (기본편)
'Spring > Spring' 카테고리의 다른 글
[Spring] 서블릿 알아보기 (@WebServlet,getParameter, getParameterValues) (0) | 2024.09.20 |
---|---|
[Spring] 웹 서버, 웹 애플리케이션 서버 (0) | 2024.09.15 |
[Spring] @PostConstruct, @PreDestroy (1) | 2024.09.07 |
[Spring] 롬복 알아보기 (@RequiredArgsConstructor) (0) | 2024.09.04 |
[Spring] 의존관계 주입 방법 (0) | 2024.09.03 |