Jasper
는 JSP 파일 내의 코드를 Java 서블릿 코드로 변환한다.
이 과정에서 HTML
, CSS
, JavaScript
와 같은 정적 요소는 그대로 유지되고 JSP 코드 부분은 서블릿의 _jspService()
메서드 내로 삽입된다.
변환된 서블릿 코드는 Java
컴파일러에 의해 컴파일 되어 실행 가능한 클래스 파일 .class
로 만들어진다.
컴파일된 서블릿은 웹 서버(Tomcat 등)에 의해 실행되어 동적인 웹 페이지를 생성한다. 생성된 결과는 HTML
형태로 웹 브라우저에 반환된다.
기존의 방식은 해당 클래스에서 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>");
...
...
...
}
Run
👉 Tomcat
실행JSP
페이지를 한 번 요청 (하지 않으면 컴파일 안됨)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
안에서 모든 출력과 로직이 실행된다.out.write
, El 👉 전용 평가 호출, 스크립틀릿 👉 자바 코드로 들어간다.attribute
스코프에 넣어야한다.contentType
에 charset
지정이 핵심