빈 스코프 란?
스프링 빈은 기본적으로 모든 bean을 싱글톤으로 생성하여 관리
종류
- singleton : 기본
- prototype : 어플리케이션 요청시 마다 스프링이 새 인스턴스 생성
- request : HTTP요청별로 인스턴스화 되어 요청이 끝나면 소멸(Spring MVC 용도)
- session: HTTP 세션별로 인스턴스화 되어 세션이 끝나면 소멸(Spring MVC 용도)
- global session : 포틀릿 기반의 웹어플리케이션 용도 , 전역세션 스코프의 빈은 같은 스프링 MVC를 사용한 포탈 어플리케이션 내의 모든 포틀릿 사이에 공유 가능(Spring MVC 용도)
- thread: 새 스레드 에서 요청하면 새로운 bean인스턴스를 생성, 같은 스레드에선 항상 같은 bean반환
- custom : org.springframework.beans.factory.config.Scope를 구현하고 커스텀 스코프를 스프링의 설정에 등록하여 사용
- 참고..
싱글톤 과 프로토타입 비교
싱글톤
- 싱글톤 빈은 스프링 컨테이너에서 한번 생성된다.( 컨테이너가 사라질때 빈도 사라짐.)
- ApplicationContext 초기 구동시 인스턴스 생성
- 생성된 하나의 인스턴스는 single beans cache에 저장, 해당 bean에 대한 요청과 참조가 있으면 캐시된 객체를 반환
- 명시적으로 지정하지 않으면 스프링 빈 스코프는 싱글톤
- xml 설정 : <bean id="..." ... scope="singleton"></bean>
- annotation 설정 : @Scope("singleton")
Single.java
@Component 어노테이션 선언시 스코프 지정을 하지 않았기 때문에 싱글톤으로 생성된다.
AppRunner.java
Single클래스로 생성된 빈의 클래스를 콘솔에 찍어본다.
싱글톤이기 때문에 동일한 결과값이 나올것으로 예상된다
결과
프로토타입
- 모든 요청에서 새로운 객체를 생성
- 의존성 관계의 빈에 주입될때 새로운 객체에 생성되어 주입
- 정상적인 gc에 의해 빈이 제거
- xml설정 : <bean id="..." ... scope="prototype"></bean>
- annotation 설정 : @Scope("prototype")
Proto.java
AppRunner.java
@Scope를 prototype으로 지정했기 때문에 호출할때마다 변경된 값이 나올것으로 보인다.
결과
싱글톤에서 프로토타입 호출
위에서 확인한 바와 같이 싱글톤으로 선언을 하면 동일한 결과값을 보여주고, 프로토타입으로 선언한경우에는 매번 호출할때마다 다른 값을 보여준다. 그렇다면 싱글톤 안에서 프로토타입을 호출한다면? 매번 다른값을 보여줄까?
Single.java
Single 클래스 내부에서 프로토타입을 주입받아 리턴 해주는 메소드를 추가해준다.
AppRunner.java
결과
프로토타입을 호출햇는데 결과값이 동일하다.
왜그럴까?
Proto클래스 자체는 prototype으로 지정했지만 실제 proto를 멤버변수로 포함하고 있는 Single은 이미 최초 초기화시에 proto를 주입 받습니다. 따라서 single 내부에 있는 proto가 새로 생성되는 일은 없습니다.
Proxymode 사용하여 해결
Proto.java
proxy모드를 추가
결과
결과값이 달라진걸 확인
위그림과 같이 proxyMode Proto타입을 참조하는 객체가 직접 Proto객체를 참조하는 것이 아닌 프록시로 감싼 프록시 인스턴스를 참조 하게 됨.
참고자료
https://www.inflearn.com/course/spring-framework_core
https://gmlwjd9405.github.io/2018/11/10/spring-beans.html
https://galid1.tistory.com/513?category=769011
https://javaslave.tistory.com/45
https://engkimbs.tistory.com/698
'프로그래밍 > SPRING' 카테고리의 다른 글
[스프링기본 : IoC 컨테이너] Environment - Property (0) | 2019.10.10 |
---|---|
[스프링기본 : IoC 컨테이너] Environment - Profile (0) | 2019.10.10 |
[스프링 기본 : IoC 컨테이너] @Component 와 컴포넌트 스캔 (0) | 2019.10.06 |
[스프링 기본 : IoC 컨테이너] @Autowired (0) | 2019.10.06 |
[스프링 기본 : IoC 컨테이너] Application Context와 빈 설정 방법 (0) | 2019.10.06 |
댓글