서블릿은 WAS 서버에서 우리(개발자)가 중요한 비지니스 로직에만 집중할 수 있도록 지원해주는 도구라고 할 수 있다.
만약 서블릿이 없다면 Http Request 데이터의 파싱부터 TCP/IP 연결까지 모든걸 구현해야한다. (매우 안타까운일이다..)
따라서 WAS 서버에서는 Servlet를 활용하면 매우 편리하게 Http Request/Response를 처리할 수 있게 된다.
간략하게 정리하면 Servlet의 동작 방식은 아래와 같다.
1) 웹브라우저에서 WAS 서버로 Http Request 요청
2) WAS 서버에서는 Http Request를 기반으로 Http 요청 메시지 생성
3) 서블릿 컨테이너에서 Http 요청 메시지를 처리할 서블릿에게 Http 요청 메시지 전달
4) 서블릿에서 Http 요청 메시지 처리후 Http 응답 메시지 전달
5) 웹브라우저로 전달
톰캣 처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다고 한다.
서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명 주기를 관리하며, 서블릿 객체는 싱글톤으로 관리된다.
(물론 Http Request와 Response는 항상 새롭게 생성된다.)
그리고 WAS 동시 요청을 위한 멀티 쓰레드도 지원한다.
일반적으로 톰캣은 최대 200개의 멀티 쓰레드를 지원하도록 쓰레드풀 지정이 가능하다.
스프링에서는 아래의 애노테이션을 사용하면 자동으로 서블릿을 찾아서 서블릿 컨테이너에 등록해준다.
@ServletComponentScan //서블릿 자동 등록
그리고 서블릿를 생성하기 위해서는 HttpServlet을 상속받아야한다.
그리고 @WebServlet이라는 애노테이션을 통해서 서블릿 이름과 서블릿을 요청하는 URL Pattern을 지정할 수 있다.
그리고 service() 함수를 오버라이드해서 서블릿이 호출되면 service 함수가 호출된다.
// 서블릿 코드
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet.service");
}
}
// 웹브라우저를 통해서 서블릿 접근 및 호출
http://localhost:8080/hello
// 서블릿 코드
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet.service");
System.out.println("request = " + request);
System.out.println("response = " + response);
// 쿼리 파라미터 파싱해오기
String username = request.getParameter("username");
System.out.println("username = " + username);
// Http Response Data 만들기
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello " + username);
}
}
웹브라우저 호출 화면
스프링에서 Http 모든 요청 데이터를 확인하기 위해서는 application.yml에 아래의 설정값을 추가해주면 된다.
logging.level.org.apache.coyote.http11=debug
webapp 디렉토리에 index.html 파일을 만들어놓으면 index.html은 웹 애플리케이션의 welcompage로서 인식된다.
여기서 중요한점은 webapp 디렉토리이다.
HttpServletRequest는 Http 요청 메시지를 개발자가 직접 파싱해서 사용해도 되지만, 서블릿은 개발자가 Http 요청 메시지를 편리하게 사용할 수 있도록 파싱해준다.
따라서, HttpServletRequest는 서블릿이 Http 요청 메시지를 파싱해서 객체에 담아준것이라고 보면 된다.
그 외에도 여러 가지 기능을 지원하는데 정리하면 아래와 같다.
특히, Htyp request는 일반적으로 3가지 방식으로 전달될 수 있다.
첫번째, Get 방식
두번째, Html Form 방식
세번째, Post 방식
첫번쨰, 두번쨰는 HttpServletRequest에서 getParameter 방식으로 모두 처리가 가능하다.
해당 포스팅은 아래의 강의를 공부 후 개인적으로 정리한 내용입니다.
김영한님의 스프링MVC1편