ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [헤드퍼스트 Servlet&JSP] 4. 요청과 응답
    개발입문/Servlet&JSP 2017. 2. 5. 22:04

    서블릿 모델

    위 그림을 이해했다면-

    이번 장에서는 HTTP 웹 환경에서 HTTP 메소드, HTTP 메소드 프로토콜, HttpServlet 메소드 등등을 통해 어떻게 웹 애플리케이션 요청&응답이 이루어지는 지 살펴볼 차례이다. 그 중 가장 중간에서 어떤 일을 할지 판단/처리하는 Servlet에 대해서도 자세히 알아본다.

    HttpServletRequest 인터페이스: 폼, 헤더 정보, 쿠키 정보

    HttpServletResponse 인터페이스: 헤더, 컨텐츠타입, 텍스트스트림, 바이트스트림 출력, 리다이렉트/디스패치, 쿠키설정 (쿠키심기)

    서블릿 생명주기 이벤트와 각각의 목적: (1) 서블릿 클래스 로딩, (2) 서블릿 초기화 (3) init() 메소드 호출, (4) service() 메소드 호출, (5) destroy() 메소드 호출

    간단하게 HTTP 프로토콜을 통해

    - Request 를 통해 클라이언트에 대한 정보를 얻고

    - 이 정보를 통해 비즈니스 로직으로 클라이언트에 응답할 정보를 호출하고

    - Response 를 통해 위 내용을 가지고 클라이언트에게 제공할 페이지를 작성한다. 또는 리다이렉트 / 디스패치 한다.


    컨테이너, 서블릿 생명주기 관리


    컨테이너는 ㅇㅇ한다! 

    1. (서블릿 목적의) 클래스 로딩

    DD (Distribution Descriptor) 를 통해 서블릿을 담은 클래스를 찾는다.

    2. 디폴트 생성자를 호출: 서블릿 인스턴스화

    3. init() 메소드 호출

    서블릿 클래스를 초기화한다. ServletConfig 객체와 ServletContext 객체에 접근할 수 있다. 이 두 객체를 통해 서블릿 및 웹 애플리케이션 설정 정보를 파악할 수 있다. 

    4. service() 메소드 호출

    서블릿은 일생의 대부분을 클라이언트 요청에 대한 응답으로 service() 메소드를 실행하는 데 보냅니다. Servlet 서비스가 처리해야할 작업에 따라 doGet(), doPost() 등을 적절하게 호출합니다.

    5. destroy() 메소드 호출

    서블릿을 통해 클라이언트에 응답을 완료한 후, 서블릿은 생명을 다한다.


    ※ 클라이언트의 요청은 서로 다른 스레드에서 실행합니다.


    ※ Servlet interface <---- GenericServlet (abstract) <----HttpServlet <---- MyServlet

    [Docs] HttpServlet


    Request, Response

    ServletRequest interface <---- HttpServletRequest interface

    ServletResponse interface <----- HttpServletResponse interface


    [Docs] ServletRequest

    [Docs] HttpServletRequest


    HttpMethod

    - GET, POST, HEAD, TRACE, PUT, DELETE, OPTIONS, CONNECT

    - GET: 요청 파라미터를 URL에 작성 (queryString 쿼리스트링), URL 에 데이터가 노출된다. 조회용, 멱등적(idempotent), default HTTP 메소드, body 없음

    - POST: 요청 파라미터를 BODY에 작성, 데이트크기 큼, 보안성, 수정, 변경용

    ※ 멱등(Idempotent)은 동일한 작업을 계속해서 할 수 있습니다. (GET(O), POST(X))

    ※ 서블릿은 서버에서 다중 스레드로 (Multi threaded) 작동하므로, 동일 자원(클래스변수, DB 등) 에 대한 접근이 동시에 일어나는 것을 주의해야 한다.



    Request 정보

    String colorParam = request.getParameter("color");

    String [] sizesParam = request.getParameterValues("sizes");

    String client = request.getHeader("User-Agent");

    Cookie[] cookies = request.getCookies();

    HttpSession session = request.getSession();

    String theMethod = request.getMethod();

    InputStream input = request.getInputStream();


    Response 

    클라이언트에게 데이터를 보내기 위하여 Response 객체를 사용합니다.

    Response 객체로 헤더를 설정하고, 오류를 전송하며, 쿠키도 추가할 수 있습니다.

    실제 프로젝트에서는 HTML 응답을 보내기 위하여 JSP를 사용합니다. 그럼에도 불구하고 JAR 파일과 같은 바이너리를 전송하기 위하여 Response 객체를 사용합니다.


    1. 두가지 출력방식: 문자와 바이트

    ServletOutputStream, .getOutputStream(), os.write()

    PrintWriter, getWriter(), pw.println()


    2. HEADER 헤더 설정 추가

    .setHeader() 이미 존재하는 값을 덮어쓰기

    .addHeader() 값을 하나 더 추가


    3. 리다이렉트

    서블릿 리다이렉트는 브라우저가 이 작업을 합니다. (URL도 바뀌어서 사용자도 알 수 있습니다.) 서블릿을 작성할 때, 요청을 스스로 처리할 것인지- .sendRedirect() 를 써서 다른 곳으로 요청할 것인지 미리 결정해야 합니다.

    response.sendRedirect("/foo.txt");
    웹 애플리케이션 루트 하위 파일

    response.sendRedirect("foo.txt");
    현재 경로 하위 파일


    4. 처리 위임

    요청 디스패치는 서버 상에서 작업이 일어납니다.

    RequestDispatcher view = request.getRequestDispatcher("result.jsp");

    view.forward(request, response);


    서블릿이 보기에 이 요청은 웹 애플리케이션의 다른 컴포넌트 (여기서는 JSP)가 처리해야한다고 판단. 위처럼 JSP에게 요청을 포워딩합니다.


    (아주 조금)

    익숙해서 재밌는 웹 개발

    Http Head, Body 에 각각 어떤 정보가 들어있는지-

    Cookie, Session 이런 데이터는 언제 활용하는지- 

    (우리가 광고 타겟팅을 위해 왜 쿠키를 수집하고, 사용자 로그인을 유지하기 위해 어떻게 세션을 관리하는지 배우기를 기대하고 있다!)

    익숙한 단어들이 중간중간 나오니까 반갑고, 공부할 의지도 솟는다. 아자아자.







    댓글

Designed by Tistory.