♪ 학습 내용
웹 스코프 / 프록시
* 웹 스코프
앞에서 본 프로토타입 스코프는 요청 시에 생성하고 초기화까지만 진행, 반환. 더 이상 관리 x
웹 스코프는 스프링이 종료 시점까지 관리한다.
종류로는 request, session, application, websocket
이 중 request 스코프를 다뤘다.
프로토타입은 요청마다 새로운 생성했지만,
request는 HTTP request에 요청이 들어오고 나갈때까지, 그 라이프 사이클 동안 유지된다.
그리고 각 요청마다 새로 생성하여 다른 인스턴스를 넘김!!
만약 같은 요청이 Controller 외에 Service에서도 호출되면 같은 인스턴스를 반환 (각각의 요청마다 이므로)
실행하면 오류 발생한다
왜??
@RequiredArgsConstructor 애노테이션으로 기본 생성자가 하나 있고,
생성자가 하나이기 때문에 자동으로 의존관계 주입이 되는 상태인건 학습해서 알고 있다.
그렇다면 LogDemoController가 생성될 때 자동으로 MyLogger도 생성자 주입 되어야한다.
여기서 문제 발생!!
MyLogger는 request 스코프이므로 요청이 들어와야만 생성됨.
즉, 생성자 주입 시점에는 생성되어있지 않다.
해결방안으로는 다음 두가지
1. Provider 사용
2. 프록시 사용
* Provider
앞에서도 한번 사용했던 Object Provider이다.
개념은 의존관계 주입을 받지 않고 직접 get하여 찾아 쓸 때 대신 찾아주는 무언가 정도? DL
외에 다른 코드들도 Provider에 맞추어 변경하고 실행하면 오류가 나지 않는다.
request 스코프인 MyLogger가 private 필드로 들어있지 않아 생성 시점에 필요하지 않아졌다.
(대신 Provider가 들어감)
그 덕분에 request scope 빈의 생성을 지연할 수 가 있게 됐다 !!!
해당 코드에서 MyLogger 가 필요한 때는 "log-demo" 요청 들어왔을 때이다.
그때 ObjectProvider를 이용해 MyLogger 찾아 사용.
즉, 요청이 들어오면 필요하기 때문에, request 스코프가 이미 생성되므로 문제 없이 작동한다.
* 프록시
프록시(Proxy)는 대리의 의미로, 프록시 서버라고 불리우는 중계 서버.
여기서는 CGLIB 라이브러리로 가짜를 만들어 주입 받는 느낌?
위 코드로 하면 MyLogger의 가짜 프록시 클래스를 만들고, 다른 빈에 주입할 수 있다.
후에 실제 기능을 호출해야할 때 provider처럼 진짜를 찾아 동작하는 원리.
@Scope(proxyMode = ScopedProcyMode.TARGET_CLASS)
- 스프링 컨테이너가 CGLIB을 사용해 MyLogger의 가짜 프록시 객체를 생성
- 스프링 컨테이너에 MyLogger의 이름으로 가짜 프록시 객체를 등록해놓고, 필요한 곳에 주입
- 요청이 들어오면 내부의 위임 로직을 통해 진짜 MyLogger의 메서드 호출
프록시는 앞에서 요청 받아 대신 처리하는 것!
이렇게 프록시를 이용하면 생성 시점에 가짜 프록시 객체인 MyLogger가 들어가기 때문에 오류 발생 x
" Provider든 Proxy든 간에 진짜 객체 조회를 꼭 필요한 시점까지 지연처리 한다는 것이 중요 "
'Dev > Spring' 카테고리의 다른 글
[Spring MVC 1] 서블릿 (1) (0) | 2023.01.11 |
---|---|
[Spring MVC 1] 웹 애플리케이션의 이해 (0) | 2023.01.07 |
[Spring 기본] 빈 스코프 (2) (0) | 2022.11.28 |
[Spring 기본] 빈 스코프 (1) (0) | 2022.11.25 |
[Spring 기본] 빈 생명주기 콜백 (0) | 2022.11.22 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!