daniel7481의 개발일지

[웹 프로그래밍(풀스택)] Servlet -BE(3) 본문

Naver Boostcourse

[웹 프로그래밍(풀스택)] Servlet -BE(3)

daniel7481 2022. 1. 23. 10:39
반응형

1. Request, Response 객체 이해하기(1)

웹 브라우저에 URL을 입력하고 Enter를 치면 웹 브라우저는 도메인과 포트 번호를 이용해서 서버에 접속한다. 그 다음 path 정보, 클라이언트 ip등 다양한 정보를 포함한 요청 정보를 서버에 전송하게 된다. WAS가 웹 브라우저에게서 요청을 받게 되면 HttpServletRequest와 HttpServletresponse라는 객체를 생성하게 된다. Request 객체에는 요청할 때 가지고 들어온 다양한 정보를 이 객체에 담는다. Response 객체는 현재 접속한(클라이언트)에게 전송하기 위해 담을 수 있는 객체다. 이렇게 만든 두 개의 객체를 요청 정보에 있는 path로 mapping된 서블릿에게 전달하게 된다. 전달된 객체는 service(), doGet(), doPost()와 같은 매소드의 매개변수로 전달돼서 사용하게 된다. 

[출처] Naver Boostcourse

HttpServletRequest

-http 프로토콜의 request 정보를 서블릿에 전달하기 위한 목적으로 사용

-헤더정보, 파라미터, 쿠키, URI, URL등의 정보를 읽어들이는 메소드를 가지고 있다. 심지어는 요청한 사용자가 어떤 언어를 사용하는지에 대한 정보까지 담는다.

*URL과 URI의 차이점(구글링)

URI는 특정 리소스를 식별하는 통합 자원 식별자를 의미한다. URL은 웹 주소라고 하며, 컴퓨터 네트워크 상 리소스가 어디 있는지 알려주기 위한 규악이다. URI의 서브셋인만큼 URL은 URI 안에 속해있다. 가장 큰 차이점은 URI는 식별하고, URL은 위치를 가르킨다. 

-Body의 stream을 읽어 들이는 메소드를 가지고 있다.

HttpServletResponse

-WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라에게 응답을 보내기 위해 response 객체를 생성하여 서블릿에게 전달한다

-서블릿은 해당 객체를 이용하여 content type, 응답 코드, 응답 메세지 등을 전송한다.

2. Request, Response 객체 이해하기(2)

요청 정보를 담아서 보내는 정보는 굉장히 다양하다. 하나하나씩 알아가보자

1) 헤더 정보 읽어 들이기

웹 브라우저가 요청 정보에 담아서 보내는 모든 header값을 읽어 들여 브라우저 화면에 출력한다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		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>");
	}

doPost는 doGet 메소드를 포함하고 있기 때문에 doGet만 바꿔보자. out이라는 객체에 대해서는 앞에 설명한 바가 있으니 넘어가고 Enumeration 인터페이스를 사용하여 reqeust의 getHeaderNames라는 메소드로 가져온 헤더 이름을문자열의 형태로 headerNames에 담는다. headerNames에 다음 요소가 있을 떄까지 하나씩 빼오면서 출력을 해보자. 이제 request의 헤더부분을 다 출력해봤다.

3. Request, Response 객체 이해하기(3)

파라미터 읽어들이기

http://localhost:8080/firtweb/param?name=kim&age=5 강조된 부분을 파라미터라고 한다. &가 기준점이다. &를 계속 사용하면 더 많은 파라미터를 전달할 수 있다. =을 기준으로 앞에 있는 것은 파라미터 이름 뒤에 있는 것은 파라미터 값이다. 여기서는 이름은 kim, 나이는 5라는 정보이다. 

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.getParameter("name")과 age부분이다. request에서 url에 명시된 name과 age 파라미터의 값을 받아와서 출력을 하라는 명령이다. 그런데 이대로 만약 http://localhost:8080/firstweb/param을 들어가면 어떻게 될까? 

name=null

age=nulll

이 나온다. 왜 그런것일까? url에 파라미터가 명시되어 있지 않기 때문이다. 다시 http://localhost:8080/firstweb/param?name=kim&age=5을 입력해주면 name=kim age=5가 나오는 것을 볼 수 있다. 이런 파라미터는 반드시는 url로만 넘어오는 것은 아니다. form이라는 태그에서 input이라는 태그 안에 있는 값들도 똑같은 파라미터로 넘어오기 때문에 똑같이 사용하면 된다.

4. Request, Response 객체 이해하기(4)

앞에서 설명한 정보 외로 다양한 정보를 출력해보자.

response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>info</title></head>");
		out.println("<body>");

		String uri = request.getRequestURI();
		StringBuffer url = request.getRequestURL();
		String contentPath = request.getContextPath();
		String remoteAddr = request.getRemoteAddr();
		
		
		out.println("uri : " + uri + "<br>");
		out.println("url : " + url + "<br>");
		out.println("contentPath : " + contentPath + "<br>");
		out.println("remoteAddr : " + remoteAddr + "<br>");
		
		out.println("</body>");
		out.println("</html>");

이클립스에서 request.get까지만 치면 다양한 메소드들이 나열이 될 것이다. 여기서는 getRequestURL, URI등만 가져왔다.

uri : /firstweb/info
 url : http://localhost:8080/firstweb/info
 contentPath : /firstweb
 remoteAddr : 0:0:0:0:0:0:0:1

이런식으로 결과가 나올 것이다. 앞에서 설명한 바와 같이 uri는 웹 주소 전체가 아닌 식별자이고, url은 정확한 웹 주소이다. 보면 우리 포트번호, 프로젝트 이름, url-mapping까지 나오는 것을 확인할 수 있다. contentPath는 일전에 서블릿을 생성할 때 만들었던 저장할 장소이다. 나중에 이 부분을 아예 없애서 /만 남겨놓을 수도 있다. remoteAddr은 클라이언트 주소값이다. 클라이언트가 요청할때 클라의주소가 다 나온다. 위에 0:0:0...은 로컬 컴퓨터에 접속한 것이기 때문이다.

반응형