작성
·
386
1
이해가 안되서 강의를 돌려보다가 따로 정리해봤는데,
1번. CoreApplication의 main메서드를 실행시키면 현재로서는 에러가 나는게 맞지만, 동작순서만 보자면 CoreApplication의 main메서드를 실행시키면 실행될때 스프링컨테이너가 생성되고 컴포넌트스캔이 되서 @Controller, @Service에 의해 각각LogDemoController, LogDemoService 빈 등록이 일어난다.
그리고 또, main메서드가 실행되고있는동안(런타임동안=프로그램이 실행되고있는동안) DI가 일어난다. 그리고나서 고객이 localhost:8080/log-demo로 url을 입력하면 http요청이 들어온것이므로 이때 컴포넌트 스캔이되서 @Component에 의해 자동으로 MyLogger빈이 등록되고 초기화메소드가 실행된다. 그러고난후 @RequestMapping("log-demo")로 되어있으므로 logDemo()메소드를 실행하고, return "OK"로 응답을 준 후에 종료 메소드가 실행된다.
2번. 오류가 나는 이유를 3가지로 정리해봤는데 어떤게 더 적절한 이유일까요..?
코드가 오류나는 이유는 런타임동안에 DI를 해야되는데 MyLogger가 request빈인데, 아직 http요청이 오지않아서, MyLogger빈이 생성되지않았고 그래서 의존관계주입이 안되니 오류나는것이다.
요청이 들어오지않은 상태에서 DI를 하려니 오류가 발생하는거고, main메서드를 실행하고나서 요청이 오더라도 DI를하는시점에는 MyLogger빈이 스프링컨테이너에 없어서 오류나는것이다.
스코프 리퀘스트를 붙이면 요청이 들어오는 시점에 빈이 생성되는데 요청이 들어오질않았으니 빈이없고, 없는 빈을 di하려해서 오류가 나는것이다.
이렇게 이해하면 될까요 ..?
답변 1
3
안녕하세요. gomdole03님, 공식 서포터즈 David입니다.
@ComponentScan은 컨테이너가 생성되는 과정에서 진행됩니다. 따라서 아래 내용은 잘못 이해하고 계신 것 같습니다.
그리고 또, main메서드가 실행되고있는동안(런타임동안=프로그램이 실행되고있는동안) DI가 일어난다. 그리고나서 고객이 localhost:8080/log-demo로 url을 입력하면 http요청이 들어온것이므로 이때 컴포넌트 스캔이되서 @Component에 의해 자동으로 MyLogger빈이 등록되고 초기화메소드가 실행된다
오류가 발생하는 이유는 Request Scope를 가지는 빈을 생성하여 해당 빈을 사용하고 있는 곳에 의존관계 주입을 진행해야 하는데, 현재 request scope가 active된 상황(요청이 서버로 유입된 상황)이 아니기 때문입니다. 이 결과로 컨테이너는 reqeust scope 빈을 생성할 수 없는 상황이라고 예외를 발생시키는 것입니다.
감사합니다.