본문 바로가기
강의 실습/스프링 핵심 원리 - 기본편

스코프와 Provider

by jint 2026. 5. 11.

ObjectProvider 를 활용

- src/main/java/hello/core/web/LogDemoController.java

package hello.core.web;

import hello.core.common.MyLogger;
import hello.core.logdemo.LogDemoService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequiredArgsConstructor
public class LogDemoController {

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

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

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

        return "OK";
    }

}


- src/main/java/hello/core/logdemo/LogDemoService.java

package hello.core.logdemo;

import hello.core.common.MyLogger;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class LogDemoService {

    // private final MyLogger myLogger;
    private final ObjectProvider<MyLogger> myLoggerProvider;

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

}


CoreApplication 에서 main() 메서드로 스프링을 실행하고 브라우저에서 http://localhost:8080/log-demo 로 접속한다.

 

log-demo 접속


- 콘솔

[d14f8913-0455-4218-b571-54cea61f2080] request scope bean create: hello.core.common.MyLogger@307a8e9c
[d14f8913-0455-4218-b571-54cea61f2080][http://localhost:8080/log-demo] controller test
[d14f8913-0455-4218-b571-54cea61f2080][http://localhost:8080/log-demo] service id = testId
[d14f8913-0455-4218-b571-54cea61f2080] request scope bean close: hello.core.common.MyLogger@307a8e9c


· ObjectProvider 사용으로 ObjectProvider.getObject() 호출하는 시점까지 request scope 빈 생성을 지연할 수 있다.
-> 스프링 컨테이너에게 요청하는 것을 지연
· ObjectProvider.getObject() 호출하는 시점에는 HTTP 요청이 진행중이므로 request scope 빈 생성이 정상 처리 된다.
· LogDemoController, LogDemoService 에서 각각 ObjectProvider.getObject() 호출시 같은 HTTP 요청이면 같은 스프링 빈이 반환된다.

동시에 여러 HTTP 요청이 오더라도, 각 요청마다 request scope bean 을 따로 관리 한다.


참고링크 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8?cid=325969

 

스프링 핵심 원리 - 기본편| 김영한 - 인프런 강의

현재 평점 5.0점 수강생 49,609명인 강의를 만나보세요. 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 스프링 기본 기능, 스프

www.inflearn.com

댓글