JSP 생명주기 (Lifecycle)
JSP(JavaServer Pages)의 라이프사이클은 JSP 페이지가 클라이언트 요청에 의해 실행될 때부터 종료될 때까지의 생명 주기를 의미한다. JSP는 서블릿(Servlet)으로 변환되어 실행되기 때문에, 서블릿 라이프사이클과 유사한 단계를 거친다. JSP 라이프사이클은 다음 5단계로 구성된다.
Servlet이란 무엇인가?
서블릿(Servlet)은 Java 기반 웹 애플리케이션에서 클라이언트의 요청을 처리하고 동적인 웹 페이지를 생성하는 기술이다.Servlet은 Java 클래스로 구현되며, 웹 서버(WAS)에서 실행되어 요청(Request)을
jyhan0625.tistory.com
Servlet 생명주기 (Lifecycle)
Servlet은 객체 생성 → 초기화 → 요청 처리 → 소멸의 과정을 거칩니다.이를 관리하는 주요 메서드는 각각 차례로 init(), service(), doGet()/doPost(), destroy()이며,이 과정에서 리소스 로드 및 해제와 상
jyhan0625.tistory.com
1. 페이지 번역 (Translation)
JSP 파일이 서블릿 자바 코드로 변환된다.
• 세부사항:
• JSP 컨테이너(Tomcat 등)는 .jsp 파일을 서블릿 .java 파일로 변환한다.
• JSP의 HTML, 스크립틀릿(<% … %>), 표현식(<%= … %>)이 각각 자바 코드로 변경된다.
• 예를 들어, <%= message %>는 out.print(message);로 변환된다.
• 발생 조건:
• JSP 페이지가 처음 호출될 때.
• JSP 파일의 내용이 수정되었을 때.
• 파일 예시:
MyPage.jsp -> MyPage_jsp.java
2. 컴파일 (Compilation)
변환된 자바 파일(.java)이 서블릿 클래스(.class)로 컴파일된다.
• 세부사항:
• JSP에서 생성된 자바 코드가 자바 컴파일러에 의해 컴파일된다.
• 서블릿 클래스로 컴파일되며, 이 클래스는 HttpServlet을 상속받는다.
예를 들어:
public class MyPage_jsp extends HttpServlet {
...
}
• 파일 예시:
MyPage_jsp.java -> MyPage_jsp.class
3. 클래스 로딩 (Class Loading)
컴파일된 .class 파일이 JVM 메모리로 로드된다.
• 세부사항:
• JSP 컨테이너가 클래스 로더(Class Loader)를 사용해 .class 파일을 메모리에 로드한다.
• MyPage_jsp 클래스가 JVM의 메서드 영역에 올라간다.
4. 인스턴스 생성 (Instantiation) 및 초기화 (Initialization)
서블릿 클래스(MyPage_jsp)의 인스턴스가 생성되고 초기화 메서드 jspInit()이 호출된다.
• 세부사항:
• jspInit()은 JSP 페이지에서 <%! … %> 선언부에 정의한 초기화 코드가 실행된다.
• JSP 페이지가 최초 요청일 때 한 번만 호출된다.
• 초기화가 끝나면 서비스 준비 상태가 된다.
• 코드 예시:
<%!
private String message;
public void jspInit() {
message = "Hello JSP!";
}
%>
5. 요청 처리 (Request Processing)
• 클라이언트 요청이 오면 _jspService(HttpServletRequest req, HttpServletResponse res) 메서드가 호출된다.
• 세부사항:
• JSP 페이지의 스크립틀릿(<% … %>)와 표현식(<%= … %>) 부분이 _jspService() 메서드에 포함된다.
• doGet()이나 doPost()가 아닌 _jspService()가 요청을 처리한다.
• 모든 클라이언트 요청마다 호출되며, 멀티스레드로 동작한다.
• 코드 예시 (변환 후):
public void _jspService(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
6. 종료 (Termination)
• JSP 페이지가 더 이상 필요하지 않으면 jspDestroy() 메서드가 호출된다.
• 세부사항:
• JSP 서블릿 객체가 GC(Garbage Collection) 되기 전에 호출된다.
• 리소스 해제, 연결 종료 등의 마무리 작업을 수행한다.
• 예를 들어, DB 연결 종료나 파일 스트림 해제 등이 여기에서 이루어진다.
• 코드 예시:
<%!
public void jspDestroy() {
// 자원 해제 코드
}
%>
정리 및 특징
1. 라이프사이클 순서:
페이지 번역 → 컴파일 → 클래스 로딩 → 초기화 → 요청 처리 → 종료
2. JSP 메서드:
• jspInit() : 초기화, 최초 한 번 호출
• _jspService() : 요청 처리, 매 요청마다 호출
• jspDestroy() : 종료 시 호출
3. 특징:
• _jspService()는 재정의 불가 (컴파일러가 자동 생성)
• jspInit()과 jspDestroy()는 필요에 따라 개발자가 재정의 가능
• JSP가 서블릿으로 한 번만 변환되므로, 수정하지 않으면 번역 및 컴파일 생략
요약
• JSP는 결국 서블릿으로 변환되고 컴파일되어 실행된다.
• 서블릿의 라이프사이클과 매우 유사하지만, _jspService()가 자동 생성된다는 점이 다르다.
• JSP 수정 시: 페이지 번역 및 컴파일이 다시 발생.
• 서버 재시작 시: 클래스 로딩부터 다시 수행.
• JSP의 장점: HTML 내에 자바 코드를 쉽게 삽입할 수 있지만, 유지보수가 어려워 최근에는 JSP 대신 Spring + Thymeleaf 또는 React와 같은 프론트엔드-백엔드 분리 아키텍처를 많이 사용한다.