Replies: 1 comment
|
겁나 빠르시네요,,, 빨리 쫓아가겠습니다,., |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
9_빈 스코프
프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결
스프링 컨테이너에 요청
@Autowired로 로직을 호출할 때 마다, 컨테이너에게 새로 요청하여 받음ac.getBean()을 통해 항상 새로운 프로토타입 빈이 생성되는 것을 확인할 수 있음ObjectFactory, ObjectProvider
ObjectProviderObjectFactory는 과거에 쓰던 것으로, 편의기능들이 추가되어ObjectProvicer가 만들어짐prototypeBeanProvider.getObject()을 통해서 항상 새로운 프로토타입 빈이 생성되는 것을 확인할 수 있음ObejctProvider의getObject()를 호출하면 내부에서는 스프링 컨테이너를 통해 해당 빈을 찾아서 반환함. 찾아주는 기능만 제공해주는 것임 -> DLJSR-330 Provider
jakarta.inject.Provider사용🚨 스프링 부트 3.0부터 발생하는 문제
jakarta.inject.Provider로 변경provider.get()을 통해 항상 새로운 프로토타입 빈이 생성되는 것을 확인할 수 있음provider의get()을 호출하면 내부에서는 스프링 컨테이너를 통해 해당 빈을 찾아서 반환(DL)정리
웹 스코프
위에서 배웠던 것
웹 스코프
웹 스코프의 종류
ServletContext)와 동일한 생명주기를 가지는 스코프HTTP request 요청 당 각각 할당되는 request 스코프
request 스코프 예제 만들기
웹 환경 추가
웹 스코프는 웹 환경에서만 동작하기 때문에 web 환경이 동작하도록 라이브러리 추가
request 스코프 예제 개발
위 처럼 같은 리퀘스트인 경우에는 같은 uuid가 찍히도록 개발함
MyLogger
MyLogger클래스@Scope(value="request")를 사용해서 request 스코프로 지정@PostConstruct초기화 메서드를 사용해서 uuid를 생성해서 저장해둠. 이 빈은 HTTP 요청 당 하나씩 생성되므로, uuid를 저장해주면 다른 HTTP 요청과 구분할 수 있음@PreDestroy를 사용해서 종료 메세지를 남김requestURL은 이 빈이 생성되는 시점에는 알 수 없으므로, 외부에서 setter로 입력받음LogDemoController
http://localhost:8080/log-demoLogDemoService
오류 발생
출력이 기대대로 되지 않고, 애플리케이션 실행 시점에 오류 발생
스코프와 Provider
Provider를 사용하자 (ObjectProvider)ObjectProvider덕분에ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있음ObjectProvider.getObject()를 호출하는 시점에는 HTTP 요청이 진행중이므로 request scope 빈의 생성이 정상처리됨ObejectProvider.getObject()를LogDemoController,LogDemoService에서 각각 한번씩 따로 호출해도 같은 HTTP 요청이면 같은 스프링 빈이 반환됨스코프와 프록시
프록시 방법 적용
proxyMode = ScopedProxyMode.TARGET_CLASS추가TARGEL_CLASSINTERFACES웹 스코프와 프록시 동작 원리
CGLIB라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입함
@Scope의proxyMode = ScopedProxyMode.TARGET_CLASS를 설정하면 스프링 컨테이너는 CGLIB라는 바이트 코드를 조작하는 라이브러리를 사용해서, MyLogger를 상속받은 가짜 프록시 객체를 생성함MyLogger$$EnhancerBySpringCGLIB이라는 클래스로 만들어진 객체가 대신 등록된 것을 확인할 수 있음ac.getBean("myLogger", MyLogger.class)로 조회해도 프록시 객체가 조회되는 것을 확인할 수 있음가짜 프록시 객체는 요청이 오면 그때 내부에서 진짜 빈을 요청하는 위임 로직이 들어있음
myLogger.log()를 호출하면 사실은 가짜 프록시 객체의 메서드를 호출한 것임myLogger.log()를 호출함동작 정리
특징 정리
All reactions