1. filename_jsp.java 형식의 파일
filename_jsp.java는 JSP 파일이 실행되기 위해 서블릿(Servlet) 소스 코드로 변환된 결과물이다.
우리가 작성하는 .jsp 파일은 HTML 태그와 Java 코드가 섞여 있는 형태다.
하지만 웹 서버(정확히는 WAS)는 JSP 파일 그 자체를 직접 실행할 능력이 없다.
서버는 오직 컴파일된 자바 클래스 파일(.class)만 실행할 수 있다.
따라서 내부적으로 JSP를 자바 소스 파일로 변환하는 과정을 거치는데, 이때 생성되는 것이 바로 서블릿 파일이다.
2. JSP의 실행 메커니즘 (Lifycycle)
사용자가 브라우저에서 filename.jsp를 호출하면 서버 내부에서는 다음과 같은 일이 벌어진다.
- 변환(Translation): 톰캣 등의 WAS가 .jsp 파일을 분석하여 .java 서블릿 소스 파일을 생성한다. (이때 파일명은 filename_jsp.java 형식으로 생성된다.)
- 컴파일(Compilation): 생성된 .java 파일을 자바 컴파일러가 .class 파일로 컴파일한다.
- 로딩 및 실행: 컴파일된 클래스가 메모리에 로드되어 사용자의 요청을 처리하고 결과 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 중간에 그대로 박혀 있는 것을 볼 수 있다.
// 이 부분은 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>
out.write(" <title>");
out.print(request.getServletContext().getServerInfo() ); // JSP의 표현식 부분
out.write("</title>\n");
EL(${ }) 예시: href="${tomcatUrl}"
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> 같은 태그들도 사실은 자바 입장에서는 그냥 출력해야 할 문자열일 뿐이다.
out.write("\n");
out.write("<html lang=\"en\">\n");
out.write(" <head>\n");
JSP 파일에 적힌 모든 일반 텍스트는 위와 같이 out.write() 안에 들어가 브라우저로 전송된다.
'Journey to CS > 웹' 카테고리의 다른 글
| Jenkins와 Kubernetes를 조합한 CI/CD 파이프라인 (0) | 2026.01.24 |
|---|---|
| Spring Boot와 NestJS를 비교해보자 (0) | 2026.01.10 |
| 리눅스 환경에서 Node.js/Express로 웹 서버 구동하기 (0) | 2026.01.08 |
| [Spring Boot] Spring Initializr로 프로젝트 시작하기 (+인텔리제이 환경설정) (0) | 2026.01.03 |
| [개발 용어] Repaint와 Reflow 쉽게 이해하기 (2) | 2025.03.20 |