서블릿 기본 개념
- 웹 서버에서 웹 클라이언트의 요청을 받고 처리하는 작은 자바 프로그램.
- 대부분 HTTP를 사용하기 때문에 인터페이스인 servlet의 구현체로 HttpServlet이 있음.
서블릿 life-cycle
1) init: 서블릿을 생성, 초기화
2) service: 들어온 요청에 따라 처리가 이뤄짐. request에 알맞는 메서드로 보내 요청에 응답하도록 함.
3) destroy: service가 끝나면 destrop 메소드를 통해 삭제
Servlet Container
- 서블릿을 위한 상자: 웹 서버와의 통신 지원, 서블릿 생명주기 관리, 멀티쓰레드 지원 및 관리, 선언적인 보안관리 수행
- 결국 Servlet Container는 소켓을 만들어 웹 서버와 통신하며 JSP와 Servlet이 작동할 수 있는 환경을 제공.
- 서블릿 컨테이너의 가장 중요한 기능은 올바른 서블릿에 전달해서 처리되도록 하고, JVM이 해당 요청을 처리한 후에는 생성된 결과를 올바른 장소에 동적으로 반환해주는 것.
- 일반적으로 사용자는 서버에서 정적인 웹페이지를 요청할 수 있음.
- 만약 사용자가 본인의 입력을 기반으로 한 웹페이지를 자유롭게 요청하고 싶다면?
- 서블릿 컨테이너는 서버 사이드에서 동적으로 웹페이지를 생성하기 위해 자바를 사용
- 때문에 웹서버와 서블릿들이 상호작용할 때 서블릿 컨테이너는 필수적임.
cf) 서버 사이드: HTML 최종 결과를 서버에서 만들어서 웹 브라우저에 전달
cf) 클라이언트 사이드: HTML 결과를 자바스크립트로 사용헤 웹 브라우저에서 동적으로 생성하여 적용
참고 자료
서블릿 공식 문서
서블릿 컨테이너
Hello 서블릿
- @ServletComponentScan: 스프링이 자동으로 현재 애노테이션이 붙은 클래스의 패키지를 포함한 하위 패키지에서 서블릿을 모두 찾아 자동으로 등록한다.
@WebServlet(name = "helloServlet", urlPattenrs = "/hello"
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServelt.service");
}
}
- 서블릿은 HttpServlet을 상속받아야 한다.
- @WebServlet : 서블릿 이름, url 매핑을 입력한다. HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 해당 서블릿의 메서드를 실행한다.
- service 메서드를 재정의한다.
String username = request.getParameter("username");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello " + username);
- request.getParameter를 통해 쿼리 파라미터 정보를 조회.
- response를 사용하여 응답 정보를 입력
서블릿 컨테이너 동작 방식
내장 톰캣 서버 생성
- 스프링 부트 프로젝트를 실행하면 내장 톰캣 서버를 띄워준다.
- 톰캣 서버는 내부에 서블릿 컨테이너 기능을 가지고 있다.
- 서블릿 컨테이너를 통해서 서블릿을 다 생성해 준다. 즉, 서블릿 컨테이너 안에 helloServlet이 생성된다.
- 웹브라우저를 통해 /hello/username=world를 입력하여 요청하면, 웹 브라우저는 HTTP 요청 메시지를 만들어서 서버에 던져준다.
- 서버는 request, response 객체를 만들어서 helloServlet의 service 메서드를 호출한다.
- service 메서드 내에서 필요한 로직을 작성한다.
- 메서드가 종료되면서 WAS 서버가 response 정보를 가지고 HTTP 응답 메시지 정보를 만들어서 반환.
HttpServletRequest
1. HttpServletRequest 역할
- 서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신 HTTP 요청 메시지를 파싱한다. 그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다.
2. Http 요청 데이터
- HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법
1) GET - 쿼리 파라미터
- 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함하여 전달
- request.getParameter를 통해 편리하게 조회 가능
- 검색, 필터 페이징 등에서 많이 사용하는 방식
참고) 파라미터 이름은 하나인데 값이 중복이면, request.getParameterValues()를 사용해야 한다. 그렇지 않으면 첫 번째 값을 반환한다.
2) POST - HTML Form
- 메시지 바디에서 쿼리 파라미터 형식으로 전달
- POST의 HTML form을 전송하면 웹 브라우저는 다음 형식으로 HTTP 메시지를 만든다.
- 요청 URL: http://localhost:8080/request-param
- content-type: application/x-www-form-urlencoded
- message body: username=hello&age=20
- request.getParameter()는 GET URL 쿼리 파라미터, POST HTML Form 형식 모두 지원
- 회원가입, 상품 주문, HTML Form 사용
3) HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용(JSON, XML, TEXT)
- 데이터 형식은 주로 JSON 사용: JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson과 같이 JSON 변환 라이브러리를 추가해야 한다. 스프링부트로 Spring MVC를 선택하면 기본으로 Jackson 라이브러리를 제공한다.
- POST, PUT, PATCH
위 문서는 김영한 스프링 MVC 1편 강의를 기반으로 작성되었습니다.