본문 바로가기
Spring/이론

Servlet

by 모스키토끼 2020. 3. 4.

정적 페이지 vs 동적 페이지

1. 정적 페이지

- 서버가 경로 이름을 받고 해당 컨텐츠 파일을 반환한다. -> 항상 같은 페이지만 제공하므로 지루하다.

2. 동적 페이지

- 요청하는 파라미터에 따라 다른 결과의 페이지를 제공

 

Web Service Architecture

Client(browser, mobile app) <-> WAS(Web Application Server) <-> DB(MySQL)

  • WAS
    • Web Server: 컨테이너로 요청을 보내고 요청 결과를 변환하에 클라이언트에게 응답한다.
    • Servlet Container: (JSP, Servlet)가 들어있으며 동적으로 요청을 처리한다.

Servlets 개요

  • 웹 기반 요청들의 동적 처리에 이용되는 서버 사이드 자바 프로그램
  • form들을 통해 유저들의 input을 모을 수 있다.
  • db나 다른 소스들의 레코드를 처리할 수 있다.
  • 웹 페이지를 동적으로 만들 수 있다.
  • 서블릿은 서블릿 기능을 지원하는 WAS에 존재한다.

과정: client -> form submit request -> servlet response -> html page result -> client

 

Form 메서드

-GET, POST ...

  • GET: url에 쿼리값을 붙여서 보낸다. -> url은 암호화가 불가능 하므로 get 메서드는 암호화 불가능
  • POST: body에 값을 넣어서 보낸다. -> body는 암호화 가능 -> POST 메서드 암호화 가능

참고:

- https에서 s는 secure -> body 부분을 암호화 해주어 브라우저와 서버 사이에 주고 받는 데이터들을 모두

암호화 된다.

 

Servlet 프로그램

과정

- Web Server 요청 -> Servlet Container -> Servlet 로드 -> Thread(Container에서 생성)가 service 처리

  • 서버로 들어오는 HTTP 요청은 서블릿 컨테이너에 위임
  • 서블릿 컨테이너는 service () 메소드를 호출하기 전에 서블릿을 로드
  • 서블릿 컨테이너는 요청개수 만큼 여러 스레드를 생성하여 여러 요청을 처리
  • 각 스레드는 서블릿의 단일 인스턴스의 service () 메소드를 실행.
  • 요청이 들어온 뒤 일어나는 과정은 모두 JVM 안에서 이뤄지는 것

서블릿 생명주기

- init() -> service() -> destroy()

  • inite은 처음 생성될 때 destroy는 서블릿 컨테이너에 의해 unload 됐을 때 각 각 한번씩만 호출된다.
  • 서블릿 객체가 생성 될 때, init 메서드가 호출된다.
  • 서블릿이 받은 모든 요청에 대해 service 메서드가 호출된다.
  • service 메서드는 HTTP 요청 타입을 체크하여 적절한 메서드를 호출한다.

 

사용 예시 코드

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Hello extends HttpServlet {

    protected void doPost(HttpServletRequest request, 
	HttpServletResponse response) throws ServletException, IOException {
	
	// read form fields
    // getParameter: form 값을 받기 위한 메서드
    // getParameterValues:하나 이상의 form 값을 받기 위한 메서드(ex, checkbox) 
	String username = request.getParameter("username");
	String password = request.getParameter("password");

	// get response writer
    // 응답할 때 사용자에게 보여줄 html content를 만들기 위해 사용하는 메서드
	PrintWriter writer = response.getWrite();

	// build HTML code
	String htmlResponse = "<html>";
	htmlResponse += "<h2>Your username is: " + username + "<br/>";
	htmlResponse += "Your password is: " + password + "</h2>";
	htmlResponse += "</html>";

	// return response
	writer.println(htmlResponse);    
    }
}

서블릿 병행성

- 자바 서블릿 컨테이너는 전형적인 멀티 쓰레드 환경이다.

 

참고:

- Thread란? 
예시)  Thread와 Process의 관계는 학교과 학생의 관계와 같다. 
 Process는 작업을 할 수 있도록 환경을 제공해주는 것, 실제로 작업하는 것은 Thread, Process는 Thread에게 미션을 준다. 한개의 Thread는 반드시 main함수를 수행한다. 함수를 수행하고 return을 한다면 그 Thread는 없어진다. 

- Thread에는 각각 메모리가 할당 되는데 stack이라는 메모리를 가지고 함수를 수행한다. 
- stack에는 지역변수,함수 인자들이 들어간다. 
- 전역변수는 Thread들이 공유하는 변수 

multi Threadiy을 하는 이유 
-> 응답시간을 줄이기 위해서

-> multi Threadiy 에서 Thread간에 동기화가 필요하다. 동기화에는 상호배제가 필요

 

CS : critical section (임계 영역) : CS에 Thread가 들어와 작업을 하고 한 Thread가 작업을 하는 도중에 다른 Thread가 작업을 하려고 접근을 한다면 상호배제를 해준다. -> blocking 
(화장실과 같은 원리) 

위와 같은 것들을 지켜주지 않으면 원하는 값이 나오지 않는다. -> 논리의 문제가 아니라 타이밍의 문제 

※맴버 변수, Static 변수가 있는 경우 상호배제를 반드시 해줘야한다.

 

댓글