Request / Response 객체 이해하기

김민석·2021년 1월 29일
0

웹 프로그래밍 - be

목록 보기
4/6

웹 브라우저에 URL을 입력하고 엔터를 입력하면 도메인과 포트 번호를 통해 서버에 접속한다. 그리고 나서 path 정보, 클라이언트 IP, 클라이언트의 다양한 정보를 포함한 요청 정보를 서버에 전송한다.


WAS는 웹 브라우저로부터 Servlet 요청을 받으면 요청할 때 가지고 있는 정보를 HttpServletRequest 객체를 생성하여 저장한다. 또한 웹 브라우저에게 응답을 보낼 때 사용하기 위해 HttpServletResponse 객체를 생성하고, 생성된 두 객체를 서블릿에 전달한다.

HttpServletRequest

  • http프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용한다.
  • 헤더정보, 파라미터, 쿠키, URL 등의 정보를 읽어 들이는 메소드를 가지고 있다.
  • Body의 Stream을 읽어 들이는 메소드를 가지고 있다.
  • HttpServletResponse

  • WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServletResponse객체를 생성하여 서블릿에 전달한다.
  • 서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지 등을 전송한다.
  • 클라이언트가 서버에게 요청을 보낼 때 굉장히 많은 정보들을 함께 가지고 요청을 하게 된다. 아래의 예제들을 통해 들어오는 요청 정보에는 어떤 것들이 있는지 알아보자.

    예제 1 - header 정보 알아보기

    요청할 때 가지고 들어오는 헤더 정보들이 존재하는데, 웹 브라우저가 전송한 모든 헤더의 이름과 값들을 출력해 본다. 서블릿을 하나 만들고 doGet메서드에 다음과 같이 코드를 삽입한다.

    위에서 설명 했듯이 요청이 들어오면 모든 정보들은 WAS가 HttpServletRequest라는 객체를 만들어 담아둔다. 즉, doGet 메서드의 파라메터인 request 변수를 활용하여 원하는 정보들을 추출해 낼 수 있다.
    request의 메서드 중 헤더의 이름들을 추출해 내는 getHeaderNames()를 통해 모든 헤더의 이름을 문자열 형태로 저장하고, 반복문을 통해 모든 헤더의 이름을 저장한 문자열을 탐색하며 헤더의 이름과 값을 저장 및 출력해 준다. 이 때 헤더의 이름을 알고 있으면 getHeader()를 통해 해당 헤더의 값을 구할 수 있다.
    실행 결과 다음과 같은 화면을 볼 수 있다.

    헤더의 정보들이 잘 출력된 것을 확인할 수 있다.

    코드

    package example;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Enumeration;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class HeaderServlet
     */
    @WebServlet("/header")
    public class HeaderServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public HeaderServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		out.println("<html>");
    		out.println("<head><title>form</title></head>");
    		out.println("<body>");
    		
    		Enumeration<String> headerNames = request.getHeaderNames();
    		while(headerNames.hasMoreElements())
    		{
    			String headerName = headerNames.nextElement();
    			String headerValue = request.getHeader(headerName);
    			out.println(headerName + " : " + headerValue + "<br>");
    		}
    		
    		out.println("</body>");
    		out.println("</html>");
    		
    		
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doGet(request, response);
    	}
    
    }

    예제 2 - parameter 정보 알아보기

    URL : http://localhost:8080/firstweb/param?name=kim&age=5 위의 URL에서 ? 기준으로 뒤에 있는 것들이 파라메터이다. 중간의 &로 파라메터들을 구별할 수 있다. 위의 URL에서 파라메터는 name과 age이고 각각 kim, 5라는 값을 갖는것을 의미한다. 클라이언트가 이렇게 파라메터를 넘겨주면 서버는 이 정보를 읽어들여 사용하면 된다. 다음과 같이 서블릿을 하나 만들고 코드를 삽입해 준다.

    예제 1과 마찬가지로 요청할 때 들어온 값을 활용하는데, 이 값들 중 파라메터를 활용할 것이다. request변수의 getParameter() 메서드를 활용할 수 있는데, 이때 파라메터의 이름을 사용하여 해당 파라메터의 값을 변수에 저장하는 것이다. 예제에서는 파라메터의 이름이 name과 age이다.
    그냥 실행해 보면 다음과 같은 화면을 확인할 수 있다.

    name과 age에 null값이 들어간 것을 볼 수 있다. 이는 URL을 확인해 보면 파라메터가 넘어가지 않았기 때문이다. URL을 통해 파라메터의 값을 넘겨주면 아래와 같은 화면을 확인할 수 있다.

    이런 파라메터들은 반드시 URL을 통해서만 넘어오는 것이 아니라 form 태그의 input 태그를 활용하여 넘길 수도 있다.

    코드

    package example;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class ParameterServlet
     */
    @WebServlet("/param")
    public class ParameterServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public ParameterServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		
    		out.println("<html>");
    		out.println("<head><title>form</title></head>");
    		out.println("<body>");
    		
    		String name = request.getParameter("name");
    		String age = request.getParameter("age");
    		
    		out.println("name: "+name+"<br>");
    		out.println("age: "+age+"<br>");
    		
    		out.println("</body>");
    		out.println("</html>");
    		
    	}
    
    }

    request 객체를 활용하여 위의 예제들 뿐만 아니라 많은 다양한 정보들을 얻을 수 있다. request 객체는 클라이언트가 요청할 때 보내준 정보들을 모두 추상화해서 가지고 있기 때문이다.

    출처 : 부스트코스 웹 프로그래밍(풀스택)
    https://www.boostcourse.org/web316/lecture/254279

    profile
    김민석의 학습 정리 블로그

    0개의 댓글