위로
아래
동적 웹페이지 제작을 위한 자바 애플리케이션
자바 애플릿 (java applet)
- 서블릿 이전, 웹을 동적으로 만들기 위해, 자바 애플리케이션을 통째로 웹 브라우저에 전송해, 자바 가상 머신을 탑재한 웹 브라우저가 이를 실행하도록 했다.
- 속도, 보안, 유연성 등의 한계가 있어서 서블릿 등장 후 사라졌다.
서블릿 (Servlet)
- 동적 웹 페이지 제작을 위한 웹 애플리케이션 프로그래밍 기술.
- 웹에서 들어온 요청과 돌려주어야 할 응답의 흐름을 간단한 메서드 호출만으로 다루는 기술.
- java 언어 사용. 서블릿은 자바 파일(.java)를 컴파일한 클래스 파일(.class)의 형태이다.
- 서블릿 콘테이너 (Servlet Container) : 서블릿들을 담고 있는 상자. 서블릿을 런타임을 한다. 서블릿의 생성, 실행, 삭제를 담당. 대표적으로 아파치 톰캣.
- html 코딩은 JSP가 낫기 때문에, UI 요소가 없는 제어 용도(MVC 중 Controller) 제작에 자주 쓰인다.
- UI 변수 선언 및 초기화가 선행되어야 한다.
JSP (Java Server Page)
- 동적이라 하더라도 어차피 웹페이지 출력은 html인데, 서블릿은 java 중심의 코드를 사용해 코딩이 어렵다. JSP는 html을 기본으로, 필요한 부분에서만 스크립트 형식으로 java를 사용한다.
- 웹 컨테이너가 JSP 파일(.jsp)을 java파일(.java)로 변환 후, 컴파일을 통해 서블릿 파일(.class)로 변환하여 웹 서버에 돌려준다.
- html 기반이어서 출력 결과물을 만들기 용이한 편이라, MVC 중 View를 만들 때 사용.
- 자주 쓰이는 기능을 내장 객체로 제공하여 즉시 사용 가능.
- 서블릿 파일로 컴파일하기 때문에, 서블릿의 기능도 사용 가능.
서블릿
특징
- 서블릿도 자바 클래스이다.
- webapp 폴더 말고 java 폴더에 만든다.
- 일반 자바프로그램과 달리 독자적으로 실행되지 못하고 톰캣과 같은 JSP/Servlet 컨테이너에서 실행된다.
- 서블릿이 중요한 이유 : 자바 진영에서 사용되는 대부분의 framework의 기본 원리는 servlet 구조를 가지고 있다 (클라이언트의 요청 정보를 외부에 노출시키지 않고 전달 받아 처리한 후 아무도 모르게 다시 클라이언트에게 전달되는 구조)
- 서블릿은 View부분과 Control부분을 독립해서 작업할 수 있는 기본적인 구조를 만들어 준다.
- 스레드 방식으로 실행
- init으로 시작해서 destroy로 끝난다. (init, get, post, destroy 크게 4가지 종류)
- HTML form태그에서 method가 get 방식으로 서블릿을 호출하면 doGet 메소드로 들어간다
- HTML form태그에서 method가 post 방식으로 서블릿을 호출하면 doPost 메소드로 들어간다.
- HttpServlet 클래스는 GenericServlet 클래스를 상속 받고, GenericServlet 클래스는 Servlet, ServletConfig 인터페이스를 구현한다.
- GenericServlet은 여러 프로토콜에서 다 쓸 수 있고, HttpServlet은 HTTP만 쓸 수 있다.
- 요청과 응답에 관련된 API는 javax.servlet.http 패키지에 있다.
HttpServlet 클래스
- HTTP 프로토콜 기반으로 브라우저로부터 요청을 전달 받아 처리하는 클래스.
- 서블릿 클래스 작성 시 HttpServlet 클래스를 상속 받도록 한다.
MVC 모델에서의 서블릿
- 서블릿은 MVC 모델 중 controller 역할.
- MVC 모델에서 Model 부분은 분리하는데 어려움이 없지만, View와 Control 부분의 분리는 쉽지 않다. 두 부분은 직간접적인 연결 고리가 있어야 하기 때문에.
- MVC를 분리해야하는 이유 : 혼자 프로젝트 개발을 할 때에는 혼자서 UI도 만들고 제어 코드도 짜고 서버셋팅과 데이터베이스 설계도 하니까 분리할 필요가 없다. 그러나 실무에서는 디자이너, 퍼블리셔, 스크립터, 코더, 개발자, 시스템 운영자, DB 설계자 등 다양한 직무의 사람들이 모여 하나의 프로젝트에 참여하기에 최대한 서로 독립적인 개발 환경을 만들어주어야 한다.
JSTL 라이브러리(Java Standard Tag library)
데이터를 표현할 때 개발 코드 유형이 아닌 HTML 태그 유형으로 쉽게 데이터를 표현할 수 있게 해주어 View와 Model을 분리하는데 도움을 준다.
서블릿 쓰던 시절 코드 예시
더보기
package ex1;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloServlet
*/
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
response.getWriter().append("-doGet.");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//doGet(request, response);
response.getWriter().append("-doPost.");
}
}
확인은 아래 걸로
----------스크린 띄우기 위한 JSP (서블릿 아님. 확인용임.)-----------
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
out.print("안녕");
System.out.println("Hello");
%>
<form method="post" action="./h">
<input type="submit" value="post 전송">
</form>
<form method="get" action="./h">
<input type="submit" value="get 전송">
</form>
JSP/Servlet 컨테이너
서블릿은 스스로 작동하는 것이 아니라, 관리해주는 그릇이 필요한데, 이를 서블릿 컨테이너라고 부른다.
특징
- 웹 서버와 통신 지원
- web 서버와 통신하기 쉽게 해준다
- 여러 API를 제공하여 복잡한 과정을 생략하게 해준다.
- 멀티스레딩 지원
- 컨테이너는 요청마다 새로운 자바 쓰레드를 생성한다
- 메소드를 다 실행하고 나면 스레드를 알아서 소멸시킨다
- 생명주기 관리
- 보안 관리
- 보안 관련된 내용이 보안관리 XML 배포 서술자에 기록된다.
- 보안 관련된 내용을 서블릿이나 자바 클래스에 구현해 놓치 않아도 된다.
- 수정할 일이
스레드
- 프로세스 : 메모리 상에서 실행 중인 프로그램. 최소 하나의 스레드를 보유하고 있다.
- 스레드 : 프로세스 안에서 실행되는 흐름 단위. 프로세스보다 크기가 작아, 시간이 적게 걸린다.
동작 방식
- 클라이언트가 서블릿에 요청을 하면 Http Request가 컨테이너(톰캣, WAS)로 전송된다.
- 컨테이너는 사용자 요청이나 응답에 대한 HttpServletRequest 객체와 HttpServletResponse 객체를 생성한다.
- 컨테이너는 URL에 맞는 서블릿을 고른 뒤, 스레드를 생성한다. 스레드에 Request 객체와 response 객체를 전달한다.
- 개별 스레드에서 service() 메소드를 호출한다. service() 메소드는 다시 doGet()이나 doPost() 같은 메소드를 호출한다.
- doGet() 메소드는 동적 페이지를 생성하고, 이를 response 객체에 붙여준다.
- 스레드가 수행을 완료하면 컨테이너는 response 객체를 HTTP response로 변경하고 이를 클라이언트에게 반환한다.
- 이후 사용을 다 한 request와 response 객체는 제거한다.
종류
- 톰캣 : 무료
- JEUS : 유료
- Web Logic : 유료
- JBOSS
서블릿(Servlet) 계층 구조
- Servlet 인터페이스
- javax.servlet 패키지에 선언되어 있다
- Servlet 관련 추상 메소드 선언
- init(), service(), destroy(), getServletInfo(), getServeltConfig() 등
- ServletConfig 인터페이스
- javax.servlet 패키지에 선언되어 있다
- Servlet 기능 관련 추상 메소드 선언
- getInitParameter(), getInitParameterNames(), getServletContext(), getServletName() 등
- GenericServlet 클래스
- javax.servlet 패키지에 선언되어 있다
- 일반적인 서블릿 기능을 구사한다.
- 상위 두 인터페이스를 구현한 구현 클래스
- GenericSerblet을 상속받아 구현한 사용자 서블릿은 사용되는 프로토콜에 따라 각각 service()를 오버라이딩해서 구현
- HttpServlet 클래스
- javax.servlet.http 패키지에 선언되어 있다
- GenericServlet 클래스를 상속 받아서 HTTP 프로토콜에서 사용하는 오버라이딩을 거쳐 HTTP 프로토콜에 맞는 서블릿 기능을 수행한다.
- 요청 시 service()가 호출되면서 요청 방식에 따라 doGet(), doPost()가 차례대로 호출된다.
서블릿의 동작 과정
HttpServlet 주요 메소드
//request를 public service()에서 전달받아 doXXX() 메소드를 호출
protected Service (HttpServletRequest req, HttpServletResponse resp)
// 클라이언트의 request를 protected service()에게 전달
public Service (HttpServletRequest req, HttpServletResponse resp)
//서블릿이 GET request를 수행하기 위해 service()를 통해서 호출
protected doGet (HttpServletRequest req, HttpServletResponse resp)
//서블릿이 POST request를 수행하기 위해 service()를 통해서 호출
protected doPost (HttpServletRequest req, HttpServletResponse resp)
//서블릿이 Delete request를 수행하기 위해 service()를 통해서 호출
protected doDelete (HttpServletRequest req, HttpServletResponse resp)
//서블릿이 Head request를 수행하기 위해 service()를 통해서 호출
protected doHead (HttpServletRequest req, HttpServletResponse resp)
서블릿의 생명 주기 (Servlet Life Cycle)
- 서블릿 생명 주기 : 서블릿 실행 단계마다 호출되어 기능을 수행하는 콜백 메소드
- 서블릿도 자바 클래스. 실행하면 초기화 과정, 메모리에 인스턴스 생성, 서비스 수행, 메모리에서 제거 되는 과정을 거친다.
- 이런 과정을 거칠 때마다, 서블릿 생명 주기에 따르는 메소드들을 호출해서 초기화, 데이터베이스 연동, 마무리 작업 등을 수행
- init() 메소드 : 서블릿 요청 시 맨 처음 한 번만 호출. 초기화 작업.
- service() 메소드 : 서블릿 요청이 있을 때마다 재사용되어 호출. 실제로 클라이언트가 요청하는 작업 수행 (재정의 가능)
- 요청방식 : 메소드
- GET : doGet(request,response)
- POST : doPost(request,response)
- PUT : doPut(request,response)
- DELETE : doDelete(request,response)
- HEAD : doHead(request,response)
- OPTIONS : doOptions(request,response)
- TRACE : doTrace(request,response)
- destory() 메소드 : 서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출. 마무리 작업 수행.