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 로 접속한다.

- 콘솔
[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
'강의 실습 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
| 스코프와 프록시 (0) | 2026.05.12 |
|---|---|
| request 스코프 예제 만들기 (0) | 2026.05.10 |
| 웹 스코프 (0) | 2026.05.09 |
| 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결 (0) | 2026.05.09 |
| 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점 (0) | 2026.05.07 |
댓글