서블릿

강한친구·2022년 6월 13일
0

Spring

목록 보기
8/27

서블릿이란

클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술

출처: https://mangkyu.tistory.com/14 [MangKyu's Diary:티스토리]

서블릿이란 자바를 사용하여 웹을 만들때 사용하는 기술이다. 쉽게 말하면 클라이언트의 request에 대한 response를 전달해주는것이다.

작동 방식

  1. Request가 ServletContainer로 이동시킨다
  2. 컨테이너가 HttpServletRequest, Response를 생성한다.
  3. 해당하는 servlet을 찾는다.
  4. 해당 서블릿의 service를 호출하고, 요청을 처리한다.
  5. 요청을 처리하면 동적 페이지를 생성해서 response에 담아서 보낸다.
  6. 과정이 끝나면 소멸한다

결론적으로 request를 받고 response를 생성하고 보내주는 과정을 알아서 처리해주는 기능인것이다.

HelloServlet

@WebServlet(name = "helloServlet", urlPatterns = "/hello")

어노테이션을 통해서 서블릿을 사용할 수 있다.
이 /hello url로 오게되면, helloServlet이라는 이름을 가진 이 servlet이 작동하는것이다.

또한, request.getParameter 함수를 통해서 query param을 쉽게 받을 수 있다.

request.getParameter()

HttpServletRequest

HttpServletRequest는 http request를 담는다. 이를 통해 편리하게 사용할 수 있다.

또한, 임시 저장소 기능을 할 수 있다. 해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능이다. 이를 나중에 MVC에 활용할 수 도 있다.

저장: request.setAttribute(name, value)
조회: request.getAttribute(name)

Http request 데이터 개요

GET

/url?username=hello&age=20
메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
예) 검색, 필터, 페이징등에서 많이 사용하는 방식

POST - HTML Form

content-type: application/x-www-form-urlencoded
메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20
예) 회원 가입, 상품 주문, HTML Form 사용

GET, POST는 결국 queryparameter를 받아서 처리하는 방식인것이다.

API기반 방식은 다음과 같다.

HTTP message body에 데이터를 직접 담아서 요청

단순한 문자열의 경우 HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.

HTTP API에서 주로 사용, JSON, XML, TEXT
데이터 형식은 주로 JSON 사용
POST, PUT, PATCH

objectMapper.readValue(messageBody, HelloData.class);

objectMapper를 이용해서 json 데이터를 미리 자기가 만들어 둔 class에 맞춰서 집어 넣을 수 있다,.

HttpServletResponse

기본 응답

@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //[status-line]
        response.setStatus(HttpServletResponse.SC_OK); //200
        //[response-headers]
        response.setHeader("Content-Type", "text/plain;charset=utf-8");
        response.setHeader("Cache-Control", "no-cache, no-store, mustrevalidate");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("my-header","hello");
        //[Header 편의 메서드]
        content(response);
        cookie(response);
        redirect(response);
        //[message body]
        PrintWriter writer = response.getWriter();
        writer.println("ok");
    }
}

헤더정보를 설정해서 응답을 보내줄 수 있다. 크게 복잡한 부분은 없다

응답 데이터

HTML 응답

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Content-Type: text/html;charset=utf-8
        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<body>");
        writer.println(" <div>안녕?</div>");
        writer.println("</body>");
        writer.println("</html>");
    }

이렇게 html코드를 직접 적어주면 브라우저가 이를 보고 렌더링을 하는데 대충 봐도 html코드를 자바로 일일히 입력하고 보내주는 방식이라 굉장히 불합리하고 불편해보인다.

API JSON 응답

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Content-Type: application/json
        response.setHeader("content-type", "application/json");
        response.setCharacterEncoding("utf-8");
        HelloData data = new HelloData();
        data.setName("kim");
        data.setAge(20); //{"username":"kim","age":20}
        String result = objectMapper.writeValueAsString(data);
        response.getWriter().write(result);
    }

json 구현 class를 데이터로 설저하고 이 안에 값을 설정한다. 그리고 이 값을 objectMapper.writeValueString을 통해서 응답을 반환할 수 있다.

하지만 이 모든건

스프링 MVC 패턴을 사용하면, 이 모든 기능을 스프링이 알아서 처리해주고, 처리를 이렇게 번거롭게 할 필요가 없다.

0개의 댓글