정적웹(Static Web)의 구동과정
- 브라우저(웹 클라이언트)가 Apache와 같은 HTTP Server로 HTTP Request(요청)을 보낸다.
- HTTP Request 구조
Request Line : 요청 또는 상태라인, HttpVersion등이 있다
Request Header: (생략가능) HTTP Request 그 자체에 대한 정보를 담고 있다. key:value 형태
Request Body : (생략가능) HTTP Request가 전송하는 데이터를 담고 있는 부분.
보통 POST 요청일 경우 포함되어있다
- HTTP Server는 HTTP Request의 요청을 파악하여 내부에 있는 정적 리소스를 찾아본다. 주로 HTML, CSS, JS와 같은 종류의 리소스를 찾음. 요청을 수행하면 HTTP Response로 응답한다.
서블릿은 Dynamic web Page를 만들때 사용되는 자바 기반의 웹 어플리케이션 프로그래밍 기술이다.
서블릿 Servlet의 특징
- 클라이언트의 Request에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
- JAVA의 스레드를 이용하여 동작한다.
- MVC 패턴에서의 컨트롤러로 이용된다.
- HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
아파치 톰캣과 같은 웹 서버(HTTP Server)를 구동시킨다
- 아파치 톰캣 Apache Tomcat(Http Server + Servlet Container)
자바에서 HTTPServlet 클래스를 제공한다.
Servlet을 만들때 해당 클래스를 상속받아서 구현함.
- 웹 클라이언트(Web Browser)는 HTTP Request를 보낸다
(ex. hello servlet 실행시켜 주세요!)- 웹 서버 (HTTP Server)가 해당 요청을 받는다. 요청을 해석했을 때 정적부분이 아닌 요청임으로 수행할 수 없기 때문에 WAS(Web Aplication Server)에게 전달한다.
WAS는 Servlet Container- Request를 객체화 시킨다. 객체 2개가 생성됨
- HTTP Request : 요청에 대한 부분을 객체화
- HTTP Response : 응답에 대한 부분을 객체화
- 자바 서블렛으로 부터 파생된 Request 객체를 찾는다.
만약 없을 경우 클래스로부터 HelloServlet 객체를 생성- 서블렛 객체가 가지고 있는 Service(), doGet(), doPost()를 오버라이딩 하여 만든다
- 클라이언트의 요청을 처리하기 위해서 스레드를 1개 생성한다
이 스레드가 helloServlet의 메서드를 호출 (즉, 요청이 들어올때마다 스레드가 생성이된다.)- 스레드는 HelloServlet안에 있는 service()메소드를 호출한다. Request, Response객체를 인자로 넣어 준다
- 최종적으로 스레드에 의해 Hello Servlet이 실행된다
요청이 전부 끝나면 Request, Response객체 사라짐, 스레드 사라짐. 하지만 스레드는 한번 생성되면 사라지지 않는다. (다른 스레드가 요청할 수 있기 때문에!)
- servlet은 thread에 의해 공유되고 있는 공유 객체이다
- 스레드는 독립적인 실행흐름을 가짐
- 서블릿은 객체가 여러개 만들어 지지 않는다.
클래스 하나로부터 인스턴스(객체)가 하나만 나오도록 보장하는 프로그램 패턴이 싱글톤 패턴- 여러개의 클라이언트가 요청을 보내면 여러개의 스레드가 생성됨. 여러개의 스레드가 해당 객체의 메서드를 공유해서 사용한다. 따라서 서블릿은 공용객체이며 동기화에 주의해야한다
Servlet 이 가지는 단점
- Response에 포함될 결과 HTML을 JavaProgram 내에 기술한다.
(HTML 코드를 보면 양이 많은데 이게 자바 프로그램 내에 넣음으로서 가독성이 떨어지고 유지보수도 어려워진다.)- JSP - JavaServletPage는 구현이 쉽고 성능도 좋다
JSP == Servlet이라고 생각하면 되고 servlet이 점점 사라지게 되었다
- 웹 클라이언트가 HTTP Request를 호출
- 이번에는 자바 서블렛을 호출하는 것이 아닌 .JSP를 호출한다
- 첫번재 호출 - 컨테이너가 hello.jsp 파일을 읽고 실행요청을 보고 jsp를 java파일(servlet)로 바꾼다
- 자바파일을 컴파일하여 클래스 파일이 생성된다 (hello_jsp.class)
- 해당클래스로부터 인스턴스를 생성(객체생성) == Servlet
- 자동으로 변환되어서 만들어지기 때문에 service(), doGet(),doPost() 없음
- 대신에 _jspService()메소드를 가지고 있다. 스레드가 이 메소드를 호출한다!
(Get, Post방식 구별하지 않고 무조건 호출이 된다)
- 컨트롤러
Servlet이 Controller의 역할을 수행
참고자료
https://webfirewood.tistory.com/38
https://mangkyu.tistory.com/14