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

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

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

스프링 핵심 원리 - 기본편

request 스코프 예제 만들기

제가 이해한바가 맞을까요.. ?

작성

·

425

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하려해서 오류가 나는것이다.

 

이렇게 이해하면 될까요 ..?

답변 2

3

안녕하세요. gomdole03님, 공식 서포터즈 David입니다.

  1. @ComponentScan은 컨테이너가 생성되는 과정에서 진행됩니다. 따라서 아래 내용은 잘못 이해하고 계신 것 같습니다.

그리고 또, main메서드가 실행되고있는동안(런타임동안=프로그램이 실행되고있는동안) DI가 일어난다. 그리고나서 고객이 localhost:8080/log-demo로 url을 입력하면 http요청이 들어온것이므로 이때 컴포넌트 스캔이되서 @Component에 의해 자동으로 MyLogger빈이 등록되고 초기화메소드가 실행된다

 

  1. 오류가 발생하는 이유는 Request Scope를 가지는 빈을 생성하여 해당 빈을 사용하고 있는 곳에 의존관계 주입을 진행해야 하는데, 현재 request scope가 active된 상황(요청이 서버로 유입된 상황)이 아니기 때문입니다. 이 결과로 컨테이너는 reqeust scope 빈을 생성할 수 없는 상황이라고 예외를 발생시키는 것입니다.

감사합니다.

0

1번 질문에 대한 추가 답변을 해보자면

컨테이너가 생성되는 과정에서 @ComponentScan 이 진행되고 이 때 스코프와 상관없이 BeanDefinition 정보가 등록됩니다

그리고 싱글톤 스코프의 경우에는 BeanDefinition 정보가 등록되면서 동시에 BeanDefinition 을 근거로 빈 생성이 이루어지고

프로토타입 스코프는 컨테이너에 요청할 때, 리퀘스트 스코프는 http 요청이 들어올 때

미리 등록된 BeanDefinition 을 근거로 빈 생성이 이루어집니다

 

혹시 잘못된 부분 있으면 지적 부탁드립니다.

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

질문하기