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

코딩먹는하마님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

스코프와 Provider

LogDemoService 에서 ObjectProvider를 쓰는 이유

작성

·

501

·

수정됨

0

LogDemoController 부분

@Controller
@RequiredArgsConstructor
public class LogDemoController {

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

    @RequestMapping("log-demo")
        @ResponseBody
        public String logDemo(HttpServletRequest request) {
            String requestURL = request.getRequestURL().toString();
            MyLogger myLogger = myLoggerProvider.getObject();
            myLogger.setRequestURL(requestURL);
            myLogger.log("controller test");
            logDemoService.logic("testId");
            return "OK";
        }
    }

여기서 이미 요청이후에

MyLogger myLogger = myLoggerProvider.getObject();

MyLogger타입 빈을 생성해서 myLogger 에 넣어준거 아닌가요??

근데 왜 LogDemoService 부분에서

@Service
public class LogDemoService {

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

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

또 ObjectProvider를 해서 MyLogger 빈을 생성해서 찾아야하는 지 모르겠습니다.

ObjectProvider를 사용하지않고 @Autowired를 사용하면 @Autowired가 생성자를 통해 MyLogger 타입으로 검색해서 LogDemoController 부분에서 생성된 myLogger 를 자동으로 의존관계주입하고 그것을

필드로 주입 하는 거 아닌가요?? 왜 위에코드처럼 하면 오류가 나는지 모르겠습니다.

ScopeNotActiveException: Error creating bean with name 'myLogger'

 @Autowired 는 싱글톤 빈만 찾을 수 있어서 그런건가요? MyLogger 이 request 스코프이니까??

답변 주시면 정말 감사하겠습니다.

답변 1

0

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

안녕하세요. 박희재님

이 부분은 9. 빈 스코프 강의 내용을 처음부터 한번 복습해보시길 권장합니다.

LogDemoService에서 이후에 설정에서는 다음 부분이 추가되었습니다. 해당 부분도 확인해주세요.

 

@Component

@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)

public class MyLogger {

}

감사합니다.