• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

디스패처 서블릿의 생성과정에서 질문드립니다!

22.02.15 14:30 작성 조회수 196

0

저번질문을 너무 두서없이 남겨서 하루동안 정리하고 다시 재작성합니다.

공부를 하면서 디스패처서블릿의 실행과정을 다음과 같이 정리했는데 이 내용이 맞는지 궁금해서 질문드립니다

내장 WAS기준 Springboot

1. 스프링 부트 실행 ->

 

2. springApplication.run으로 WebapplicationContext가 생성 프로젝트의 ComponentScan이 일어난다. run내부적으로 비어있는 ApplicaitonContext를 생성하고 refresh를 통해서 스프링컨테이너(루트컨텍스트가 생성 여기서 스프링 부트는 스프링도 마찬가지, mvc 구조에서 사용될 Converter나 리졸버 들을 @EnableautoConfiguer로 등록) -> 

 

3. 서블릿 컨테이너 만들어지고(WAS) @EnableAutoConfiguation에 의해 ->

 

4. 서블릿 컨텍스트를 만든다(웹어플리케이션이 등록) ->

 

5. 서블릿 컨텍스트가 생성이 되고(톰켓 카타리나) ->

 

6. 서블릿 컨텍스트에 대한 초기화 작업이 시작된다 깡spring에서는 web.xml로 작업하던 것(Java코드로 설정하는 것 또한 지원)이 Java코드 작성으로 변경(ServeltContextInitializer의 OnStartup 메서드를 이용해서 리스너를 등록하고, 필터를 등록, ContextLoader의 서블릿 컨텍스트 생성 이벤트가 발생하고 ContextLoaderListener에 의해서 RootApplicationContext인 Spring IoC 컨테이너가 주입된다.) ->

 

7. 서블릿 컨텍스트에 대한 초기화및 생성 및 RootWebApplication( 프로젝트에서 생성한 스프링 컨테이너) 주입이 완료 되어 ServletContextListener contextInitialized 메서드 실행된다. ->

 

8. 나머지 설정인 WebMvcConfigurer에 대한 (Cors 라던지 ArgumentResolver 라던지) 자동설정 이외의 커스텀 값을 추가로 넣어준다 ->

 

9. 서버가 listen하기 시작 ->

 

10. 요청이 오면 dispatherServlet객체가 생성이 된다. ( => ? 그전에 webapplicationContext의 빈에 들어가 있는데 왜 지금 생성되는 것인지 궁금합니다) ->

 

11. 객체가 생성이 되면서 webapplicationContext에 있던 mvc설정 값들을 넣어주어 초기화를 시켜준다. 초기화 메서드는 initStrategies사용

 

이 과정이 맞는지 궁금해서 질문 작성했습니다

감사합니다

 

음 제가 궁금한걸 잘못 작성 한것 같습니다. 디스패처 서블릿 보다는 스프링부트든 스프링이든 서버에는 서블릿 객체들이 올라가고 사용자 정의로 작성한 applicationContext에 등록된 @controller나 @service 들이 서블릿컨테이너의 컨텍스트에 올라가는 것이라고 이해했는데 이 동작과정이 잘 와닿지 않아서 질문드렸습니다

추가적으로 이런 applicationContext등록 과정에서 컨텍스트를 따로 2개로 분리하여 작성하는 경우도 봐서 왜 그런지 굼금했습니다

답변 1

답변을 작성해보세요.

2

안녕하세요. hsg0208님

사실 이 순서가 그렇게 중요한 것은 아닙니다.

핵심은 스프링 컨테이너에 필요한 빈들이 모두 등록되고,

서블릿에서 해당 스프링 컨테이너를 참조할 수 있도록 연결된다는 것입니다.

스프링이 제공하는 서블릿이니 스프링 컨테이너를 충분히 참조할 수 있겠지요?

추가로 applicationContext를 과거에는 2개로 분리해서 사용하기도 했지만, 지금은 대부분 1개만 사용합니다.

감사합니다.

hsg0208님의 프로필

hsg0208

질문자

2022.02.17

답변 감사합니다. 추가적으로 궁금한점은

서블릿 컨텍스트 라는 용어 인데요 제가 아는 컨텍스트는 여러 스레드에서도 공통의 자원을 공유하기 위해서 사용하는 컨테이너 정도로 알고 있습니다.

그런데 스프링 부트 기준으로 상당히 많은 컨텍스트가 있더라고요 각각의 역할과 생성시점에 대해 여쭈어 보고싶습니다

또 자료를 찾아보니 dispatcherServlet이 웹어플리케이션 컨텍스트를 구성한다고 하는데 이 컨텍스트가 왜 dispatcherServlet이 생성을 하는 지 모르겠습니다. 

 

springbootapplication.run의 결과로 annotationConfigServletWebServerApplicationContext가 나오고 하위에

ServletContext beanFactory가 나오는데 각각 어떤 역할을 하는지도 알려주시면 감사하겠습니다!

안녕하세요. hsg0208님

서블릿 컨텍스트는 생각하신 내용이 맞습니다.

스프링 부트 기준으로 컨텍스트들을 저도 다 알지는 못합니다. 대표적으로 appliationContext가 있는데 이것 자체가 스프링 컨테이너라고 이해하시면 됩니다.

dispatcherServlet이 웹어플리케이션 컨텍스트를 구성한다고 하는데 이 컨텍스트가 왜 dispatcherServlet이 생성을 하는 지 모르겠습니다.

-> 이 부분은 저도 잘 이해가 안되네요.

springbootapplication.run의 결과로 annotationConfigServletWebServerApplicationContext가 나오고 하위에 ServletContext beanFactory가 나오는데 각각 어떤 역할을 하는지도 알려주시면 감사하겠습니다!

-> beanFactory는 스프링의 빈을 만들고 저장하는 기능으로 이해하시면 됩니다.

-> annotationConfigServletWebServerApplicationContext는 여기에 더해서 웹 환경에서 스프링이 동작하도록 수 많은 기능이 추가된 것으로 이해하시면 됩니다.

감사합니다.