[Lecture - 김영한님(스프링 핵심 원리 - 기본편)] 스코프와 Provider
inflearn에서 김영한님 강의를 들으면서 내용을 정리해보자.
스프링 핵심 원리 - 기본편
스프링 애플리케이션을 실행하는 시점에 싱글톤 빈은 생성해서 주입이 가능하지만, request 스코프 빈은 아직 생성되지 않는다.
이 빈은 실제 고객의 요청이 와야 생성할 수 있다.
이 문제를 Provider를 사용해서 해결해보자. (아래 코드는 ObjectProvider를 사용했다.)
1
2
3
4
5
6
7
8
9
10
11
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final ObjectProvider<MyLogger> myLoggerProvider;
public void logic(String id) {
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.log("service id = " + id);
}
}
main() 메서드로 스프링을 실행하고, 웹 브라우저에 http://localhost:8080/log-demo를 입력하자.
1
2
3
4
[f3628540-19b6-41ad-a25b-5b49e3ceff3b] request scope bean create:hello.core.common.MyLogger@91aa73e
[f3628540-19b6-41ad-a25b-5b49e3ceff3b][http://127.0.0.1:8080/log-demo] controller test
[f3628540-19b6-41ad-a25b-5b49e3ceff3b][http://127.0.0.1:8080/log-demo] service id = testId
[f3628540-19b6-41ad-a25b-5b49e3ceff3b] request scope bean close:hello.core.common.MyLogger@91aa73e
이제 잘 작동한다.
ObjectProvider덕분에ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있다.- 빈의 생성을 지연시킨다보다는 스프링 컨테이너한테 요청하는 것을 지연한다는 것이다.
- 즉, 스프링 빈이 나중에 생성해준다.
ObjectProvider.getObject()를 호출하는 시점에는 HTTP 요청이 진행중이므로 request scope 빈의 생성이 정상 처리된다.ObjectProvider.getObject()를 LogDemoController, LogDemoService에서 각각 한번씩 따로 호출해도 같은 HTTP 요청이면 같은 스프링 빈이 반환된다.
This post is licensed under CC BY 4.0 by the author.