관리 메뉴

제뉴어리의 모든것

서블릿 컨테이너란? 본문

서블릿

서블릿 컨테이너란?

제뉴어리맨 2021. 1. 29. 13:52

서블릿 컨테이너는 개발자가 웹서버와 통신하기 위한 복잡한 일들(소켓 생성, 특정 포트 리스닝, 스트림 생성 등)을 할 필요가 없게 해준다. 컨테이너는 서브릿의 생성부터 소멸까지 일련의 과정을 관리한다. 서블릿 컨테이너는 요청이 들어올 때마다 새로운 자바 스레드를 만든다. 서블릿 컨테이너의 대표적인 예시로는 Tomcat이 있다.

 

Dispatcher-Servlet이란?

  1. 개념
    클라이언트로부터 어떠한 요청이 들어오면 서블릿 컨테이너가 요청을 받는다. 이 때 제일 앞에서 서버로 들어오는 요청을 처리하는 프론트 컨트롤러를 Dispatcher-Servlet이라고 한다. (Spring에서 정의함)
    공통작업에 대한 처리는 Dispatcher-Servlet에서 이루어지지만 세부적인 작업 내용은 해당되는 컨트롤러에 위임하여 처리한다.
  2. 특징
    Dispatcher-Servlet이 등장함에 따라 Spring MVC의 web.xml의 역할이 축소되었다. 기존에는 모든 서블릿에 대해 URL 매핑을 활용하기 위해서 web.xml에 모두 등록해주어야만 했다. 그러나 Dispatcher-Servlet이 들어오는 모든 요청을 핸들링해주면서 작업을 상당히 편리하게 할 수 있게 되었다.
    Dispatcher Servlet이 요청들을 Controller로 넘겨주는 것은 편해보이지만, 한가지 문제점이 있다. 이미지나 HTML을 불러오는 요청마저 모두 Controller로 넘겨버린다는 것이다. 심지어 JS나 CSS 파일에 대한 요청 모두 Dispatcher-Servlet이 가져가기 때문에 자원 호출이 제대로 이루어지지 않는다. Spring은 이에 대한 해결책으로 <mvc:resources/>를 이용할 수 있도록 내놓았다. 만약 Dispatcher-Servlet에서 해당 요청에 대한 컨트롤러를 찾을 수 없는 경우에, 2차적으로 설정된 경로에서 요청을 탐색하여 자원을 호출할 수 있도록 한 것이다.

 

Spring MVC의 요청 처리 흐름

 

Spring MVC의 클라이언트 요청 처리 과정

  1. 클라이언트가 URL로 접근하여 정보를 요청한다.
  2. 요청이 DispatcherServlet으로 전달되고 DispatcherServlet은 HandlerMapping을 통해 해당 요청(URL)을 매핑한 컨트롤러가 있는지 검색한다. (@Controller로 등록한 클래스 스캔)
  3. 해당 요청을 매핑한 컨트롤러에 요청을 전달한다.
  4. 컨트롤러에서는 해당 요청을 처리할 서비스를 주입 받아 해당 로직을 서비스에 전달한다.
  5. 서비스는 요청에 필요한 대부분의 작업을 담당하며 DB접근이 필요하면 DAO를 주입 받아 DB처리는 DAO에게 전달한다.
  6. DAO는 MyBatis 설정을 통해 SQL 쿼리를 날려 DB 정보를 받아 다시 서비스에게 전달한다.
  7. 모든 로직을 끝낸 서비스가 처리 결과를 컨트롤러에게 반환한다.
  8. 결과를 받은 컨트롤러는 Model 객체에 결과물을 담고 결과를 출력할 View(JSP)의 이름을 DispatcherServlet에 전달한다.
  9. DispatcherServlet은 받은 View의 이름을 ViewResolver 에게 전달한다.
  10. ViewResolver는 전달 받은 View에 처리결과를 송신한다.
  11. 처리 결과를 받은 View는 전송할 응답을 생성하고 DispatcherServlet으로 전달된다.
  12. 마지막으로, DispatcherSerlvet에서 View를 클라이언트에게 전달한다.

 

출처 : 서블릿 컨테이너란?. 서블릿 컨테이너는 개발자가 웹서버와 통신하기 위한 복잡한 일들(소켓… | by Myong Hyo You | Medium