Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Greedy
- http
- transaction
- 자바
- Proxy
- 김영한
- JPQL
- 백준
- pointcut
- Servlet
- spring
- AOP
- 알고리즘
- QueryDSL
- 그리디
- jpa
- Android
- java
- 인프런
- db
- 스프링 핵심 원리
- Spring Boot
- Thymeleaf
- 스프링
- springdatajpa
- 스프링 핵심 기능
- kotlin
- Exception
- SpringBoot
- JDBC
Archives
- Today
- Total
개발자되기 프로젝트
웹 스코프, 프록시 본문
1. proxyMode
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {
private String uuid;
private String requestURL;
- proxyMode = ScopedProxyMode.TARGET_CLASS를 추가.
- 적용 대상이 class? --> TARGET_CLASS
- 적용 대상이 interface? --> INTERFACE - MyLogger를 상속받는 가짜 프록시 객체를 빈으로 등록함.
- 그럼 mylogger의 클래스를 확인해보자
System.out.println("myLogger = " + myLogger.getClass());
- Request를 보내보니, myLogger클래스가 다르다??? 어? CGLIB이다. 스프링이 주작했다.
myLogger = class hello.core.common.MyLogger$$EnhancerBySpringCGLIB$$c9f54826 [ce803cd6-8340-4372-9ec9-e4833511ff3a] request scope bean created : hello.core.common.MyLogger@58b10583 [ce803cd6-8340-4372-9ec9-e4833511ff3a][http://localhost:8080/log-demo] controller test [ce803cd6-8340-4372-9ec9-e4833511ff3a][http://localhost:8080/log-demo] service id = testId [ce803cd6-8340-4372-9ec9-e4833511ff3a] request scope bean closed : hello.core.common.MyLogger@58b10583
- 즉, 일단 주작된 myLogger빈을 주입을 해둔다.
- 그 다음 실제 myLogger의 기능을 호출하는 시점에 진짜 myLogger빈을 찾아서 동작시킴.
- CGLIB이라는 라이브러리로 내 클래스를 상속받은 가짜 프록시 객체를 만들어서 주입한다.
- proxyMode = ScopedProxyMode.TARGET_CLASS를 설정하면
- 스플이 컨테이너는 CGLIB 을 활용하여 MyLogger를 상속받는 가짜 프록시 객체 생성
- 그리고 스프링 컨테이너에 myLogger라는 이름으로 진짜가 아니라 가짜 프록시 객체를 등록함!
- 그러면 ac.getBean(MyLogger.class)하면 어떻게됨?
- 프록시 객체 튀어나옴!
- 의존관계 주입도 가짜 프록시 객체로 주입됨!
- client --> proxy객체 --> 리얼 객체
"프록시 객체는 요청이 오면 그 때 내부에서 진짜 빈을 요청하는 위임 로직 있음"
- 클라이언트가 myLogger.logic()을 하면 실은.. 가짜 프록시 객체의 메서드를 호출 것임.
- 가짜 프록시 객체는 진짜 myLogger를 찾는 방법을 알고있어!
- 가짜 프록시 객체는 결국 진짜 MyLogger를 상속 받았기 때문에,
- 클라이언트 입장에서는 별 신경 안쓸 수 있음 : 다형성
2. 동작 정리
- CGLIB이라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체 만들어서 주입
- 가짜는 요청이 오면 그 때 내부에서 진짜 빈을 요청하는 위임 로직이 있음
- 가짜 프록시 객체는 실제 request scope와는 관계 없음.
- 내부에 단순 위임로직이 있고 싱글톤 처럼 작동함
3. 특징
- 프록시 객체 덕분에 클라이언트는 싱글톤 빈을 사용하는 것 처럼 request scope를 사용 쌉가능
- 결국 provider를 쓰든, proxy를 쓰든 진짜 객체 조쇠를
꼭! 필요한 시점까지 지연처리 한다는 것임 - 캬, annotation 설정 만으로 진짜 객체를 프록시 객체로 대체 가능. 너무좋고..
- 다형성.. DI 컨테이너가 가진 장점임
- 아 생각해보면 client코드 안고침!!!!!!!!!!!!!!!! ㄱㅇㄷ~.
4. 주의점
- 싱글톤 인 것 같지만 다르게 동작하니 주의하자
- 요런 특별한 scope는 필요한 곳에 최소한으로
- 막쓰면 유지보수 헬로감.
5. GitHub : 210801 webScope, proxy
'인프런 > [인프런] Spring 핵심원리 이해' 카테고리의 다른 글
애플리케이션 아키텍쳐 (0) | 2021.08.06 |
---|---|
웹 스코프, provider (0) | 2021.08.01 |
Provider, ObjectProvider (0) | 2021.08.01 |
프로토타입 빈과 싱글톤 빈을 같이 사용하면? (0) | 2021.07.31 |
빈 스코프?? (0) | 2021.07.30 |
Comments