You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[d06b992f...] requestscopebeancreate
[d06b992f...][http://localhost:8080/log-demo] controller test
[d06b992f...][http://localhost:8080/log-demo] service id = testId
[d06b992f...] requestscopebeanclose
결과
스프링 애플리케이션을 실행 시키면 오류가 발생한다. 메시지 마지막에 싱글톤이라는 단어가 나오고…스프링 애플리케이셔을 실행하는 시점에 싱글톤 빈은 생성해서 주입이 가능하지만, request 스코프 빈은 아직 생성되지 않는다. 이 빈은 실제 고객의 요청이 와야 생성할 수 있다.
[d06b992f...] requestscopebeancreate
[d06b992f...][http://localhost:8080/log-demo] controller test
[d06b992f...][http://localhost:8080/log-demo] service id = testId
[d06b992f...] requestscopebeanclose```
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
3️⃣프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점
addCount()를 호출하면서 count필트를 + 1한다.결과적으로 프로토타입 빈(x01)의 count는 1이 된다.
addCount()를 호출하면서 count 필드를 +1 한다.결과적으로 프로토타입 빈(x02)의 count는 1이 된다.
✅싱글톤 빈에서 프로토타입 빈 사용
clientBean이라는 싱글톤 빈이 의존관계 주입을 통해서 프로토타입 빈을 주입받아서 사용하는 예를 보자.clientBean은 싱글톤이므로, 보통 스프링 컨테이너 생성 시점에 함께 생성되고 의존관계 주입도 발생한다.이제 clientBean은 프로토타입 빈을 내부 필드에 보관한다 (정확히는 참조값을 보관한다.)
✅싱글톤에서 프로토타입 빈 사용 2
클라이언트 A는 clientBean을 스프링 컨테이너에 요청해서 받는다. 싱글톤이므로 항상 같은 clientBean이 반환된다.
✅싱글톤에서 프로토타입 빈 사용 3
그런데 싱글톤 빈은 생성시점에만 의존관계 주입을 받기 떄문에, 프로토타입 빈이 새로 생성되기는 하지만, 싱글톤 빈과 함께 계속 유지되는 것이 문제다….
원하는 것은 프로토타입 빈을 주입 시점에만 새로 생성하는게 아니라, 사용할 때 마다 새로 생성해서 사용하는 것을 원할 것이다.
예시)
clientA, clientB가 각각 의존관계 주입을 받으면 각각 다른 인스턴스의 프로토타입 빈을 주입 받는다.
clientA → prototypeBean@x01
clientB → prototypeBean@x02
4️⃣프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결
✅스프링 컨테이너에 요청
✅ObjectFactory, ObjectProvider
지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공하는 것이 바로 ObjectProvider이다. 참고로 과거에는
ObjectFactory가 있었는데, 여기에 편의 기능을 추가해서ObjectProvider가 만들어졌다.prototypeBeanProvider.get()을 통해서 프로토타입 빈이 생성되는 것을 확인할 수 있다.ObjectProvider의 getObject()를 호출하면 내부에서는 스프링 컨테이너를 통해 해당 빈을 찾아서 반환한다.(DL)✅JSR-330 Provider
마지막 방법 :
javax.inject.Provider라는 JSR-330 자바 표준을 사용하는 방법스프링 부트 3.0이상은
jakarta.inject.Provider사용한다.스프링 부트 3.0미만
스프링 부트 3.0이상
특징
5️⃣웹 스코프
✅웹 스코프의 특징
✅웹 스코프 종류
6️⃣request 스코프 예제 만들기
✅웹 스코프 전제조건
✅request 스코프 예제 개발
동시에 여러 HTTP 요청이 오면 정확히 어떤 요청이 남긴 로그인지 구분하기 어렵다.
이럴 때 사용하기 딱 좋은 것이 바로 request 스코프이다.
MyLogger
@PreDestroy를 통해서 빈이 소멸되는 시점에 메시지를 남긴다.7️⃣스코프와 Provider
http://localhost:8080/log-demo를 입력하자.8️⃣스코프와 프록시
✅프록시 방법 사용하기
proxtMode = ScopedProxyMode.TARGET_CLASS를 추가해주자.TARGET_CLASS를 선택INTERFACES를 선택이렇게 하면 MyLogger의 가짜 프록시 클래스를 만들어두고 HTTP request와 상관 없이 가짜 프록시 클래스를 다른 빈에 미리 주입해 둘 수 있다.
LogDemoControllerLogDemoService✅웹 스코프와 프록시 동작 원리
CGLIB라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입한다.
MyLogger클래스가 아니라MyLogger$✅가짜 프록시 객체는 요청이 오면 그때 내부에서 진짜 빈을 요청하는 위임 로직이 들어있다.
✅동작원리
✅특징 정리
✅주의점
All reactions