Servlet의 개념과 동작 과정을 이해한다.

Goal

  • Web Service의 기본적인 동작 과정을 이해한다.
  • 사용자 입력을 위한 HTML Form을 이해한다.
  • Servlet을 이해한다.

Web Service의 기본적인 동작 과정

HTML Form -> Servlet -> HTML Page

  1. 사용자가 웹 페이지 form(HTML Form)을 통해 자신의 정보를 입력한다. (Input)
  2. Servlet의 doGet() 또는 doPost() 메서드는 입력한 form data에 맞게 DB 또는 다른 소스에서 관련된 정보를 검색한다.
  3. 이 정보를 이용하여 사용자의 요청에 맞는 적절한 동적 컨텐츠(HTML Page)를 만들어서 제공한다. (Output)

1. HTML Form

input elements(Ex. 텍스트 상자)가 포함된 웹 페이지의 한 부분(section)

클라이언트(browser)가 요청하는 URL 정보

LoginForm.html 내용 (간단한 예시)

<form name="loginForm" method="post" action="loginServlet">
    Username: <input type="text" name="username"/> <br/>
    Password: <input type="password" name="password"/> <br/>
    <input type="submit" value="Login" />
</form>

Form Tag 속성

Form Tag 속성을 이용하여 어디로, 어떤 방식으로 전송할지 정한다.

Form Methods

form을 서버에 전송하는 방식으로, 두 가지 HTTP 메소드 지정할 수 있다.

  1. GET Method
    • 사용자가 입력한 내용(form data)이 URL 뒤에 텍스트 문자열로 추가된다.
      • 크기 제한: 1024 characters
      • data는 ?를 기준으로 action URL과 분리된다.
      • Ex. http://www.test.com/hello?key1=value1&key2=value2
    • 브라우저에서 웹 서버로 정보를 전달하는 기본 메서드(Default Method)
      • HTTP 메서드를 지정하지 않으면 GET Method를 호출한다.
    • 서버에 전달하는 data에 암호와 같은 민감한 정보가 있는 경우는 GET Method를 사용하지 않는다.
      • URL은 모두에게 노출되는 정보이기 때문에 보안상 적절하지 않다.
    • GET 메서드의 사용
      • Query-Type actions: DB에 영향을 주지 않는 단순히 읽기 위주(read operation)의 작업
      • Idempotemt actions: 몇 번이고 같은 연산을 반복해도 같은 값이 나오는 작업
  2. POST Method
    • 사용자가 입력한 내용(form data)을 별도의 메시지로 보낸다.
    • Request Body에 data를 추가한다.
      • URL에 직접적으로 data가 노출되지 않기 때문에 GET Method보다 보안상으로 조금 더 안전하다.
    • POST 메서드의 사용
      • actions with side-effects: DB에 영향을 주는 작업

2. Servlet이란

Servlet의 개념

웹 기반의 요청에 대한 동적인 처리가 가능한 하나의 클래스이다.

Servlet Program의 기본적인 동작 과정

  1. Web Server는 HTTP request를 Web Container(Servlet Container)에게 위임한다.
  2. Web Container는 service() 메서드를 호출하기 전에 Servlet 객체를 메모리에 올린다.
    • 1) Web Container는 적절한 Servlet 파일을 컴파일(.class 파일 생성)한다.
    • 2) .class 파일을 메모리에 올려 Servlet 객체를 만든다.
    • 3) 메모리에 로드될 때 Servlet 객체를 초기화하는 init() 메서드가 실행된다.
  3. Web Container는 Request가 올 때마다 thread를 생성하여 처리한다.
    • 각 thread는 Servlet의 단일 객체에 대한 service() 메서드를 실행한다.

참고 Servlet Program에서 Thread의 역할

Servlet Life Cycle

Servlet의 메서드 구현 (간단한 예시)

// `javax.servlet.http.HttpServlet`를 상속받은 Servlet 클래스
public class LoginServlet extends HttpServlet {
    // doPost()를 재정의 
    protected void doPost(HttpServletRequest request, HttpServletResponse response throws ServletException, IOException {
        // read form fields
        String username = request.getParameter("username");
        String password = request.getParameter("password");
         
        // get response writer
        PrintWriter writer = response.getWriter();

        /* 여기서 -> DB 접근 등 Business Logic 부분을 처리 */
         
        // build HTML code (view 생성 부분)
        String htmlResponse = "<html>";
        htmlResponse += "<h2>Your username is: " + username + "<br/>";      
        htmlResponse += "Your password is: " + password + "</h2>";    
        htmlResponse += "</html>";
         
        // return response
        writer.println(htmlResponse);         
    }
}

Servlet Concurrency

Servlet Annotation

@WebServlet(value = "/Simple", 
initParams = {@WebInitParam(name="foo", value="Hello "), 
              @WebInitParam(name="bar", value=" World!")}) 
public class Simple extends HttpServlet { 
    protected void doGet(HttpServletRequest request, HttpServletResponse response throws ServletException, IOException {
	      response.setContentType("text/html"); 
	      PrintWriter out=response.getWriter(); 

	      out.print("<html><body>"); 
	      out.print("<h3>Hello Servlet</h3>"); 
	      out.println(getInitParameter("foo")); 
	      out.println(getInitParameter("bar")); 
	      out.print("</body></html>"); 
    } 
} 

관련된 Post

References