1. 개요
최근 다중WAS 환경에서 발생한 세션 불일치 문제를 대응하기 위해 전역처리를 먼저 확실히 가다듬고자 하였다.
처음 스프링을 실행할때 스프링 컨테이너가 어떻게 반응하고, 이후 클라이언트 요청이 들어왔을때 was의 구조를 돌아보면서 어떻게 반응하는지 각각 어떠한 차이점이 있는지 등 할 수 있는 모든 개념에 대한 총정리를 하였다.
2. 개괄 - WAS구조와 웹서버
![](https://velog.velcdn.com/images/gyrbs22/post/ce5af46e-45c6-439d-9089-12a94e6ed7e4/image.jpg)
- WAS는 웹서버와 서블릿 컨테이너(=웹컨테이너)로 이루어져 있다.
- 웹서버는 서블릿컨테이너와 소켓을 통해 통신하며, 세부적으로 알맞은 서비스를 실행하고 동적페이지를 전달받기 위한 인터페이스로 CGI(command gate interface)를 사용한다.
3. 서블릿 컨테이너(springMVC구조를 포함한 일반적인 구조)
![](https://velog.velcdn.com/images/gyrbs22/post/2a1d21bf-c7ae-417c-8793-ea7fb52dc2bb/image.jpg)
- 클라이언트에서 다수의 요청이 들어왔을 때 서블릿컨테이너 스레드풀 내에 다수의 스레드가 생성 및 서블릿 객체에 httpservletrequest를 전달하여 고객요청정보를 전달한다.
- 여기까지는 was에서 진행한다.
- 이 부분은 자바에서 제공하며, MVC 구조에서는 디스패처서블릿이 이와 같고(front controller), 이 과정 이후에 스프링 컨테이너가 개입한다.
- 다른 구조에서는 서블릿을 찾아서 객체를 생성하는데, 이때의 서블릿은 싱글톤 객체로 생성되어 웹컨테이너 스레드들은 이 객체를 공유하게 된다(request for thread)
- 위와 같은 공유 과정이 발생하는 경우는 같은 요청을 했을때이고, 다른 요청에 대해서는 다른 서블릿 객체가 만들어 진다(different servlet context)
4. 서블릿컨테이너와 짝꿍인 스프링 컨테이너가 구성되는 과정(서블릿컨테이너와 스프링컨테이너의 경계)
![](https://velog.velcdn.com/images/gyrbs22/post/2068b5f1-9aa1-4af2-8b76-bea39e74212f/image.jpg)
- 최초 서블릿컨테이너 로드 시 contextLoaderListener(servletcontextListener를 구현한)를 실행하며, 이후 Applicationcontext를 실향하고 root context.xml를 로드한다. 이 application context는 다양한 스프링 컨테이너의 모습 중 하나이고(Root spring container), 이때 서비스, dro, dao, vo 등의 클래스를 로드하여 실행에 준비한다.
- 요청이 왔을때 디스패처서블릿(지명된 서블릿)을 서블릿 컨테이너에서 싱글톤으로 생성하는 것이고, 위 과정을 통해 준비된 스프링 컨테이너가 di주입 등을 통해 비즈니스 로직을 진행한다.
5. SpringMVC에서 비즈니스 로직이 진행되는 세부과정
![](https://velog.velcdn.com/images/gyrbs22/post/703f9d11-0754-4813-ab05-fa069cafdc97/image.jpg)
- 요청이 왔을때(runtime) was의 필터를 거쳐 디스패처 서블릿으로 요청을 전달하고, 웹컨테이너를 통해 서블릿은 인터셉터를 거쳐 비즈니스 로직을 매핑해주는 페이지 컨트롤러로 요청을 전달한다.
- 인터셉터부터 스프링 컨테이너의 관할지역이다.
- 구체적으로는 핸들러 매핑과 핸들리 인터셉터를 거쳐 비즈니스 로직을 처리할 적당한 컨트롤러를 찾고, 이때 di 등을 주입받아 최종적으로 비즈니스 로직을 처리하고 응답한다.
- 이때 인터셉터에서 컨트롤러로 전달하는 과정은 스프링 컨테이너에서, 비즈니스 로직을 처리할때 도움을 주기위해 추가적인 과정이 루트 스프링 컨테이너를 통해 진행된다.
6. 헷갈리는 부분 간략정리
이 부분은 인터넷에서 상당히 많은 해석이 있었는데, 최대한 개념적으로 결합하여 얻은 결론은 다음과 같다.
- was는 웹서버, 서블릿컨테이너로 이루어져있다.
- was가 실행하면서 설정 정보에 따라 스프링컨테이너를 별도로 참조하며, 동적 정보를 최종적으로 생성하여 서블릿이 웹서버에 전달한다.
- 웹컨테이너와 서블릿컨테이너는 서로 동일하다.
- 스프링 프레임워크와 관계없이 was실행만으로 실행되는 필터, was실행 후 디스패치서블릿을 거쳐 컨트롤러로 요청을 핸들링하기 전에 스프링 프레임워크에서 실행하는 인터셉터가 있다.
- 요청에 대한 서블릿 자체는 싱글톤, 즉 하나만 생성된다. 단 요청이 여러개라면 서블릿 컨텍스트가 달라져 다른 서블릿 싱글톤 객체가 생성된다.
- 서블릿 컨테이너는 웹서버와 소켓으로 통신한다. 사용자 요청이 왔을때 was와 소켓, fetch 방식으로 통신하는 것과 분리 이해해야 한다.
7. 참고자료
☆☆ 서블릿 컨테이너, 스프링 컨테이너 - https://sigridjin.medium.com/servletcontainer%EC%99%80-springcontainer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80-626d27a80fe5
서블릿은 싱글톤, 스레드 요청은 멀티스레드 요청- https://tate91.tistory.com/m/50
was구조 - https://bny9164.tistory.com/m/56
일반적인 서블릿 개념 - https://mangkyu.tistory.com/14#:~:text=%EC%84%9C%EB%B8%94%EB%A6%BF%20%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EB%8A%94%20%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%9D%98%20%EC%9A%94%EC%B2%AD(Request)%EC%9D%84%20%EB%B0%9B%EC%95%84%EC%A3%BC%EA%B3%A0%20%EC%9D%91%EB%8B%B5(Response)%ED%95%A0%20%EC%88%98%20%EC%9E%88%EA%B2%8C%2C%20%EC%9B%B9%EC%84%9C%EB%B2%84%EC%99%80%20%EC%86%8C%EC%BC%93%EC%9C%BC%EB%A1%9C%20%ED%86%B5%EC%8B%A0%ED%95%98%EB%A9%B0%20%EB%8C%80%ED%91%9C%EC%A0%81%EC%9D%B8%20%EC%98%88%EB%A1%9C%20%ED%86%B0%EC%BA%A3(Tomcat)%EC%9D%B4
https://pjs-world.tistory.com/m/entry/%EC%84%9C%EB%B8%94%EB%A6%BFServlet-WAS
요청이 들어왔을때 서블릿/스프링컨테이너 관점 - https://jwkim96.tistory.com/52
https://roadofdevelopment.tistory.com/entry/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%99%80-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88
스프링 컨테이너를 이해하는 방법은 bean, application cotext - https://velog.io/@cv_/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%99%80-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-Spring-Container