웹 페이지를 작성할 때 쓰이는 가장 필수적인 언어는 HTML입니다.
그러나 HTML은 사용자에게 항상 같은 문서를 보여주었고 사용자의 취향이나 요구에 적응하기가 어려웠습니다.
이에 따라 웹페이지를 동적으로 구현하기 위해 다양한 기술들이 등장했습니다.
그리하여 선마이크로시스템스(오라클에 합병됨)사의 자바 기반 서버 스크립트 기술인 서블릿이 개발되었습니다.
오늘은 이 서블릿에 대해 알아보도록 하겠습니다.
서블릿
서블릿은 자바 모듈 형태로 구현되어 있으며 프론트엔드와 백엔드사이에서 정보를 주고받음으로써 동적인 웹페이지를 구현합니다.
다음 예를 보겠습니다.
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.Calendar;
public class SayHello extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
response.setContentType("text/html");
response.setCharacterEncoding("euc-kr");
PrintWriter out = response.getWriter();
String userName = request.getParameter("name");
out.write("<HTML><HEAD><TITLE>ServletTest</TITLE></HEAD>");
out.write("<BODY><H1>");
out.write("Hi, " + userName +"!");
out.write("</H1></BODY></HTML>");
out.close();
}
}
겉으로 보기엔 일반 자바코드처럼 보이지만 잘 보시면 html 에서 볼법한 문구가 괄호안에 쌓여있습니다.
그 이유는 서블릿이 html문서를 작성하기 때문입니다.
response.setContentType("text/html");
라는 명령을 통해 html 문서를 생성할 것임을 선언하고
out.write("...");
을 통해 그 문서의 내용을 작성하게 됩니다.
또한 request.getParameter("name"); 라는 명령을 통해 프론트엔드에서 정보를 받아오고
out.write("Hi, + userName+"!"); 로 사용자의 이름에 따라 다른 문구를 출력하도록 하였습니다.
서블릿은 이러한 식으로 html로는 구현할 수 없는 동적인 웹페이지를 구현합니다.
서블릿의 상속구조
서블릿 클래스를 만들기 위해서는 HttpServlet이라는 추상클래스를 상속받아야 합니다.
또한 HttpServlet도 여러 상위 요소를 상속받고 있습니다.
다음은 서블릿의 상속구조를 나타내는 그림과 표입니다.

Servlet 인터페이스
|
init(), service(), destroy(), getServletInfo(), getServletConfig() 등 각종 Servlet 관련 추상 메서드를 선언합니다.
|
ServletConfig 인터페이스
|
getInitParameter(), getInitParameterNames(), getServletContext(), getServletName() 등 Servlet 기능 관련 추상메서드를 선언합니다..
|
GenericServlet 추상클래스
|
위의 두 인터페이스를 상속받고 일반적인 기능들을 구현한 클래스입니다.
GenericServlet을 상속받아 서블릿을 구현하려면 프로토콜에 따라 각각 service() 메서드를 오버라이딩해서 구현해야합니다.
|
HttpServlet 추상클래스
|
GenericServlet 클래스를 상속받아 Http프로토콜에서 사용되는 기능들을 수행하는 클래스입니다.
요청시 service()가 호출되면서 요청 방식에 따라 doGet()이나 doPost()가 차례로 호출됩니다.
|
서블릿의 생명주기
서블릿은 객체이므로 메모리를 할당하고 정리하는 과정이 필요합니다. 다음은 그러한 기능들을 수행하는 메서드입니다.
생명주기
|
메서드
|
설명
|
초기화
|
init()
|
사용자로부터 첫 요청을 받을시 호출됩니다.
|
작업수행
|
doGet()
doPost()
|
사용자로부터 요청을 받을 때마다 매번 호출되면서 요청하는 작업을 수행합니다.
|
종료
|
destroy()
|
사용자와의 통신이 끝날 때 호출됩니다.
|
init()과 destroy()는 여러분이 직접 구현하지 않더라도 자동으로 생성되지만 doGet()과 doPost()메서드는 여러분이 직접 구현해야합니다.
Service()
doGet()메서드와 doPost()메서드는 여러분이 직접 호출하지 않고 서버에 의해 자동으로 호출됩니다.
지난번 글에서 설명했던 것처럼 서버는 사용자에게서 요청을 받으면 web.xml 문서를 읽어서 요청받은 서블릿 클래스가 어디에 있는지를 알아냅니다.
그 위치가 바로
<servlet>
<servlet-name>서블릿객체이름</servlet>
<servlet-class>서블릿클래스이름</servlet-class> <-이것!
</servlet>
서블릿클래스이름란에 적혀져 있는 것입니다.
따라서 web.xml 코드의 서블릿클래스이름란은 여러분이 HttpServlet을 상속받아서 만든 사용자서블릿 클래스의 이름이 정확히 적혀있어야 합니다.
그렇게 서블릿의 위치를 알아내면 HttpServlet 클래스에 이미 구현되어있는 service()라는 메서드를 호출합니다.
service() 메서드는 사용자의 요청 메서드가 Get방식인지 Post()방식인지를 구별하여 doGet() 또는 doPost() 메서드를 호출합니다.
Request와 Response
doGet()메서드와 doPost() 메서드는 HttpServletRequest 와 HttpServletResponse 객체를 매개변수로 받습니다. 이 두 변수를 통해 서버는 사용자의 요청정보를 불러오고 요청한 내용에 응답할 수 있습니다.
다음 Request 변수와 Response 변수의 메서드를 정리해 놓은 것입니다.
Request 메서드
getParameterNames()
|
요청에 들어있는 매개변수 이름들을 배열로 가져옵니다.
|
getParameter(name)
|
문자열 name과 같은 이름을 가진 매개변수 값을 가져옵니다.
|
getParameterValues(names)
|
문자열 name과 같은 이름을 가진 매개변수 값을 배열로 가져옵니다.
(checkbox나 multiple list 등에 사용)
|
getCookies()
|
모든 쿠키 값을 javax.servlet.http.Cookie의 배열 형태로 가져옵니다.
|
getMethod()
|
현재 요청이 Get인지 Post인지를 알아냅니다.
|
getSession()
|
현재 세션 객체를 가져옵니다.
|
getRemoteAddr()
|
클라이언트의 IP 주소를 알려줍니다.
|
getProtocol()
|
현재 서버의 프로토콜을 문자열 형태로 알려줍니다.
|
setCharacterEncoding()
|
요청내용을 지정한 인코딩 형식에 따라서 읽어들입니다.
|
setAttribute(name,valuel)
|
attribute를 설정합니다. (attribute는 사용자가 임의로 저장하는 속성입니다)
|
getAttribute(name)
|
attribute를 가져옵니다.
|
response 메서드
setContentType(type)
|
문자열 형태의 type에 지정된 MIME Type으로 Content Type을 지정합니다.
|
setHeader(name, value)
|
문자열 name의 이름으로 문자열 value값을 헤더로 설정합니다.
|
setDateHeader(name, date)
|
문자열 name의 이름으로 date에 설정된 밀리세컨드 시간 값을 헤더에 설정합니다.
|
sendRedirect(url)
|
클라이언트 요청을 다른 페이지로 보냅니다.
|
이상 서블릿에 대해 알아보았습니다.
'JSP' 카테고리의 다른 글
4 스코프(Scope) (0) | 2022.09.28 |
---|