[Spring] Tomcat, Spring MVC 동작 과정에 관하여
웹 프로젝트를 서버에 올리기 전에 간단히 톰캣과 Spring MVC 동작 과정에 대해 정리해 보겠습니다.
📚 Tomcat
Tomcat은 WAS(Web Application Server)의 대표적인 미들웨어 서비스입니다. 하지만 Tomcat은 보통 아파치 탐캣(Apache Tomcat)이라 불리며 웹서버의 대표적인 미들웨어인 아파치의 기능 일부분을 가져와 함께 사용되면서 웹 서버(Web Server)의 기능과 WAS의 기능 모두를 포함하고 있다고 생각해도 됩니다.
📚 Web Server
웹 서버는 사용자가 웹 브라우저에서 url을 입력했을 때 사용자에게 응답을 처리하는 http 통신 일련의 과정을 진행합니다. 이 통신을 위해 소켓 연결 등의 네트워크 처리를 해주며 html, css, js등 정적 소스에 대한 요청을 처리합니다.
웹서버는 클라이언트와의 연결을 WAS로 전달하여 WAS가 클라이언트와 직접 통신하지 못하도록 중계역할을 해주어 WAS에게 독립성을 보장해주며, 보안에도 효과적이다.
📚 Servlet Container
서블릿 컨테이너는 탐캣의 메인 기능입니다. 서블릿 컨테이너의 역할은 아래와 같습니다.
- 서블릿을 관리하는 역할을 합니다. 서블릿 라이프 사이클을 직접적으로 관리하고, Servlet으로 구현된 Dispatcher Servlet 역시 서블릿 컨테이너에서 수행됩니다.
- 웹서버와 통신을 하여 클라이언트의 request를 전달받아 동적 서비스를 response를 해야하는데, 해당 통신을 위한 소켓을 만드는 등의 역할을 합니다.
- 클라이언트로부터 request를 받을 때마다 쓰레드를 생성해 요청을 처리합니다. 해당 쓰레드는 서블릿 컨테이너에서 쓰레드풀을 별도로 관리하여 실행하게 됩니다.
📚 Servlet
웹 프로그래밍을 한다고 하면, 클라이언트의 요청에 대해 상응하는 결과를 return 해 주어야 하는데 이 결과를 동적으로 생성해 주기 위한 역할을 하는 자바 프로그램을 서블릿이라고 합니다. 서블릿의 라이프 사이클은 init > service > destroy
입니다.
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
스프링 MVC에서는 Dispatcher Servlet이라는 모든 요청을 담당하는 서블릿을 두고 컨트롤러에 위임을 하여 요청을 처리합니다. (프론트 컨트롤러 디자인 패턴이라고 함) 이러한 스프링 MVC를 통해 개발자는 별도의 서블릿 개발 없이, 컨트롤러의 구현만으로도 동적인 응답값을 클라이언트에게 줄 수 있습니다.
📚 Dispatcher Servlet
Dispatcher Servlet은 내부에 여러 Handler, Adapter, Resolver 등을 가지고 클라이언트의 요청에 따라 개발자가 정의해 둔 내용을 응답해 줄 수 있도록 front-controller의 역할을 하고 있습니다.
- HandlerMapping : 클라이언트로부터 들어온 Request을 분석하여 매핑된 controller가 있는지 확인합니다.
- HandlerAdapter: 매핑 대상 Controller에게 Request 처리 요청을 보냅니다.
- ViewResolver : Controller에서 View를 return 했을 경우 해당하는 view를 찾아 client에게 return 합니다.
📚 Spring Container
DispatcherServlet 내부에 Servlet WebApplicationContext와 Root WebApplicationContext가 동작하는 것으로 보이지만 이 두 ApplicationContext가 바로 첫번째 그림에서 본 SpringContainer에서 동작하는 컨텍스트라고 이해하면 됩니다.
SpringContainer는 자바 오브젝트인 빈의 라이프 사이클을 관리하여 Spring 프레임워크의 특징인 IoC와 DI를 제공하는 역할을 합니다.
📚 총정리
- Server Start 단계
- Web Server Init
- Rppt WebApplicationContext로딩
- Web Server Start
- Client 호출 단계
- client → Web server로 request 보냄
- 동적 Web server → Servlet Container로 전달
- Servlet Container 쓰레드 생성
- DispatcherServlet init(서블릿이 생성 안되어 있을 경우)
- 생성된 스레드에서 DispatcherServlet service() 메서드 호출
- HandlerMapping 을 통해 매핑 컨트롤러 조회
- HandlerAdapter를 통해 매핑 컨트롤러에 request 전달
- 개발자가 구현한 Controller → Service → Repository 동작
🏠 출처
https://taes-k.github.io/2020/02/16/servlet-container-spring-container/