티스토리 뷰

Web/정리글

Servlet 정리

구름뭉치 2021. 7. 28. 12:16

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

1. HTML Form

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

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

 

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

  • 요청을 보낼 때 서버의 IP 주소 : Port 번호 / App 이름 / 달라고 요청하는 HTML
  • → localhost:8080/FormHandlingServlet/LoginForm.html
  • IP 주소 : 요청을 보낼 서버의 위치
  • HTML 이름
    1. HTML 이름에 해당하는 HTML 문서를 받는다
    2. browser는 받아온 HTML 문서안의 HTML 태그들 (ex. h2, br)을 기계어로 번역한다
    3. 번역한 내용을 가지고 browser에서 rendering한다

위에서 action="loginServlet"이라고 되어있는데 이를 통해 해당 URL로 request가 간다. WAS에서 어떤 Servlet에게 전달할지 정해주는 것이다

 

Form Tag 속성

action

  • form을 전송할 서버 쪽 스크립트 파일을 지정한다

name

  • form을 식별하기 위한 이름

method

  • form을 서버에 전송하는 방식, HTTP 메서드를 정한다 (get, post)

 

Form Method

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

GET Method

  • 사용자가 입력한 내용 (form data)이 URL 뒤에 텍스트 문자열로 추가된다
  • 브라우저에서 웹 서버로 정보를 전달하는 기본 메서드
    • http 메서드를 지정하지 않으면 get method를 호출
  • 서버에 전달하는 data에 암호와 같은 민감 정보는 GET Method를 사용하지 않는다 (URL은 노출되는 정보이므로)
  • GET Method 사용
    • Query-Type Action : DB에 영향을 주지 않는 단순 읽기 위주의 작업 (read-only)
    • 멱등 행위 (Idempotemt action) : 몇번이고 반복해도 동일한 결과를 낳는 작업

POST Method

  • 사용자가 입력한 내용 (form data)을 별도의 메시지로 보낸다
  • Request Body에 data를 추가한다
    • URL에 직접적으로 data가 노출되지 않으므로 GET Method보다 보안상 조금 더 안전하다
  • POST Method 사용
    • action with side-effects : DB에 영향을 주는 작업 (등록, 수정, 삭제)

2. Servlet

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

  • Server side에서 돌아가는 Java Program
  • 개발자가 작성해야 하는 부분
  • javax.servlet, javax.servlet.http 패키지를 말한다

 

Servlet Container

  • 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
  • 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
  • 서블릿 객체는 싱글톤으로 관리된다. 최초의 요청에만 객체를 생성해서 메모리에 올리고, 나머지 요청은 동일한 객체 인스턴스를 활용한다.
  • 동시 요청을 위한 멀티 쓰레드 처리를 지원한다.

 

Servlet Program의 기본적인 동작과정

  • init() : 서블릿 초기화
  • service() : 클라이언트 요청에 대한 서비스
  • destroy() : 서비스 중지, 자원반납
  1. Web Server는 HTTP Req를 Web Container(Servlet Container)에게 위임한다.
    1. web.xml설정에서 어떤 URL과 서블릿이 매핑되어 있는지 확인
    2. 클라이언트의 요청 URL을 보고 적절한 Servlet을 실행한다
  2. Servlet Container는 service() 메서드를 호출하기 전에 Servlet 객체를 메모리에 올린다.
    1. Servlet Container는 적절한 서블릿 파일을 컴파일한다
    2. .class파일을 메모리에 올려서 서블릿 객체를 생성
    3. 메모리에 로드될 때 서블릿 객체를 초기화 하는 init()메서드가 호출된다
  3. Servlet Container는 Req가 올 때마다 thread를 생성해서 처리한다.
    1. 이때, 적재된 서블릿에게 HttpServletRequest, HttpServletResponse 객체를 생성해서 전달한다
    2. 각 thread는 servlet의 단일 객체에 대한 service() 메서드를 실행한다
    3. 쓰레드는 Servlet의 service() 메소드를 수행, service()메소드는 요청에 맞게 doGet(), doPost() 호출
    4. doGet, doPost는 인자에 맞게 생성된 동적 페이지를 response 객체에 담아서 WAS에 전달
    5. WAS는 response객체를 HttpResponse 형태로 바꿔서 웹 서버에 전달
    6. 생성된 쓰레드가 종료되고, Servlet 객체도 제거된다

 

Servlet Program에서 Thread의 역활

서블릿 프로그램에서 쓰레드가 수행할 메서드가 지정,할당 되면 쓰레드는 생성 후 즉시 해당 메소드만 열심히 수행한다. 해당 메서드가 return되면 쓰레드도 같이 종료되고 제거된다

 

Web Container는 이러한 쓰레드의 생성과 제거를 담당하는데, 쓰레드의 생성과 제거가 반복되면 오버헤드가 크다. 따라서 미리 쓰레드를 만들어놓고 가져다 쓰는데 이러한 방식이 "Thread Pool" (쓰레드 풀) 매커니즘이다

 

즉, WAS는 서블릿 객체의 생성 및 제거를 담당하고, Web Container는 서블릿 객체를 수행하기 위한 쓰레드를 담당한다.

 

서블릿 객체는 req가 오면 → 적절한 서블릿 객체가 선택되고 → 컴파일 되어 .class를 만들고 → 메모리에 적재되며 이때 init()메서드가 호출된다 → 선택된 서블릿 객체의 service()메소드가 쓰레드에 할당되어 일련의 처리 후 서블릿 메서드가 return 되고 → 쓰레드도 같이 제거된다

 

Servlet Life Cycle

클라이언트 요청이 오면 WAS는 해당 요청에 맞는 servlet이 메모리에 있는지 먼저 확인한다

  • 만약 없다면 → 해당 Servlet 클래스를 메모리에 적재하고 → init()메서드를 실행 → service() 메서드를 실행한다
  • 있으면 → 바로 service()메서드를 실행한다

init() : Sevlet 객체를 초기화 한다

  • 단 한번만 수행된다
  • 클라이언트의 req에 따라 적절한 servlet이 생성되고 메모리에 적재되고 난 후 호출

service() : 응답에 대한 모든 구현

  • servlet이 수신한 모든 req에 대해 service()가 호출된다 - 각 서비스는 각 쓰레드에 할당된다
  • 메서드가 return하면 해당 쓰레드는 제거된다
  • service()메소드는 request의 type (GET, POST, PUT, DELETE)에 따라 적절한 메서드 (doGet, doPost, doPut, doDelete)를 호출한다

destroy() : servlet 객체를 메모리에서 제거한다

  • 한번만 수행된다
  • web App이 갱신되거나, WAS가 종료될 때 호출된다

 

Servlet Concurrency

 

  • Java 서블릿 컨테이너 / 웹 서버는 일반적으로 멀티 쓰레드 환경이다
    • 같은 Servlet에 대해 여러개의 요청이 동시에 실행될 수 있어서 runtime에 따라 결과가 달라질 수 있다
    • 즉, servlet은 메모리에 딱 한번만 올라가고 멀티 쓰레드 환경에서 여러 Thread가 하나의 서블릿을 공유하기 때문에 Concurrency Control (병행성 제어)가 필요하다
  • Servlet의 service() 메서드 안의 변수
    • 정적 변수, 멤버 변수 : 공유자원이므로 Mutual Exclusion이 필요하다 (그래서 static 변수의 사용을 안하는게 좋다)
    • 지역 변수 : 쓰레드마다 독립적으로 갖는다 (쓰레드는 쓰레드 별로 스택을 가짐)
반응형

'Web > 정리글' 카테고리의 다른 글

Json Web Token 정리  (0) 2021.08.16
JPA 정리  (0) 2021.08.04
Spring MVC Architecture 정리  (0) 2021.07.27
DAO, DTO 정리  (0) 2021.07.18
Junit Test 환경  (0) 2021.07.12
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday