사실 Servlet과 JSP는 거의 같은 말이라고 이해해도 된다.
Servlet과 JSP 모두 동적 웹페이지를 만들거나 데이터 처리를 수행하기 위해 사용되는 웹 어플리케이션 프로그래밍 기술이다.
Servlet은 Tomcat이 이해할 수 있는 순수 JAVA 코드로만 이루어진 웹 서버용 클래스이며, 동적 웹 페이지를 만들 때 JAVA 코드 안에 HTML 태그가 삽입되는 구조이다.
JSP는 HTML 코드 속에 자바 코드가 들어가는 구조의 스크립트 언어이다.
이는 아래의 예시 코드들을 보면 더 쉽게 이해할 수 있을 것이다.
Servlet 이후 JSP가 등장하게 된 이유로는 Servlet을 이용하면 웹 프로그래밍이 가능했지만, JAVA에 대한 지식이 필요하고, 화면 인터페이스 구현에 너무 많은 리소스가 사용되는 등 비효율적인 측면이 존재했다.
Servlet을 사용하면 out 객체의 print() 메서드를 이용하여 HTML 문서를 작성해야 하는데, 이는 추가/수정을 어렵게 하고 가독성도 떨어졌다.
이런 한계를 보완하기 위해 등장한 것은 서블릿 기반의 서버 스크립트 기술 JSP였다.
서버 스크립트 기술 → ASP, PHP처럼 미리 약속된 규정에 따라 간단한 키워드를 조합하여 입력하면, 실행 시점에 각각의 키워드에 매핑이 되어있는 어떤 코드로 변환 후에 실행되는 형태이다.
MVC 모델에서 JSP는 View, Servlet은 Controller로 사용된다.
이에 대해서 더 자세한 내용은 추후에 별도로 다뤄보겠다.
해당 글에서는 차이점에 대해서만 집중적으로 다루겠다.
@WebServlet("/rollDice2")
public class TwoDiceServlet extends HttpServlet {
int getRandomInt(int range) {
return new Random().nextInt(range)+1;
}
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
int idx1 = getRandomInt(6);
int idx2 = getRandomInt(6);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println("<img src='resources/img/dice"+idx1+".jpg'>");
out.println("<img src='resources/img/dice"+idx2+".jpg'>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
Servlet의 특징
<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="java.util.Random" %>
<%-- <%! 클래스 영역 %> --%>
<%!
int getRandomInt(int range){
return new Random().nextInt(range)+1;
}
%>
<%-- <% 메서드 영역 - service()의 내부 %> --%>
<%
int idx1 = getRandomInt(6);
int idx2 = getRandomInt(6);
%>
<html>
<head>
<title>twoDice.jsp</title>
</head>
<body>
<img src='resources/img/dice<%=idx1%>.jpg'>
<img src='resources/img/dice<%=idx2%>.jpg'>
</body>
</html>위의 JSP가 아래의 Servlet으로 변환된다.
@WebServlet("/rollDice2")
public class TwoDiceServlet extends HttpServlet {
int getRandomInt(int range) {
return new Random().nextInt(range)+1;
}
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
int idx1 = getRandomInt(6);
int idx2 = getRandomInt(6);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println("<img src='resources/img/dice"+idx1+".jpg'>");
out.println("<img src='resources/img/dice"+idx2+".jpg'>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
이 때 JSP는 아래와 같은 과정을 겪으며, 서블릿으로 변환된다.
<%! %> 영역은 Servlet의 클래스 변수나 메서드로 들어간다.<% %> 영역은 Servlet의 Service 메서드 영역으로 들어간다.