Java : Jasper로 JSP를 서블릿으로 컴파일

NuyHes·2025년 8월 19일
0

[Study]

목록 보기
66/71
post-thumbnail

Jasper의 역할

1) JSP를 서블릿으로 변환

Jasper는 JSP 파일 내의 코드를 Java 서블릿 코드로 변환한다.
이 과정에서 HTML , CSS , JavaScript와 같은 정적 요소는 그대로 유지되고 JSP 코드 부분은 서블릿의 _jspService()메서드 내로 삽입된다.

2) 변환 및 컴파일

변환된 서블릿 코드는 Java컴파일러에 의해 컴파일 되어 실행 가능한 클래스 파일 .class로 만들어진다.

3) 서블릿 실행

컴파일된 서블릿은 웹 서버(Tomcat 등)에 의해 실행되어 동적인 웹 페이지를 생성한다. 생성된 결과는 HTML 형태로 웹 브라우저에 반환된다.


🕵️ Jasper 서블릿 출력

기존의 방식은 해당 클래스에서 service메서드에서 write메서드를 사용하여 한줄씩 출력을 했는데 Jasper로 서블릿 코드로 컴파일되는 과정을 알아보자.

기존 직접 write 메서드 출력

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
	PrintWriter out = resp.getWriter();
	out.write("<!DOCTYPE html>");  
	out.write("<html lang=\"ko\">");
	out.write("<h1>Hello</h1>");
	...
	...
	...
}

IntelliJ에서 컴파일 소스 및 경로 확인하는 방법

  1. 프로젝트 Run 👉 Tomcat 실행
  2. JSP 페이지를 한 번 요청 (하지 않으면 컴파일 안됨)
  3. Run 로그를 보면 아래와 같은 해당 프로젝트 컴파일 폴더 확인
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --

...

...

org.apache.catalina.startup.VersionLoggerListener.log 서버 버전 이름:    Apache Tomcat/9.0.107

...

...

org.apache.catalina.startup.VersionLoggerListener.log 🟢CATALINA_BASE:     C:\Users\AppData\Local\JetBrains\IntelliJIdea2025.2\tomcat\2596f31e-f49b-4c02-8e15-adf6744b5601🟢

...

...

해당 프로젝트의 톰캣 컴파일 경로

"C:\Users\AppData\Local\JetBrains\IntelliJIdea2025.2\tomcat\2596f31e-f49b-4c02-8e15-adf6744b5601\work\Catalina\localhost\ROOT\org\apache\jsp\프로젝트명_jsp.java"

📄 프로젝트명_jsp.java _jsp.java 파일로 컴파일이 된다.

컴파일 코드

public final class 프로젝트명_jsp extends HttpJspBase {

  // JSP 실행에 필요한 팩토리 (PageContext 생성용)
  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  public void _jspInit() {
    // 필요 시 초기화 로직 (JSP 선언부 <%! %>에서 넘어옴)
  }

  public void _jspDestroy() {
    // 종료 시 정리 로직
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
      throws IOException, ServletException {

    // 1) 허용 메서드 간단 체크 (실제 Jasper는 OPTIONS/HEAD 등도 처리)
    String m = request.getMethod();
    if (!"GET".equals(m) && !"POST".equals(m)) {
      response.setHeader("Allow", "GET, POST");
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED,
          "JSP는 GET/POST만 허용(요약본)");
      return;
    }

    // 2) PageContext/암묵객체 준비
    PageContext pageContext = null;
    JspWriter out = null;
    try {
      // 문자셋 명시 (원본 코드에서 한글 깨짐 방지 포인트)
      response.setContentType("text/html; charset=UTF-8");

      pageContext = _jspxFactory.getPageContext(
          this, request, response,
          null,      // errorPage URL
          true,      // needsSession
          8192,      // buffer size
          true       // autoflush
      );

      HttpSession session = pageContext.getSession();
      ServletContext application = pageContext.getServletContext();
      ServletConfig config = pageContext.getServletConfig();
      out = pageContext.getOut();

      // 3) 정적 HTML은 out.write(...)
      out.write("<!DOCTYPE html>\n");
      out.write("<html lang=\"ko\">\n<head>\n<meta charset=\"UTF-8\"/>\n");
      out.write("<title>JSP - Hello World</title>\n");
	  ...
	  ...
	  ...
	  


    } catch (Throwable t) {
      // 4) 예외 처리 (버퍼/에러 페이지 처리 요약)
      if (out != null) {
        try {
          if (response.isCommitted()) out.flush();
          else out.clearBuffer();
        } catch (IOException ignore) {}
      }
      if (pageContext != null) pageContext.handlePageException(t);
      else throw new ServletException(t);
    } finally {
      // 5) PageContext 반환(리소스 정리)
      _jspxFactory.releasePageContext(pageContext);
    }
  }
}
  • _jspService 안에서 모든 출력과 로직이 실행된다.
  • 정적 HTML 👉 out.write, El 👉 전용 평가 호출, 스크립틀릿 👉 자바 코드로 들어간다.
  • EL이 보려면 attribute 스코프에 넣어야한다.
  • 문자셋은 contentTypecharset지정이 핵심
  • 에러 처리 / 버퍼 / 리소스 반납의 기본적인 뼈대

0개의 댓글