본문 바로가기
프로그래밍/SPRING

[스프링 기본 : IoC 컨테이너]빈 스코프

by hyunleeM 2019. 10. 6.

빈 스코프 란?

스프링 빈은 기본적으로 모든 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")

https://gmlwjd9405.github.io/2018/11/10/spring-beans.html

Single.java

@Component 어노테이션 선언시 스코프 지정을 하지 않았기 때문에 싱글톤으로 생성된다.

AppRunner.java

Single클래스로 생성된 빈의 클래스를 콘솔에 찍어본다.

싱글톤이기 때문에 동일한 결과값이 나올것으로 예상된다

결과

프로토타입

  • 모든 요청에서 새로운 객체를 생성
    • 의존성 관계의 빈에 주입될때 새로운 객체에 생성되어 주입
    • 정상적인 gc에 의해 빈이 제거
    • xml설정 : <bean id="..." ... scope="prototype"></bean>
    • annotation 설정 : @Scope("prototype")

https://gmlwjd9405.github.io/2018/11/10/spring-beans.html

Proto.java

AppRunner.java

@Scope를 prototype으로 지정했기 때문에 호출할때마다 변경된 값이 나올것으로 보인다.

결과

싱글톤에서 프로토타입 호출

위에서 확인한 바와 같이 싱글톤으로 선언을 하면 동일한 결과값을 보여주고, 프로토타입으로 선언한경우에는 매번 호출할때마다 다른 값을 보여준다. 그렇다면 싱글톤 안에서 프로토타입을 호출한다면? 매번 다른값을 보여줄까?

 

Single.java

Single 클래스 내부에서 프로토타입을 주입받아 리턴 해주는 메소드를 추가해준다.

 

AppRunner.java

결과

프로토타입을 호출햇는데  결과값이 동일하다.

왜그럴까?

https://galid1.tistory.com/513?category=769011

Proto클래스 자체는 prototype으로 지정했지만 실제 proto를 멤버변수로 포함하고 있는 Single은 이미 최초 초기화시에 proto를 주입 받습니다. 따라서 single 내부에 있는 proto가 새로 생성되는 일은 없습니다.

 

Proxymode 사용하여 해결

Proto.java

proxy모드를 추가 

결과

결과값이 달라진걸 확인

프록시

https://engkimbs.tistory.com/698

위그림과 같이 proxyMode Proto타입을 참조하는 객체가 직접 Proto객체를 참조하는 것이 아닌 프록시로 감싼 프록시 인스턴스를 참조 하게 됨.

 

 

참고자료

https://www.inflearn.com/course/spring-framework_core

 

스프링 프레임워크 핵심 기술 - 인프런

이번 강좌는 스프링 부트를 사용하며 스프링 핵심 기술을 학습합니다 따라서 스프링 부트 기반의 프로젝트를 사용하고 있는 개발자 또는 학생에게 유용한 스프링 강좌입니다. 초급 웹 개발 Java Spring 온라인 강의

www.inflearn.com

https://gmlwjd9405.github.io/2018/11/10/spring-beans.html

 

[Spring] Spring Bean의 개념과 Bean Scope 종류 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://galid1.tistory.com/513?category=769011

 

Spring - IoC 컨테이너의 기능 - 1 (Bean의 Scope)

이번 시간에는 Bean의 Scope에 대해 자세히 알아보도록 하겠습니다 이번 시간에는 Bean의 Scope 에 대해 자세히 알아보도록 하겠습니다. AOP, MVC를 포스팅하다가 갑자기 왜 다시 IoC 컨테이너에 관련해서 포스팅..

galid1.tistory.com

https://javaslave.tistory.com/45

 

Spring Bean Scope 정리

Spring Bean Scope 스프링에서 Bean으로 지정된 객체는 기본적으로 싱글톤 객체로 관리된다. 하지만 요구사항 과 구현기능 등의 필요에 따라서 비싱글톤이 필요한 경우도 많다. 스프링에서는 이를 명시적으로 구분..

javaslave.tistory.com

https://engkimbs.tistory.com/698

 

[Spring] 스프링 프록시 설정을 이용하여 프로토타입 빈 업데이트하기(Spring Proxy Configuration)

| 스프링 빈 스코프 설정 (Spring Bean Scope Configuration) 스프링 빈(Spring Bean)은 생존주기를 가지고 있으며 또한 스프링 컨테이너에서 관리하는 스프링 빈이 어떤 범위로 관리될 것인지를 설정할 수 있다...

engkimbs.tistory.com

 

댓글