인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

세승님의 프로필 이미지
세승

작성한 질문수

스프링 핵심 원리 - 기본편

스코프와 Provider

Provider를 이용한 request scope 문제 해결 방법

작성

·

537

·

수정됨

1

강의 교안 <9.빈 스코프>의 28페이지를 보면 다음과 같이 설명되어있습니다.

"ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있다"

이 때, 빈의 생성을 지연한다는 말이 실제로 getObject() 함수를 호출해야만 request scope의 MyLogger 빈이 만들어 진다는 건가요?

아니면 http 요청이 들어오는 순간 이미 MyLogger 빈은 다른 로직에 의해 생성되어 존재함이 보장되고, getObject() 함수는 무조건 MyLogger 빈을 갖고 올 수 있기 때문에 이를 논리적으로 "빈의 생성을 지연한다"라고 표현하신 건가요?

전자가 맞는지 후자가 맞는지 궁금합니다.

*추가. 비슷한 질문이 있어서 해당 질문을 참고하여 내용을 추가하였습니다.

https://www.inflearn.com/questions/702458

위의 질문에서 "http요청이 들어왔을 때 request bean이 생성되는게 아니라, 생성할수있는 상태가 되는것이고, 이 상태일때 ObjectProvider.getObject()를 하게되면 request bean을 생성한후 반환하는것이다" 라는 답변이 있었습니다. 그래도 이해가 안되서, getObject() 함수가 호출되기 전에 getBean()으로 등록된 MyLogger 빈을 갖고와봤습니다.

@Controller
@RequiredArgsConstructor
public class LogDemoController {

    private final ObjectProvider<MyLogger> myLoggerProvider;
    
    // 추가된 라인
    private final ApplicationContext ac;

    @RequestMapping("log-demo")
    @ResponseBody
    public String logDemo(HttpServletRequest request) {
        
        // 추가된 라인
        MyLogger testMyLogger = ac.getBean(MyLogger.class);
        // 추가된 라인
        System.out.println(testMyLogger);
        
        String requestURL = request.getRequestURL().toString();
        MyLogger myLogger = myLoggerProvider.getObject();

        myLogger.setRequestURL(requestURL);

        myLogger.log("controller test");
        LogDemoService.logic("testID");
        return "OK";
    }
}

ApplicationContext를 의존주입 받아서,
getObject()가 호출되기 전에 getBean()으로 MyLogger 타입의 스프링 빈을 조회하고 출력하였는데,

testMyLogger와 myLogger에 동일한 객체가 들어있었습니다.

위의 답변과는 상충되는 결과인데, 제가 추가한 코드에 문제가 있는 건가요?

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 세승님

MyLogger는 @Scope(value = "request") 입니다.

따라서 하나의 HTTP 요청이 들어오고 나갈 때 까지는 그 안에서 같은 빈이 보장됩니다.

최초 조회하는 시점에 생성되고, 이후 조회하면 처음 조회한 빈을 사용하게 됩니다.

그런데 다른 HTTP 요청이 들어오면 그 안에서는 다른 빈을 만들어서 사용하겠지요?

감사합니다^^

세승님의 프로필 이미지
세승
질문자

안녕하세요 영한님. 항상 친절한 답변 감사드립니다.

답해주신 부분에 대해서는 이해가 잘 되었습니다.

추가적으로 하나만 더 질문드리고 싶은게 생겨서 질문 드립니다.

제가 위에 적어놓은 코드에서는 ac.getBean() 에 의해서 request scope의 빈이 최초 조회되기 때문에 그때 빈이 생성되는 것이고, 코드의 아래 부분의 myLoggerProvider.getObject()에서는 위의 getBean()에 의해 생성되었던 빈과 동일한 빈이 반환되는 건가요?

김영한님의 프로필 이미지
김영한
지식공유자

네 맞습니다^^

세승님의 프로필 이미지
세승

작성한 질문수

질문하기