본문으로 바로가기

객체 생성 및 삭제


클라이언트의 요청으로부터 시작되는 웹서버의 처리 순서를 알아보면 다음과 같다.

  1. 클라이언트가 웹 브라우저에서 서비스를요청한다. 이때 HTTP 프로토콜 기반으로 요청정보가 만들어져 웹서버에 전달된다.

  2. 웹서버는 클라이언트로부터 전달받은 요청정보의 URI를 살펴보고, 서블릿이라면 서블릿 컨테이너에 처리를 넘긴다.

  3. 서블릿 컨테이너는 요청받은 서블릿 클래스 파일을 찾아서 실행한다.

  4. 실행할 때 첫 순서는 최초의 요청인지를 파악한다. 최초의 요청이라면 메모리에 로딩 후 객체를 생성하고 init()메소드를 호출한다.

  5. init()메소드 실행이 끝난 후에는 '서블릿 실행 요청이 들어올때 마다' 실행되는작업으로 서블릿 컨테이너는 HttpServletRequest  HttpServletResponse 객체를 생성한다.
    - HttpServletRequest객체
     : 클라이언트로부터 요청받은 정보를 처리할 목적으로 생성
    - HttpServletResponse 객체 : 클라이언트에게 보내는 응답 정보

  6. service() 메소드를 호출한다. 이때, 앞에서 생성한 HttpServletRequest  HttpServletResponse 객체의 주소를 인자로 넘긴다. service() 메소드에서는 인자로 받은 두 객체를 사용하여 프로그램을 구현한다.

  7. service() 메소드가 완료되면 클라이언트에게 응답을 보내고 서버에서 실행되는 프로그램은 완료된다.이때 HttpServletRequest  HttpServletResponse 객체는 소멸된다.

 

HttpServletRequestHttpServletResponse 객체는 service() 메소드가 실행되기 전에 생성되었다가 끝나면 소멸한다.

따라서 service() 메소드가 실행되는 동안에만 메모리에 상주하고 있어서 그동안에만 사용할 수 있다.

 

 

 

응답정보 처리 HttpServletResponse


서비스를 요청한 클라이언트에게 응답하기 위한 기능을 처리할 때 javax.servlet 패키지의

  • ServletResponse : 일반적인 네트워크 통신에서의 응답 관련 메소드 제공
  • HttpServletResponse : HTTP 통신 기반의 응답 관련 메소드 확장 제공

인터페이스를 이용한다.

 

ServletResponse 와 HttpServletResponse의 메소드는 아래의 API문서를 참고 하자.

https://docs.oracle.com/javaee/7/api/javax/servlet/ServletResponse.html

 

 

출력응답 / 한글응답

HttpServletResponse 객체를 활용하여 클라이언트 쪽으로 문자열을 전송한 다음, 웹 브라우저에 문자열을 출력하는 예제를 보자

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 *  /showtime 요청에 대해서 응답할 서블릿 정의 하기
 *  
 *  1. HttpServlet 클래스를 상속받는다.
 *  2. service() 메소드를 오버라이딩 한다.
 *  3. @WebSerlvet("/showtime") 요청 경로를 어노테이션으로 등록한다.
 * 
 */
@WebServlet("/showtime")
public class ShowTimeServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//응답 한글 인코딩 설정
		resp.setCharacterEncoding("utf-8");
		//응답 content type 설정(html 페이지를 응답하겠다고 알리기)
		resp.setContentType("text/html; charset=utf-8");
		
		//요청한 클라이언트에게 문자열을 출력할 수 있는 객체(클라이언트의 웹브라우저에 출력된다.)
		PrintWriter pw=resp.getWriter();
		pw.println("<!DOCTYPE html>");
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<meta charset=\"UTF-8\">");
		pw.println("<title>Insert title here</title>");
		pw.println("</head>");
		pw.println("<body>");
		//날짜 객체를 생성
		Date d=new Date();
		//현재 날짜 시간 정보를 문자열로 간단히 얻어내기
		String info=d.toString();
		pw.println("<p>현재 시간 : <strong>"+info+"</strong></p>");
		pw.println("</body>");
		pw.println("</html>");
		//출력 스트림 끊어주기
		pw.close();
	}
}

RUN을 해서 서버를 실행해보면 

브라우저에 다음과 문자열이 잘 출력된 것을 확인할 수 있다.

[페이지 소스보기]를 하면 HTML 문서 형식의 문자열이 전달된 것을 확인할 수 있다.

 

 

 

요청 정보 처리HttpServletRequest


브라우저에 적절한 URL 문자열을 이용하여 웹서버에 서블릿 수행을 요청할 때 일정한 형식의 다양한 정보를 서버로 전달한다. 이때 클라이언트가 서버로 전달하는 요청정보들은 다음과 같다.

  • 클라이언트의 IP 주소, 포트 번호
  • 클라이언트가 전송한 요청 헤더 정보
    (클라이언트에서 처리 가능한 문서 타입의 종류, 클라이언트 프로그램 정보, 처리 가능한 문자셋 정보, 쿠키 정보)
  • 요청방식, 요청 프로토콜의 종류와 버전, 요청하는 파일의 URI, 요청받은 서버의 정보
  • 서버의 호스트 이름, 포트 번호
  • 사용자가 서블릿 요청시 추가로 전달한 정보
  • 질의(Query)문자열(웹서버에 서비스를 요청하면서 추가로 전달한 name=value 형태의 데이터)

 

위의 요청 정보들은 HttpServletRequest 인터페이스의 getXXX() 메소드를 통해 추출할 수 있고,

HttpServletRequest는 service()나 doGet() 또는 doPost() 메소드의 첫 번째 인자로 전달된다.

HttpServletRequest는 ServletRequest를 상속받는다.

 

  • ServletRequest : 일반적인 네트워크 통신에서의 요청 관련 메소드 제공
  • HttpServletRequest : HTTP 통신 기반의 요청 관련 메소드를 확장하여 제공

 

내가 개발한 서블릿이 service() 메소드를 재정의하지 않았다면 다음과 같은 순서로 처리된다.

 

요청정보 추출과 관련된 ServletRequest와 HttpServletRequest 인터페이스의 메소드는 아래의 API 문서에서 찾아볼 수 있다

https://docs.oracle.com/javaee/7/api/javax/servlet/ServletRequest.html