스프링 MVC - 서블릿

Hyunsoo Kim·2024년 5월 8일
0

스프링

목록 보기
4/13
post-thumbnail

서블릿 기본 개념

  • 웹 서버에서 웹 클라이언트의 요청을 받고 처리하는 작은 자바 프로그램.
  • 대부분 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편 강의를 기반으로 작성되었습니다.

profile
다부진 미래를 만들어가는 개발자

0개의 댓글