본문 바로가기

개발/Spring

[Spring]빈 스코프와 Provider

스프링 수업을 듣다가 빈 스코프(Scope)에 대해 공부했다. 기본적으로 스프링 컨테이너에 의해 주입되는 빈은 싱글톤의 스코프를 가지지만.. 예를들어 사용자가 호출할때마다 새롭게 호출되어야 하는 빈일 경우 @Scope("prototype") 으로 지정이 가능했다.

 

하지만 여기에서 문제가 생긴다. 해당 프로토타입 빈을 기존 싱글톤 빈 내에서 호출할 경우 객체의 스코프가 싱글톤으로 되어버린다.

 

이 문제를 해결하기 위해 스프링에서 제공하는 기능이 ObjectProvider 이다. 해당 클래스를 통해 의존할 빈을 찾는다 하여 DL(Dependency Lookup)이라 한다.

 

스프링 뿐만 아니라 자바로도 Provider를 통해 해당 기능을 지원한다. 다만 라이브러리를 가져와야 한다.

build.gradle에 추가
Provider로 감싼 후 get()을 통해 가져온다.

해당 클래스로 프로토타입으로 지정할 빈을 감싸주고 정상적으로 로직을 수행할때마다 get()을 통해 가져오므로, 새로운 객체가 전달된다.

 

그리고 바로 이어서 진행한 web의 request스코프에서도 Provider가 적용된다. 예를들어 사용자의 요청(request)가 있을 때 해당 요청의 url과 아이디를 로그로 볼 수 있도록 설정하고 서버를 구동시키면... request가 존재하지 않기 때문에 에러가 발생한다.

그럴 경우 Provider를 사용할 수 있다. 다만 매번 클래스마다 Provider를 선언하는것은 매우 번거로운 일이므로.. 스프링에서 Proxy를 통한 기능을 제공한다.

 

request스코프일 때 + 적용대상이 클래스일 때

위와 같이 proxy를 설정해주면 스프링은 가짜 프록시 객체를 만들어 두었다가 실제 요청이 있을때 정상적으로 동작한다.(해당 가짜 객체는 실제 클래스를 상속받아서 만들어졌기 때문)

'개발 > Spring' 카테고리의 다른 글

[Spring] Bean을 Collection으로 호출하기  (0) 2023.05.21
[Spring] Security 정리(1)  (0) 2022.05.15
[Spring]Lombok(롬복)  (0) 2022.03.13
[Spring]@ComponentScan  (0) 2022.03.12
[Spring]AOP(관점지향프로그래밍) 입문  (0) 2022.02.27