[JSP] JSP 개요
개요
JSP는 서블릿과 마찬가지로 클라이언트가 보낸 데이터가 담긴 요청을 동적으로 처리할 때 사용하는 기술로, 서블릿의 단점을 보완하기 위해 등장한 기술이다.
서블릿은 자바로 구현되기에 자바의 장점인 플랫폼 독립적인 특성을 가지며, 서버의 종류에 상관없이 동작하는 서버 독립적 특성, 멀티 스레드 기반으로 다수의 클라이언트 요청 처리 기능이라는 장점을 보유하고 있다. 그러나 단점들도 있다.
- 서블릿의 단점
- 정해진 규칙을 지켜가면서 작성해야 하는데, 그 규칙이 많아 매우 번거롭다. 콜백 메서드 오버라이딩, 요청 URL 매핑, HttpServlet 상속 등등 그 규칙이 많다.
- 소스 코드 수정 시 재컴파일을 하고 리로딩해야 하는 절차를 밟아야 한다.
- 응답 페이지를 구현하기 위해 자바 코드 내부에 HTML 코드를 작성해야 하는 구조인데, HTML 작성에 매우 불편하다.
HTML 응답 페이지 작성의 불편함은 다음의 코드로도 이해가 갈 것이다.
public class SomeServlet extends HttpServlet {
// 생략
protected void service(HttpServletRequest request, HttpServletResponse response) {
String userName = request.getParameter("user-name");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>응답 페이지 작성하려고 이렇게 번거롭게 작성해야한다니!!!!</title>");
// HTML 헤드 관련 설정 코드가 여기에 있다고 가정...
out.println("</head>");
out.println("<body>");
out.println("<p> " + userName + "님, 환영합니다! </p>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
응답 페이지를 그냥 HTML으로 구성하였으면 얼마나 편했을까! 그런데 out.println()으로 일일이 하나하나씩 응답 페이지를 구성해야한다니 정말 성가시다!
자바 코드 안에 HTML 코드를 삽입하는 서블릿과 달리, JSP는 정반대로, HTML코드 내부에 자바 코드를 삽입하는 방식이라서 응답 페이지 구성에 더 수월하다고 한다. 다음은 위 코드를 JSP로 재구성한 코드이다.
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 입니다.</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("euc-kr");
if (request.getMethod().equalsIgnoreCase("GET")) {
%>
<form action="jspBasic1.jsp" method="post">
유저 네임: <input type="text" name="user-name" />
<input type="submit" value="로그인" />
</form>
<%
} else {
%>
<p> <%= request.getParameter("user-name") %> 님, 환영합니다. </p>
<%
}
%>
</body>
</html>
jspBasic1.jsp
out.println()을 사용하여 번거롭게 응답 페이지를 구성할 필요없이, 아예 HTML로 응답 페이지를 구성한 후, 그 안에 요청 처리에 따른 응답 결과를 자바 코드를 삽입하는 방식으로 하여 처리할 수 있는 것이다. 더군다나 위 코드를 보면 하나의 페이지 안에서 사용자에게 정보를 입력하는 화면과, 그 정보를 처리한 결과로 나오는 응답 페이지를 하나의 파일 안에 작성할 수 있다는 장점도 있음을 알 수 있다.
참고로 이클립스 기준, 만약 워크스페이스 폴더 이름이 ServletAndJSPStudy이고, jspBasic1.jsp 파일을 작성한 프로젝트 폴더의 이름이 JSPBasic이라 할 때, 파일 탐색기에서 다음의 경로로 가보면…
C:\ServletAndJSPStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\JSPBasic\org\apache\jsp
이 경로에 해당하는 폴더 내에 앞서 작성한 jsp 파일로부터 자바 코드만 추출하여 이를 서블릿 코드로 변환한 자바 소스 코드 파일이 있다. 필자의 경우 jspBasic1_jsp.java 라는 파일이 존재한다. 이 파일을 열어 그 안의 코드를 확인해보면, 다음과 같이 작성되어 있다.
// 생략
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"UTF-8\">\r\n");
out.write("<title>JSP 입니다.</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write(" ");
if (request.getMethod().equalsIgnoreCase("GET")) {
out.write("\r\n");
out.write(" <form action=\"jspBasic1.jsp\" method=\"post\"> \r\n");
out.write(" 유저 네임: <input type=\"text\" name=\"user-name\" />\r\n");
out.write(" <input type=\"submit\" value=\"로그인\" />\r\n");
out.write(" </form>\r\n");
out.write(" ");
} else {
out.write("\r\n");
out.write(" <p> ");
out.print( request.getParameter("user-name") );
out.write(" 님, 환영합니다. </p>\r\n");
out.write(" ");
}
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
// 생략
jspBasic1_jsp.java
해당 파일의 맨 위에 주석으로 Jasper component of Apache Tomcat
라고 되어 있는데, 즉, Jasper라는 라이브러리를 이용하여 내부적으로 JSP 코드 내 자바 코드들을 서블릿 코드로 변환해주는 것이다.
그리고 해당 파일 내용을 자세히 보면 알겠지만, JSP 코드도 사실상 서블릿 코드와 다를 바가 없다. JSP에도 똑같이 _jspInit(), _jspDestroy(), _jspService() 등의 콜백 메서드를 이름만 조금 다를 뿐 거의 똑같이 사용하는 것을 알 수 있을 것이다. 참고로 위 코드는 service 메서드 내부에 삽입된 코드이다. 나중에 다시 살펴보겠지만, JSP 파일 내에 작성한 자바 코드는 대부분 서블릿 클래스의 service() 메서드 내부에 삽입된다.
JSP 처리 과정
톰캣 서버 내에서 JSP를 처리하는 과정.
- 클라이언트가 HTML을 요청한 경우, 서버에서 바로 해당 html 파일을 응답으로 보내줘 사용자가 이를 브라우저를 통해 볼 수 있다.
- JSP를 요청한 경우, 서버 내부에서 우선 JSP 파일 내에서 html과 자바 코드를 따로 분리한다. 그 후, 자바 코드에 대해서는 이를 서블릿 자바 소스 코드로 변환한다. 그리고 서블릿 코드를 컴파일하고, 컴파일한 결과를 다시 아까 분리해낸 HTML에 삽입한다. 이렇게 재조립된 HTML 페이지를 클라이언트에게 응답으로 전송해주는 원리이다.
이클립스에서 JSP 파일 생성하기
-
먼저 웹 프로젝트 폴더 내 webapp 폴더 내에 원하는 폴더에 마우스로 선택한다. 여기서는 jsp파일을 그냥 webapp 폴더 바로 아래에 만들 것이라서 webapp 폴더를 선택하였다. 그 후 마우스 우클릭 → [New] → [JSP File]을 클릭한다.
-
그러면 다음의 창이 뜰 것이다. [Templates] 목록에 [New JSP File (html 5)]을 선택하였다. 그런데 아래의 [Preview]를 보면
<%@ page ~
로 시작되는 부분이 있다.<%@ page … %>
이 부분은 나중에 다룰 “페이지 지시자”라고 하는데, 처음 jsp 파일을 생성할 경우, 이클립스에서 기본으로 속성값을 설정해서 제공해주는 것이다. 그런데 여기에 불필요한 속성이 있어 이를 지우고자 한다. 이를 한 번만 해두면 나중에 같은 프로젝트 폴더 안에 jsp 파일을 만들 때 같은 템플릿이 설정되니 한 번 해보자. JSP 템블릿 수정을 위해 아래 “JSP Templates” 하이퍼링크를 클릭해보자. -
그러면 아래와 같은 창이 뜬다. 목록에서 똑같이 [New JSP File (html 5)]을 선택한 후, 오른쪽의 [Edit] 버튼을 누른다.
-
아래의 창에서 “language=”java”와 “pageEncoding=”${encoding}” 부분을 지운다. 그러면 아래 창처럼 될 것이다.
<%@ page language="java" contentType="text/html; charset=${encoding}" pageEncoding="${encoding}"%>
처음 JSP 파일 생성 시 기본으로 설정된 페이지 지시자(Page directive)이다. 여기서 lauguage 속성은 어차피 자바 언어를 사용하므로 없어도 되고, pageEncoding도 어차피 charset이 대신 해주기에 필요없는 속성이다. 그렇기에 불필요한 속성을 여기서 삭제해주는 것이다.
다 되었으면 [OK] 버튼을 누른다.
-
앞선 창의 [Preview]내 코드가 바뀐 것을 확인할 수 있다. 확인 후 [Apply] → [Apply and Close]를 차례대로 클릭한다.
-
앞선 창으로 되돌아오면 다음과 같이 코드가 바뀐 것을 확인할 수 있다. [Finish]를 누른다.
-
아래와 같이 jsp 확장자 파일이 생성된 것을 볼 수 있다. 이로서 JSP 파일을 생성하는 방법을 살펴보았다. 참고로 다음에 같은 프로젝트 폴더 내에서 새로운 JSP 파일을 생성하면 앞서 설정한 템플릿이 그대로 적용되기에 매번 생성할 때마다 수정할 필요가 없다.
이 다음 페이지에서부터는 본격적으로 JSP 문법에 대해 살펴보겠다.
References
[1] 에이콘아카데미(강남) 강의
[2] 채규태, “채쌤의 Servlet&JSP 프로그래밍 핵심”, (쌤즈, 2023)
This content is licensed under
CC BY-NC 4.0
댓글남기기