스프링/HTTP 기본 지식

provider와 프록시

chanhee01 2023. 2. 4. 16:00
@Controller
@RequiredArgsConstructor
public class LogDemoController {

    private final LogDemoService logDemoService;
    private final MyLogger myLogger;
    // 윗 줄은 컨테이너에 요청해서 provider를 계속 만들어주게 한다.


    @RequestMapping("log-demo")
    @ResponseBody
    public String logDemo(HttpServletRequest request) {
        String requestURL = request.getRequestURI().toString();
        myLogger.setRequestURL(requestURL);

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

아래 글에 있는 코드에서 Provider를 사용했었다. 그 이유는 request scope여서 주입을 받아야했는데 주입을 받을 수 있는 공간이 없기 때문이다.

 

위의 코드처럼 Provider를 사용하지 않으면 scope를 주입받지 못하기 때문에 Exception 오류가 발생한다.

 

@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);
    }
}

스코프에 프록시를 입력시켜주면 MyLooger의 가짜 프록시 클래스를 만들어주고 HTTP request와 상관 없이 가짜 프록시 클래스를 다른 빈에 미리 주입해 둘 수 있다.