본문 바로가기

Spring

6. 스프링 Servlet

책<초보 웹 개발자를 위한 스프링 5>참고하여 정리하였습니다.

 

초기의 웹 서버는 클라이언트의 요청에 대해서 정적인 페이지로만 응답할 수 있었다. 하지만 사용자가 늘어나고 기능도 많아지게 되면서 사용자는 자신이 필요로 하는 정보를 받기를 원하게 되었다. 따라서 사용자가 원하는 정보를 포함한 동적인 페이지를 제공하기 위해 만들어진 프로그램이 Servlet이다.

 

  

Web Server VS WAS

Web Server

  • 웹 브라우저의 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠를 제공(HTML, CSS, 사진) →Web Server선에서 처리
  • 클라이언트가 동적인 컨텐츠 제공을 요청하면 WAS에게 그 요청을 전달한다.
  • WAS에서 처리한 결과를 클라이언트에게 응답한다.
  • Apache, Nginx

WAS(Web Application Server)

  • 동적인 컨텐츠를 제공
  • WAS에서 Web Server의 기능을 하기도 한다. → Apache Tomcat
  • Web Container 또는 Servlet Container라고도 불린다.
  • 기능
    • 분산 트랜잭션, 보안, 쓰레드 처리, 메시징
    • DB 조회 및 로직 처리
    • 요청에 맞는 핸들러 연결
    • 비즈니스 로직 수행
  • Tomcat

웹 서버와 웹 애플리케이션 서버를 따로 둠으로써 웹 서버는 정적인 컨텐츠만 제공하도록 하여 서버 부하를 방지하고 WAS는 동적인 컨텐츠 제공을 위해 필요한 처리만 하게 함으로써 분산처리로 효율성을 높였다.

 

 

스프링 Servlet의 동작방식

Servlet : 자바를 사용하여 웹을 만들기 위해 필요한 기술로, 클라이언트의 요청을 처리하고 그 결과를 다시 전송한다.

스프링에서는 Servlet의 기능을 하기 위해 스프링 MVC에서 제공하는 DispatcherServlet을 사용한다. DispatcherServlet은 Front Controller라고 정의할 수 있다.

 

Front Controller : 주로 Servlet 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러로써, MVC 구조에서 함께 사용되는 디자인 패턴

 

DispatcherServlet의 역할

스프링 컨테이너를 생성하고 그 컨테이너로부터 필요한 빈 객체(HandlerMapping, HandlerAdapter, Controller bean, ViewResolver)를 구한다.- HandlerMapping과 HandlerAdapter의 경우 @EnableWebMvc 애노테이션을 추가하면 자동으로 빈 설정을 해준다.- 스프링의 DispatcherServlet은 모든 요청을 처리하다보니 정적 파일에 요청 또한 받아온다. 따라서 우선적으로 요청을 처리할 컨트롤러가 있는지 우선적으로 찾고 없으면 2차적으로 설정된 자원 경로를 탐색한다.

 

1. 요청 전송

클라이언트가 URL을 입력하여 요청을 하면 요청을 Servlet Container의 Dispatch Servlet에게 전달한다.

- 컨테이너는 HttpServletRequest와 HttpServletResponse의 객체를 생성하고 web.xml에서 요청에 맞는 컨트롤러를 검색한다.

ex) Get, Put, Post, Delete, Head, Options, Trace

 

2. 요청 URL과  매칭되는 컨트롤러 검색

요청을 처리하기 위해 HandlerMapping이라는 객체에게 컨트롤러 검색을 요청한다.(Dispathcer Servlet이 직접 검색하지 않는다.)

web.xml 설정파일을 참고하여 매핑할 Servlet을 확인한다.

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
                               // HelloServlet은 servlet 패키지의 HelloServlet이라는 클래스 안에 정의되어 있다.
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>
                            // /hello라는 요청이 들어오면 HelloServlet이란 서블릿으로 처리 하겠다

ex) 웹 요청 경로가 '/hello' 라면 등록된 컨트롤러 빈 중에서 '/hello' 요청 경로를 처리할 컨트롤러를 리턴한다.

 

해당 서블릿 인스턴스가 있는지 확인하고 없으면 init()메소드를 호출하여 생성한다. 한번 만들어진 서블릿 인스턴스는 싱글톤 객체이기 때문에 응답처리가 완료되어도 사라지지 않는다.

 

3. 처리 요청

Handler Mapping을 통해 찾은 컨트롤러를 Dispatcher Servlet에서 Handler Adapter에게 요청 처리를 위임한다.

 

4. 실행

5. 결과리턴

해당 컨트롤러에서 요청을 처리하고 결과를 다시 리턴한다.

 

6. 컨트롤러 실행 결과를 ModelAndView로 변환해서 리턴

결과를 Dispatcher Servlet에게 ModelAndView로 변환해서 리턴

 

7. 컨트롤러의 실행결과를 보여줄 View 검색

Dispatcher Servlet은 결과를 보여줄 뷰를 찾기 위해 ViewResolver 객체를 사용한다.

 

8. 응답 생성 요청

9. 응답 생성

ViewResolver는 뷰 이름에 해당하는 View 객체를 찾거나 생성해서 리턴한다.

 

 

서블릿 인터페이스 구현하기

 

 

HttpServlet

  • init(), destroy(), service()까지 구현되어 있다.
  • HTTP 프로토콜의 기능(doGet, doPost) 제공

GenericServlet

  • Servlet 인터페이스와 ServletConfig 인터페이스를 구현하여 만든 추상 클래스
  • GenericServlet은 Servlet 인터페이스의 init()과 destroy()를 제공하고, 사용자는 service()만 구현하면 된다.
  • Servlet 인터페이스의 메서드를 구현해 놓은 추상 클래스로 HTTP 프로토콜 외 독립적인 프로토콜의 서블릿을 만들때 사용

 

 

우리는 스프링 MVC에서 제공하는 DispatcherServlet을 통해 IoC(Inversion of Control)를 사용해 역할을 위임하므로 요청처리 로직들만 구현하면 된다.

 

참고하면 좋은 사이트

 

[JSP] 서블릿(Servlet)이란?

1. Servlet(서블릿) 서블릿을 한 줄로 정의하자면 아래와 같습니다.  클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 간단히 말해

mangkyu.tistory.com

 

[Spring] Dispatcher-Servlet(디스패처 서블릿)이란? 디스패처 서블릿의 개념과 동작 과정

이번에는 servlet의 심화 또는 대표주자인 dispatcher-servlet에 대해서 알아보도록 하겠습니다. 1. Dispatcher-Servlet(디스패처 서블릿)의 개념 [ Dispatcher-Servlet(디스패처 서블릿) 이란? ] 디스패처..

mangkyu.tistory.com

 

 

서블릿(Servlet)이란?

서블릿이란? 자바를 기반으로 하는 웹페이지를 동적으로 만들어줄 수 있는 일종의 프로그램을 말한다. 사실 좁게 보면 서블릿이란 위와 같은 기능을 하는 자바의 클래스를 뜻한다. 넓게보면 위

sgcomputer.tistory.com