스프링/1. 스프링 핵심 원리

52강. 프록시

sdafdq 2023. 7. 25. 23:34

프록시는 대신 처리해주는? 그런 뜻임.

 

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {
    private String uuid;
    private String requestURL;

    public void setRequestURL(String requestURL){
        this.requestURL = requestURL;
    }

    public void log(String message){
        System.out.println("[" + uuid + "]" + "["+requestURL+"]"+message);
    }
    
    @PostConstruct
    public void init(){
        uuid = UUID.randomUUID().toString();
        System.out.println("[" +uuid + "] request scope bean create: " + this);
    }

    @PreDestroy
    public void close(){
        System.out.println("[" +uuid + "] request scope bean close: " + this);
    }
}

이렇게 프록시 모드 해주면 됨.

참고로 원래는 "request" 저거 혼자면 value = 굳이 이렇게 안해도 되는데 여러개 속성 넣을려면 저렇게 해야 함.

그리고 만약 class가 아니고 인터페이스면 proxyMode = ScopedProxyMode.INTERFACES 이렇게 해주면 됨.

저렇게 해주면, 저게 진짜 로직은 가지고 있고 종속성 주입하는 순간은 가짜로 처리해 줌. 요청되었을 때 진짜 로직 실행

 

 

@RequestMapping("log-demo")
    @ResponseBody
    public String logDemo(HttpServletRequest request){
        String requstURL = request.getRequestURI();
        System.out.println("myLogger = " + myLogger.getClass());
        myLogger.setRequestURL(requstURL);

        myLogger.log("controller test");
        logDemoService.logic("testId");
        return "OK";
    }

저거 System.out.println("myLogger = " + myLogger.getClass()); 해서 찍어보면,

myLogger = class co m.example.core.common.MyLogger$$SpringCGLIB$$0

이렇게 나옴. 맞음. 뭔가 spring이 저걸 상속 받아서 만든거임.