Journey to CS/웹

JSP 실행 매커니즘

Cordilog 2026. 3. 26. 17:32

1. filename_jsp.java 형식의 파일

filename_jsp.javaJSP 파일이 실행되기 위해 서블릿(Servlet) 소스 코드로 변환된 결과물이다.

우리가 작성하는 .jsp 파일은 HTML 태그와 Java 코드가 섞여 있는 형태다.

하지만 웹 서버(정확히는 WAS)는 JSP 파일 그 자체를 직접 실행할 능력이 없다.

서버는 오직 컴파일된 자바 클래스 파일(.class)만 실행할 수 있다.

따라서 내부적으로 JSP를 자바 소스 파일로 변환하는 과정을 거치는데, 이때 생성되는 것이 바로 서블릿 파일이다.

2. JSP의 실행 메커니즘 (Lifycycle)

사용자가 브라우저에서 filename.jsp를 호출하면 서버 내부에서는 다음과 같은 일이 벌어진다.

  1. 변환(Translation): 톰캣 등의 WAS가 .jsp 파일을 분석하여 .java 서블릿 소스 파일을 생성한다. (이때 파일명은 filename_jsp.java 형식으로 생성된다.)
  2. 컴파일(Compilation): 생성된 .java 파일을 자바 컴파일러가 .class 파일로 컴파일한다.
  3. 로딩 및 실행: 컴파일된 클래스가 메모리에 로드되어 사용자의 요청을 처리하고 결과 HTML을 응답한다.

한 번 변환 및 컴파일된 파일은 JSP 내용이 수정되지 않는 한 재사용된다.

그래서 첫 번째 요청은 조금 느리지만, 두 번째 요청부터는 이미 만들어진 클래스를 실행하므로 속도가 빠르다.

3. 왜 이런 과정을 거치는가?

서블릿(Servlet)은 자바 코드 안에 HTML을 일일이 out.println()으로 출력해야 하므로 화면 설계가 매우 불편하다.

반면 JSP는 HTML 구조를 유지하면서 필요한 부분에만 자바 코드를 넣을 수 있어 생산성이 높다.

즉, 개발자는 코딩하기 편한 JSP로 작업하고, 서버는 실행하기 적합한 서블릿으로 변환해서 사용하는 전략이다.

4. 실제 파일은 어디에 있을까?

이 파일은 프로젝트 소스 폴더가 아니라 WAS가 관리하는 임시 작업 디렉토리에 저장된다.

톰캣(Tomcat) 기준 경로는 다음과 같다.

 

[Tomcat_설치경로]/work/Catalina/localhost/[프로젝트명]/org/apache/jsp/

 

이 폴더를 열어보면 내가 작성한 스크립틀릿(<% %>)이나 표현식(<%= %>)이 서블릿의 _jspService() 메소드 안에 어떤 방식으로 들어가 있는지 직접 확인할 수 있다.

 

5. 예시

다음 명령어로 서블릿 파일이 있는 디렉터리로 이동한다.

# cd /usr/share/tomcat/work/Catalina/localhost/_/org/apache/jsp

 

index_jsp.java 파일을 화면에 출력한다.

# cat index_jsp.java

 

다음 세 가지 사항을 확인해본다.

 

1️⃣ 스크립틀릿(<% %>) → 순수 자바 코드로 변환

JSP 상단에서 날짜를 계산하거나 변수를 설정했던 자바 코드들이 _jspService 중간에 그대로 박혀 있는 것을 볼 수 있다.

Java
 
// 이 부분은 JSP에서 <% ... %> 안에 작성되었던 코드입니다.
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy");
request.setAttribute("year", sdf.format(new java.util.Date()));
request.setAttribute("tomcatUrl", "http://tomcat.apache.org/");
...

이처럼 스크립틀릿은 메소드 내부의 로직이 된다.

 

2️⃣ 표현식(<%= %>) 또는 EL(${ }) → out.write로 변환

화면에 값을 뿌려주는 부분은 모두 out.write나 out.print가 감싸고 있다.

표현식 예시: <title><%= ... %></title>

Java
 

 

out.write("        <title>");
out.print(request.getServletContext().getServerInfo() ); // JSP의 표현식 부분
out.write("</title>\n");

EL(${ }) 예시: href="${tomcatUrl}"

Java
 
out.write("                <span id=\"nav-home\"><a href=\"");
// EL 표현식을 처리하기 위한 톰캣 엔진의 내부 로직으로 변환됨
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", ...)); 
out.write("\">Home</a></span>\n");

 

3️⃣ 일반 HTML 태그 → 문자열 출력으로 변환

 <html>, <body>, <div> 같은 태그들도 사실은 자바 입장에서는 그냥 출력해야 할 문자열일 뿐이다.

Java
out.write("\n");
out.write("<html lang=\"en\">\n");
out.write("    <head>\n");

JSP 파일에 적힌 모든 일반 텍스트는 위와 같이 out.write() 안에 들어가 브라우저로 전송된다.