Post

[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.

© Yn3. Some rights reserved.