DevBoi

[Spring] bean scope , 싱글톤과 프로토 타입 빈 본문

Develop/[Spring]

[Spring] bean scope , 싱글톤과 프로토 타입 빈

HiSmith 2022. 12. 15. 17:17
반응형

Spring bean scope

Spring bean scope 가 뭔말이지? 싱글 턴 다 똑같은거 아닌가?

스프링에서는 빈을 싱글턴이나 여러개의 방식으로 사용할 수 있도록 설정을 제공해준다.

한번 해보면서 확인해보자

  1. SingleTon
  2. Prototype
  3. WebScope3-2. session3-4. websocket
  4. 3-3. application
  5. 3-1. request

이런 계층 형으로 분류가 되어있다.

사실 웹 스코프 위주로 볼 것이다. 싱글 톤이랑 프로토 타입은 많이 써봐서…ㅎ

  1. SingleTon

싱글톤 스코프 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 빈을 반환한다.

 

2.프로토타입 스코프

 

프로토 타입 스코프의 빈을 조회하면, 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다.

프로토타입의 빈을 스프링 컨테이너에 요청하면 스프링 컨테이너는 프로토 타입의 빈을 생성하고, 필요한 의존관계를 주입한다.

싱글톤 빈은 컨테이너 생성 시점에 같이 생성되고 초기화 되지만, 프로토타입 빈은 스프링 컨테이너에서 빈을 조회 할때 생성되고 초기화 메서드도 실행된다.

 

스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지하고 클라이언트에게 빈을 반환한다.

이후 생성된 프로토타입 빈을 관리하지 않는다.

따라서 빈 관리는 클라이언트에게 있다.

따라서 빈이 종료될떄 호출되는 메서드가 동작하지 않는다.

 

 

싱글톤 빈과 프로토타입 빈을 같이 사용하면 문제점이 발생한다.

 

1.싱글톤 빈이 프로토 타입빈을 포함한다고 생각해보자.

2.싱글톤 생성 될때 프로토타입 빈의 의존성을 주입 받기 위해 스프링 컨테이너에게 빈을 요청한다.

3.프로토타입빈의 count를 증가시키는 로직을 했을때, 해당 count 값을 증가시키고 값을 요청한다.

4.새로운 사용자가 해당 동일 싱글톤 빈을 요청하면, 기존의 빈이 반환되기 때문에 안의 프로토타입빈의 값이 1증가된 2를 받게 된다.

즉, 요청마다 새로 생성되는것이 아니라. 싱글톤이랑 같이 하게되면 그 빈을 그대로 돌려받는다.

5. 따라서, 싱글톤 빈과 함꼐 계속 유지된다.

 

즉 이와 같이 싱글톤 빈에서 프로토 타입 빈을 같이 사용하려고하면? 어떻게 해야할까

즉 프로토 타입빈의 원래 목적인 요청 별로 신규로 생성, 싱글톤의 영향없이 사용하려면 어떻게 해야할까?

 

1. 싱글톤빈이 사용할떄마다 프로토 타입 빈인 경우 컨테이너에게 새로 요청하는 것이다.

 

이런식으로 ObjectProvider를 사용하게 되면,

해당 프로바이더가 대신 DL을 해주는 서비스를 제공해주게 된다.

즉 해당 프로바이더가 스프링 컨테이너를 통해 해당 빈을 찾아서 반환하게 해준다.

mock코드를 짜기도 간편해진다.

 

 

다음에는 웹 스코프에 대해서 공부를 해보도록 하자!

사실 웹 스코프가 공부의 주였어서 이건 직접 실습을 해보면서 진행을 해보자 

반응형