What we have to do is to be forever curiously
testing new opinions and courting new impressions

우리가 해야 할 일은 끊임없이 호기심을 갖고
새로운 생각을 시험해보고 새로운 인상을 받는 것

Servlet이란

  • Web Service의 기본적인 동작 과정
  • HTML Form
  • Servlet


Web Service의 기본적인 동작 과정

servlet-process

HTML Form → Servlet → HTML Page

  • Input : 사용자가 HTML Form으로 자신의 정보 입력
  • WAS : Servlet이 doGet()이나 doPost()로 DB 또는 다른 소스에서 관련된 정보를 검색 및 처리
  • Output : 응답을 사용자에게 적절한 동적 컨텐츠(HTML Page)형태로 제공

HTML Form

텍스트 상자같은 input elements가 포함된 웹 페이지의 형식

  • 사용자가 입력한 정보를 웹 서버로 전송하기 위한 submit element 존재
  • action에는 form을 처리하는 서버 쪽 URL을 명시

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

  • 요청을 보낼 서버의 IP 주소 : Port 번호 / App 이름 / 달라고 요청하는 HTML
    • localhost:8080/FormHandlingServlet/LoginForm.html
  • IP 주소
    • 요청을 보낼 서버의 “위치”를 의미한다.
    • browser와 WAS(Tomcat)가 같은 PC에 있으면 “IP 주소 = localhost”
  • Port 번호
    • 해당 위치 안의 “특정 사람”을 의미한다.
  • HTML 이름
    1. HTML 이름에 해당하는 HTML 문서를 받아온다.
    2. browser는 받아온 HTML 문서 안의 html 태그들(h2, br, ul)을 parsing(번역)한다.
    3. 마지막으로 이 내용을 browser에서 rendering(구현)한다.

간단한 예시

LoginForm.html

<form name="loginForm" method="post" action="URL">
    Username: <input type="text" name="username"/> <br/>
    Password: <input type="password" name="password"/> <br/>
    <input type="submit" value="Login" />
</form>
  • method=”post”
    • 원하는 동작에 따라 HTTP 메서드(POST/GET)를 사용
  • action=”URL”
    • 해당 URL로 HTTP 메서드가 요청됨(request)
  • type=”submit”
    • 버튼을 누르면 사용자가 입력한 데이터가 WAS로 제출

Form Methods

form을 서버에 전송하는 방식으로, 두 가지 HTTP 메소드 중 지정

  1. GET Method
    • 사용자가 입력한 내용(form data)이 URL 뒤에 텍스트 문자열로 추가된다.
      • 크기 제한: 1024 characters
      • data는 ?를 기준으로 action URL과 분리된다.
      • 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에 영향을 주는 작업

Form Tag

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

  • action : form을 전송할 서버 쪽 스크립트 파일 지정
  • name : form을 식별하기 위한 이름 지정
  • accept-charset : form 전송에 사용할 문자 인코딩을 지정
  • target : action에서 지정한 스크립트 파일을 현재 창이 아닌 다른 위치에서 열리도록 지정
  • method : form을 서버에 전송하는 방식으로, HTTP 메서드 지정 (GET 또는 POST)
  • enctype : 넘기는 Content의 Type 지정 (주로 파일을 넘길 때 사용)
    • type은 multipart/form-data로 지정해서 사용


Servlet

개념 정의

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

기본적인 동작 과정

  1. Web Server는 HTTP request를 Container로 전달
    • web.xml 설정에서 어떤 URL과 매핑되어 있는지 확인
    • 클라이언트(browser)의 요청 URL을 보고 적절한 Servlet을 실행
  2. Container는 Servlet 객체를 메모리에 생성
    • Container는 적절한 Servlet 파일을 컴파일(.class 파일 생성)
    • .class 파일을 메모리에 올려 Servlet 객체 생성
    • 메모리에 로드될 때 Servlet 객체를 초기화하는 init() 메서드 실행
  3. Container는 Request가 올 때마다 thread를 생성하여 처리
    • 각 thread는 Servlet의 단일 객체에 대한 service() 메서드를 실행

Servlet Program에서 Thread의 역할

Servlet의 doGet() 또는 doPost()를 호출

Container는 thread의 생성과 제거를 담당

하지만 thread의 생성과 제거의 반복은 큰 오버헤드를 생성

  • 이를 위해 Tomcat(WAS)은 미리 thread를 생성해 놓는 Thread Pool이라는 적절한 메커니즘을 사용하여 오버헤드 생성을 방지
  • 즉, WAS는 Servlet의 객체 생성과 소멸의 life cycle을 담당

Servlet Life Cycle

servlet-life-cycle

WAS에서 클라이언트의 요청 확인

WAS가 해당 요청에 해당하는 Servlet이 메모리에 있는지 확인

메모리에 없다면 해당 Servlet Class를 메모리에 올려서 Servlet 객체 생성

Servlet 객체 사용을 준비하기 위한 init 실행

Servlet 객체를 사용하기 위한 service 실행

이미 메모리에 Servlet 객체가 있다면 바로 service 메서드 실행

  • init()
    • 한 번만 수행
    • Servlet 객체를 초기화
    • 클라이언트(browser)의 요청에 따라 적절한 Servlet이 생성되고 이 Servlet이 메모리에 로드될 때 init()
  • service(request, response)
    • 응답에 대한 모든 내용은 service() 메서드에 구현
    • Servlet이 수신한 모든 request에 대해 service() 메서드가 호출
    • request의 type(HTTP Method: GET, POST, PUT, DELETE 등)에 따라 적절한 메서드(doGet, doPost, doPut, doDelete 등)를 호출
    • 메서드가 return하면 해당 thread는 제거
  • destroy()
    • 한 번만 수행
    • Servlet 객체를 메모리에서 제거
    • Web Application이 갱신되거나 WAS가 종료될 때

Servlet Concurrency

servlet-concurrency

Java 서블릿 컨테이너 / 웹 서버에서 Servlet은 메모리에 한 번 올라오고 일반적으로 멀티 쓰레드 환경이어서 여러 thread가 하나의 Servlet을 공유하기 때문에 Concurrency Control(병행성 제어)가 필요

Servlet Annotation

Servlet API 3.0부터 javax.servlet.annotation 지원

  • Tomcat 7 이상에서 사용 가능 Annotation은 Web Deployment Descriptor 파일(web.xml)의 XML 설정을 대체


댓글남기기