Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

웹 스코프, 프록시 본문

인프런/[인프런] Spring 핵심원리 이해

웹 스코프, 프록시

Seung__ 2021. 8. 1. 15:25

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


 

GitHub - bsh6463/SpringCoreFunction

Contribute to bsh6463/SpringCoreFunction development by creating an account on GitHub.

github.com

 

Comments