정적 웹 페이지 vs 동적 웹 페이지
정적 웹 페이지
서버(Web Server)에 미리 저장된 파일(HTML, css, JS, 이미지 등)을 불러와 구성하는 페이지로, 변하지 않는 페이지를 뜻한다. 모든 이용자에게 동일한 내용을 보여주며, 한번 작성된 후에 변동을 보여주지 않는 웹 페이지이다.
동적 웹 페이지
서버에 있는 데이터들을 사용자의 Request에 따라 가공 처리한 후 구성하는 페이지이다. 즉, 사용자에게 반응하여 다른 화면을 보여주는 페이지로, 장바구니나 게시판 등이 동적 웹페이지라고 할 수 있다.
- 웹 개발시 HTML은 정적인 웹페이지만 구현이 가능하였다. 이를 java를 통해 동적 웹페이지를 작성하기 위해 나온 것이 Servlet class이다.
Servlet
클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 기술
- Servlet class는 서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스이다.
- 예를 들어, 유저가 로그인 시도시에 아이디와 비밀번호를 입력하고 로그인 버튼을 누를 때, 서버가 클라이언트에서 들어오는 아이디와 비밀번호를 확인하고 다음 페이지를 띄워주는데 이러한 역할을 수행하는 것이 Servlet class이다.
- 독자적으로 실행할 수 없으며, 톰캣과 같은 JSP/Servlet 컨테이너에서만 실행 가능하며, 컨테이너 독립적으로 실행된다.
- 서블릿은 서버에서 실행되다가 웹 브라우저에서 요청을 하면 해당 기능을 수행 후, 웹 브라우저에 결과를 전송한다.
- MVC 패턴에서의 컨트롤러로 이용된다.
- HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받아 구현해야 한다.
- java 코드 안에 HTML 코드. servlet이 수정된 경우 Java 코드를 컴파일(.class 파일 생성)한 후 동적인 페이지를 처리하기 때문에 전체 코드를 업데이트 하고 다시 컴파일한 후 재배포하는 작업이 필요하다.
Servlet 동작 방식
- 클라이언트가 URL로 요청을 보내면 HTTP Request를 Servlet Container로 전송
- Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
- web.xml은 사용자가 요청한 URL을 분석하여 어느 서블릿에 대해 요청을 한 것인지 찾는다.
- 해당 서블릿에서 service 메서드를 호출한 후 클라이언트의 POST, GET 여부에 따라 doGet() 또는 doPost()를 호출한다.
- doGet(), doPost()는 동적 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.
- 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.
Servlet 생명주기
- 클라이언트의 요청이 들어오면 컨테이너는 현재 실행할 서블릿이 최초의 요청인지 판단하고(해당 서블릿이 메모리에 있는지 확인하고), 실행할 서블릿 객체가 메모리에 없을 경우 서블릿을 메모리에 로딩하고 객체를 생성한다. 서블릿은 최초 요청이 들어왔을 때 한번만 객체를 생성하고, 이때 생성된 객체를 계속 사용한다.
- init() 메소드는 서블릿 객체 생성 후 호출되는 메소드로서, 주로 서블릿 객체의 초기화 작업이 구현되어 있다.
- service() 메소드는 실행하는 서블릿의 요청 순서에 상관없이 클라이언트의 요청이 있을 때마다 실행된다. 따라서 service() 메소드에는 실제 서블릿에서 처리해야 하는 내용이 구현되어 있다.
- 클라이언트의 요청에 따라서 service() 메소드를 통해 요청에 대한 응답이 doGet()과 doPost()로 분기된다. 이 때 서블릿 컨테이너가 클라이언트의 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServleResponse에 의해 request와 response 객체가 제공된다.
- 컨테이너가 서블릿에 종료 요청을 하면 destroy() 메소드가 호출되는데 마찬가지로 한번만 실행되며, 종료시에 처리해야 하는 작업들은 destroy() 메소드를 오버라이딩하여 구현하면 된다.
Servlet Container
서블릿을 관리해주는 컨테이너. 즉, Servlet을 이용해 작성된 프로그램을 실행, 관리해준다. 서버에 서블릿을 만들었다고 해서 스스로 작동하는 것이 아니고, 서블릿을 관리해주는 것이 필요한데, 그 역할을 하는 것이 서블릿 컨테이너이다.
- 서블릿 컨테이너는 클라이언트의 Request를 받고 Response를 할 수 있게 웹서버와 소켓으로 통신한다.
- 대표적인 예로 Tomcat이 있다. 톰캣은 실제로 웹서버와 통신하여 JSP와 Servlet이 작동하는 환경을 제공해준다.
Servlet Container 역할
-
웹서버와의 통신 지원
서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 해준다. 일반적으로 소켓을 만들고 listen, accept 등을 해야하지만 서블릿 컨테이너는 이러한 기능을 API로 제공하여 복잡한 과정을 생략할 수 있게 해준다. 그래서 개발자가 서블릿에 구현해야 할 비지니스 로직에 대해서만 초점을 두게끔 도와준다.
-
서블릿 생명주기 관리
서블릿 컨테이너는 서블릿 클래스를 로딩하여 인스턴스화하고, 초기화 메소드를 호출하고, 요청이 들어오면 적절한 서블릿 메소드를 호출한다. 또한 수명이 다 된 서블릿을 적절하게 가비지 콜렉터를 호출하여 필요없는 자원 낭비를 막아준다.
-
멀티쓰레드 지원 및 관리
서블릿 컨테이너는 Request가 올 때마다 새로운 자바 쓰레드를 하나 생성하는데, HTTP 서비스 메소드를 실행하고 나면, 쓰레드는 자동으로 종료된다. 원래는 쓰레드를 관리해야 하지만 컨테이너가 다중 쓰레드를 생성 및 운영해주니 쓰레드의 안정성에 대해서 걱정하지 않아도 된다.
-
선언적인 보안 관리
서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현해 놓지 않아도 된다. 일반적으로 보안관리는 XML 배포 서술자에다가 기록하므로, 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능하다.
JSP(Java Server Pages)
- 웹 사용자가 폭발적으로 증가하고, 웹 페이지도 복잡해지고 고도화됨에 따라 개발자와 디자이너의 분업이 일어나기 시작했다. 서블릿의 기능 중 화면 부분을 자바와 서블릿 코드에 익숙하지 않은 디자이너가 쉽게 작업하기 위해 JSP가 등장하였다.
- 기본적으로 HTML 코드 형식을 하되, 중간에 Java 코드를 넣어 동적인 웹 페이지를 생성할 수 있다.
- Java 컨테이너는 JSP 파일의 HTML 코드와 자바코드를 분리하여 class 파일을 만들고 실행한다.
- Servlet을 보완하고 기술을 확장한 스크립트 방식 표준. 뷰, html 작성에 용이. JSP가 수정된 경우 재배포할 필요 없이 WAS가 알아서 처리한다.
- JSP 는 먼저 Servlet(.java) 파일로 변환된다. 그리고 이렇게 변환된 서블릿 파일을 다시 컴파일해서 .class 파일로 만든 뒤 실행한다. 실행 결과는 자바 언어가 모두 사라진 HTML 코드가 된다.
- 이와 같은 특징으로 일반적으로 jsp는 화면 구성에 사용되고 서블릿은 로직을 수행하는데 사용되는 경우가 많다.
참조
JSP와 Servlet이란 무엇인가?
Servlet(서블릿) 이란
Web Server와 Web Application Server