본문 바로가기
Spring

[스프링 핵심 원리 - 기본편] 스코프와 Provider

by 박성민 2021. 9. 21.

첫번째 해결방안은 Provider를 사용하는 것입니다.

@Controller
@RequiredArgsConstructor
public class LogDemoController {

    private final LogDemoService logDemoService;
    private final ObjectProvider<MyLogger> myLoggerProvider;

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

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

}
@Service
@RequiredArgsConstructor
public class LogDemoService {

    private final ObjectProvider<MyLogger> myLoggerProvider;

    public void logic(String id) {
        MyLogger myLogger = myLoggerProvider.getObject();
        myLogger.log("service id = " + id);
    }

}
[871922ad-4ca3-4c47-91fd-ca8db134ac15] request scope bean create:hello.core.common.MyLogger@6be579a5
[871922ad-4ca3-4c47-91fd-ca8db134ac15][http://localhost:8080/log-demo] controller test
[871922ad-4ca3-4c47-91fd-ca8db134ac15][http://localhost:8080/log-demo] service id = testId
[871922ad-4ca3-4c47-91fd-ca8db134ac15] request scope bean close:hello.core.common.MyLogger@6be579a5
  • ObjectProvider 덕분에 ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있습니다.
  • ObjectProvider.getObject()를 호출하는 시점에는 HTTP 요청이 진행중이므로 request scope 빈의 생성이 정상 처리됩니다.
  • ObjectProvider.getObject()LogDemoController, LogDemoService에서 각각 한번씩 따로 호출해도 같은 HTTP 요청이면 같은 스프링 빈이 반환됩니다.

참조

댓글