JSP/Servlet | 서블릿(Servlet) | 서블릿과 JSP의 차이


서버 사이드 Java의 기본이라 할 수 있는 기술은 JSP 외에 또 하나가 있다. 그것은 “서블릿(Servlet)“이다. 이 두개는 도대체 어떻게 다른가?

대답은 “같다” 이다. 즉, JSP와 서블릿은 같은 것이다. 더 정확하게 말하자면, “JSP라는 서버 사이드 자체 스크립트 언어"라는 것은 존재하지 않는다. JSP는 사실 서블릿이기 때문이다.

좀 정리해보자. 서버 사이드 Java 프로그램은 일반적인 응용 프로그램과는 많이 다르다. 응용 프로그램은 그 프로그램을 기동시켜 실행하지만, 서버 사이드 Java 프로그램은 그렇지 않는다.

서버 사이드에는 Java 서버라는 것이 있고, 그 속에서 움직이는 프로그램을 개발하는 구조로 되어 있다. 예를 들면 Web 브라우저에서 “애플릿(Applet)“이라는 작은 프로그램을 포함하여 움직이는 것과 같다고 생각하면 된다. 애플릿은 응용 프로그램이 아니다. 미리 작은 프로그램을 실행하는 틀이 있고, 그 틀에 맞추어 만들어진 프로그램을 Web 페이지에 끼워 넣으면 자동으로 인식되어 움직인다.

서버 사이드도 마찬가지이다. Java 서버에는 그 안에서 프로그램을 작동시키기 위한 구조가 준비되어 있다. 그리고 그 구조에 따라 프로그램을 만들고 포함해 두었다. 사용자가 그 프로그램에 할당된 URL에 액세스하면 Java 서버는 그 프로그램을 실행하도록 되어 있다.

이 “Java 서버에서 움직이는 작은 프로그램"이 서블릿이다. “Web 페이지와 애플릿"를 그대로 “Java 서버와 서블릿"로 대체 생각해 보자.

그럼 JSP란 무엇인가? 서블릿은 결국에는 Java 프로그램이기 때문에, 만드는 것도 좀 힘들다. 모두 Java로 코딩해야 한다. 단지 내부의 처리뿐만 아니라 클라이언트(즉, Web 브라우저)에 표시되는 HTML 코드도 모두 Java 코드로 쓰지 않으면 안된다. HTML을 모두 println에서 만드는 상상해 보자. 대부분 어려운 작업이라고 생각이 될 것이다.

그래서 “더 간편하게 서버 사이드 Java를 사용할 수 있도록” 하는 것으로 생각된 것이 JSP이다. Java 서버가 수행하고 있으며, “간단한 태그를 사용하여 작성된 Java 코드를 바로 실행하는 것"은 사실 없다.

Java 서버는 JSP 코드를 읽어 들여, 그것을 서블릿 소스 코드로 변환한다. HTML 태그 등도, 모든 println으로 쓰여지도록 변환되는 것이다. 그렇게 생성된 서블릿 소스 코드를 컴파일하고, 서블릿을 생성하여 그것을 호출한다. 즉, “JSP가 서블릿"이 되는 것이다.

JSP Servlet Complie

같다고는 하지만, 접하는 사용자에게는 상당히 차이가 있다. JSP는 HTML 안에 처리를 포함할 수 있기 때문에, HTML 페이지에 뭔가를 추가하는 경우에는 매우 편리하다. 반대로 서블릿은 HTML으로 자세하게 출력 등을 하지 않아도 되는 곳에서 활용하면 쓸모가 있다. 즉, 프런트 엔드(사용자에게 표시되는 측면)은 JSP으로 하고, 백엔드(서버에서 움직이는 보이지 않는 측면)은 서블릿으로 하는 방식으로 양쪽을 잘 구분하여 사용하면 좋다.

서블릿 버전

서블릿의 기본적으로 만드는 방법의 설명에 들어가기 전에 하나를 알아두어야 하는 것이 있다. 그것은 “서블릿 버전"이다.

서블릿도 서버 사이드 Java의 API로써 제공되고 있다. 물론 계속 향상되고 있으며, 때때로 버전 업하면 다양한 기능을 사용할 수 있게 된다. 문제는 “최신 버전에서 서블릿을 만들어도, 사용하는 서버(즉, WAS)가 지원하지 않으면 사용할 수 없다"는 점이다.

현재 서블릿을 이용하려고 하면 버전은 명확하게 두 가지로 나뉜다고 해도 좋을 것이다. 그것은 “3.0"이전과 이후이다. 서블릿 3.0에서 상당히 큰 개선이 이루어 졌으며, 만드는 방법도 많이 바뀌었다(기본 코드는 변함이 없지만). 3.0 이전에는 서블릿 코드 외에 설정 파일 등을 작성하지 않으면 안되지만, 3.0에서 서블릿 코드만 작성하면 다른 어떤 것도 필요 없게 되었다.

여기서 현재 서버, 서블릿, JSP 정보를 볼 수 있는 예제를 만들어 보도록 하자.

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Info jsp</title>
<style>
h1 {
    font-size: 16pt;
    background: #AAFFAA;
    padding: 5px;
}
</style>
</head>
<body>
    <h1>Sample jsp page</h1>
    <p>이 페이지는 샘플입니다.</p>
    <p>서버 정보 :<%=application.getServerInfo()%></p>
    <p>서블릿 정보 : <%=application.getMajorVersion()%>.<%=application.getMinorVersion()%></p>
    <p>JSP 정보 : <%=JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion()%></p>
</body>
</html>

위에서 application에서 서버 및 서블릿 정보를 얻어와서 표시를 하고, JspFactory 객체에서 스팩에 대한 버전 정보를 표시하고 있다.

GAE에서 지원하는 서블릿 버전

GAE는 사실 아직 3.0을 지원하지 않는다. 그 이전의 “2.5"이라는 버전이 있다. 따라서 최신 버전에 비해 여러가지 귀찮다. 이 입문은 GAE를 사용하지만, 기본적으로 “JSP/서블릿 입문"이다. 따라서 3.0에 대해서도 언급하고자 하지만, GAE에서는 동작하지 않는다. 그래서, “2.5 기반으로 만들어 가지만, 일단 3.0에 대해도 설명을 해 둘것 이기에, 만약 GAE가 지원되게 되면 스스로 고쳐서 해보길 바란다"라는 접근법으로 가고자 한다.

서블릿 버전표

Servlet Spec JSP Spec 웹소켓 스펙 톰캣 버전 지원 Java 버전
4.0 2.3 1.1 9.0.x 8
3.1 2.3 1.1 8.0.x 7
3.0 2.2 1.1 7.0.x 6
2.5 2.1 N/A 6.0.x 5
2.4 2.0 N/A 5.5.x 1.4
2.3 1.2 N/A 4.1.x 1.3
2.2 1.1 N/A 3.3.x 1.1