본문으로 바로가기
링크허브 공식블로그

연동이 쉬워진다

링크허브 공식블로그

현대리가 생각하는 IT

JSP 처리과정

STS를 이용한 개발환경에서 JSP를 실행해보도록 하겠습니다.

JSP는 다음과 같이 간단하게 작성을 했습니다.

1
2
3
4
5
6
7
8
9
10
11
<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>LinkHub :)</title>
</head>
<body>
    <h1> 오늘은 8월 2일 목요일입니다.</h1>
</body>
</html>
cs


서버는 Tomcat을 사용했구요, 서버 실행 후에 브라우저에서 확인해보면 다음과 같이 보여집니다.


이렇게 실행된 NewFile.jsp 파일은 프로젝트폴더 안에서 확인할 수 있습니다.

그리고, class파일과 java파일이 생성된 것도 확인할 수 있습니다.

※참고※ Tomcat이 설치된 폴더의 work폴더는 임시 파일들이 저장되는 위치입니다.

지금과 같은 상황에서는 JSP파일과 대응되는 Servlet의 java소스파일과 class파일들이 저장된 것이라고 보시면 됩니다.


JSP파일을 요청했을 뿐인데, class파일과 java파일이 생성되었네요...혹시 이 파일들의 상관관계를 알고계시나요?

알고계시다면, 이제부터 제가 작성한 내용은 가볍게 PASSS하셔도 됩니다.


JSP FILE REQUEST

JSP파일 요청시 처리과정은 다음과 같습니다.

JSP파일을 서버에 올려 실행해주는 과정은 다소 간단하지만, Tomcat내부에서는 복잡한 과정을 거치게 됩니다.

JSP파일이 실행될 때, Servlet인 java소스파일로 변환(Translation)이 되는 첫번째 과정을 거칩니다.

다음으로 변환된 java소스파일을 클래스파일로 컴파일(Compile)합니다.

마지막으로 클래스파일이 JSP/Servlet 컨테이너인 Tomcat내에서 실행되어 그 결과가 최종적으로 브라우저에 전달됩니다.


그렇다면, JSP파일이 변환되어 생성된 java파일 안에는 어떤 내용이 들어있을까요?

메모장으로 NewFile_jsp.java 파일을 열어 확인해보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package org.apache.jsp;
 
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
 
public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {
 
  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();
 
  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
 
  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
 
  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }
 
  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }
 
  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }
 
  public void _jspInit() {
  }
 
  public void _jspDestroy() {
  }
 
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {
 
    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;
 
 
    try {
      response.setContentType("text/html; charset=utf-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  nulltrue8192true);
      _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 PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n");
      out.write("<title>LinkHub :)</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("\t<h1> 오늘은 8월 2일 목요일입니다.</h1>\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}
cs


위 내용을 보면 클래스이름이 java파일명과 동일하게 NewFile_jsp로 되어있는 것을 보실 수 있습니다.

그리고, JSP파일에 작성한 내용이 _jspService 멤버 메소드에 있다는 것도 볼 수 있습니다.

제가 작성했던 JSP파일 내용은 out객체의 write메소드로 출력이 되고 있네요.


위 내용을 토대로 JSP파일에 작성한 내용은 Servlet의 java파일에 담겨진다는 것을 눈으로 확인할 수 있었습니다.


그렇다면, 매번 같은 과정을 거치게 될까?

결론부터 말하자면, 요청하는 JSP파일에 해당하는 클래스파일이 메모리에 적재되어 있다면 적재된 클래스를 바로 실행하여 응답합니다.

메모리에 적재되어 있는 클래스파일을 요청받았을 때, 변환과 컴파일 과정을 매번 실행한다면 그만큼 리소스가 낭비되기 때문입니다.


마치며

JSP는 HTML과 달리 소스 자체만으로 실행할 수 없습니다.

때문에 웹 브라우저, 서블릿 컨테이너, 웹서버, 등등 여러 구성요소가 필요하고 이들 사이의 흐름을 이해하는 것이 중요합니다.

오늘은 JSP 처리 과정에 대해 알아보았지만, 더 나아가 Servlet의 원리, 내부 처리 과정에 대해 알아보는 것도 도움이 될 것 같습니다!




  • Today
  • Total