본문 바로가기

Spring/Core

Spring Core - bean 의 스코프

Contents

  • bean의 스코프 종류

  • proxyMode?

  • singleton 의 주의사항

 

 

빈의 스코프

빈에는 스코프라는게 있다.

 

스코프의 종류

  • 싱글톤
  • 프로토타입
    • Request
    • Session
    • WebSocket

빈의 default는 싱글톤이다.

 

싱글톤 - 해당 빈의 인스턴스가 오직 1개 뿐이다.

프로토 - 새로운 인스턴스를 계속 만들어서 사용하는 스코프

 

프로토타입의 객체를 찍어보면 계속 다른 객체가 나온다.

 

 

*주의할점

ProtoType 의 객체에서 싱글톤 객체를 참조할때는 아무런 문제 없다.

이런 경우엔 문제가 없다.

하지만, 반대의 경우엔?

싱글톤 객체에서 프로토타입 객체를 부른경우

이 경우엔 문제가 있을 수 있다.

최초 한번만 만드는 객체라 안에있는 proto가 계속 동일한 객체를 가지게 된다.

 

이 문제를 해결하기 위한 방법으로는 proxyMode 를 쓸 수 있다.

기본값으로는 ScopedProxyMode.Default 로 사용하지 않고 있다가 TARGET_CLASS 로 변경 했다.

 

proxyMode 

proxy를 쓴다는건 

이 Proto 클래스를 proxy로 감싸라 라는 것 (위와 같은 경우엔 CLASS 기반의 proxy로 감싸라)

 

왜 proxy로 감싸야 하나?

저 Single 클래스가 Proto 를 직접 참조하면 안되기 때문이다.

Proxy를 거쳐서 쓰게 하기위해 사용한 거라고 할 수 있다.

직접쓰면 매번 새로운 객체로 바꿔 줄 수가 없다

 

이 proxy 패턴은 뒤에 AOP 에서 좀 더 상세하게 보도록 하자.

 

 

싱글톤 사용시 주의 사항

 

클래스 안에 필드 값이 있다면 

ex) int value = 0;

이건 스레드 세이프 하지 않기 때문에

멀티 스레드 환경에서 값이 보장 되지 않는다.

지역 변수로 쓰거나 해서 값을 스레드 세이프 하게 보장해야 된다.