공부기록

[토비의 스프링] 스프링이 대부분의 객체를 singleton으로 제공해주는 이유 본문

Spring

[토비의 스프링] 스프링이 대부분의 객체를 singleton으로 제공해주는 이유

gracelove91 2019. 7. 26. 15:16
반응형

스프링이 제공하는 객체의 스코프.


  • Bean(스프링이 관리하는 오브젝트)이 생성되고, 존재하고 적용되는 범위? 이것을 Beanscope라 부른다.
  • 기본적으로 빈의 스코프는 싱글톤스코프다.
  • 싱글톤스코프는 컨테이너 내에 한 개의 오브젝트만 만들어져서 강제로 제거하지 않는 한, 컨테이너가 살아있는 한 계속 유지된다.

 

 

왜 singleton으로 제공하는가?


일단 스프링은 자바엔터프라이즈개발을 위한 프레임워크다. 이 말인 즉슨, 사용자가 많다는 얘기. 그 많은 사용자가 요청할 때마다 새로운 객체를 생성해서 제공하는 것은 비용이 크기 때문에 기본적으로 싱글톤으로 객체의 갯수를 제한한다.

  • 스프링컨테이너는 싱글톤관리 컨테이너이기도 하다! 평범한 자바 클래스를 싱글톤으로 활용하게 해준다는 뜻. 싱글톤 레지스트리 덕분에 싱글톤으로 사용될 클래스라도 public 생성자를 가질 수 있다.
  • 고전적인 싱글톤패턴과 달리, 객체지향적인 설계 방식과 원칙, 디자인 패턴(물론 싱글톤패턴은 제외) 등을 적용하는데 제약이 없다!
  • 스프링은 IoC컨테이너일 뿐아니라, 싱글톤패턴을 대신해서 싱글톤을 생성하고 관리해주는 싱글톤 레지스트리라는 점 기억해둘 것.
  • 빈을 싱글톤으로 만드는 것은 결국 오브젝트의 생성방법을 제어하는 IoC컨테이너로서의 역할.

 

 

싱글톤이기 때문에 주의해야할 점


stateless(무상태)방식으로 만들어라.

  • 읽기전용 값이라면 초기화시점에서 iv에 저장해두고 공유하는 것은 문제가 없지만,
    다중 사용자의 요청을 한꺼번에 처리하는 쓰레드들이 동시에 iv를 건드리는 것은 위험하다.
    따라서 stateless방식으로 만들어져야한다.
  • 파라미터, 로컬변수, 리턴값 등을 이용해, 각각의 값을 iv처럼 공유되는 영역이 아닌, 독립적인 영역에 저장하자.

 

 

싱글톤 스코프 외 스코프.


프로토타입 스코프

  • 싱글톤스코프와는 다르게 컨테이너에 빈을 요청할 때마다 매번 새로운 오브젝트만든다.

리퀘스트 스코프

  • 웹을 통해 새로운 HTTP 요청이 생길때마다 생성된다.

싱글톤 외 스코프는 10장에서 자세히 다룬다니 더 공부해봐야겠다..

반응형