WAS는 웹 브라우저로부터 JSP 에 대한 요청을 받게 되면, JSP 코드를 서블릿 소스코드로 변환한 후 컴파일 하여 실행하게 됩니다. 서블릿으로 컴파일되어 실행될 때 상황에 따라서 어떤 메소드들이 실행되는지 잘 알아야, JSP 를 알맞게 작성할 수 있습니다.
sum10.jsp 가 실행될 때 벌어지는 일 (jsp 을 WAS 가 서블릿으로 변환한다)
이전 시간에 작성한 sum.jsp 라는 파일이 최초로 동작할 때는 특별한 형태의 서블릿으로 변환이 됩니다. jsp 는 jsp 가 실행이 되는 것이 아니라 서블릿으로 바뀐 다음에 실행이 됩니다. 톰캣을 사용했다면 WAS 인 톰캣이 jsp 를 서블릿으로 바꾸게 됩니다. 어떻게 바꾸는지 알아보겠습니다.
우리가 작업하고 있는 폴더에서 위의 경로로 들어가면 wtpwebapps 라는 디렉터리가 하나 있는 것을 확인할 수 있습니다.
해당 디렉터리로 들어가보면 우리가 작업하던 프로젝트들이 위치하고있는데요. sum10.jsp 도 여기 위치하고 있는 것을 확인할 수 있습니다. 다시 temp0 디렉터리로 올라가보겠습니다.
work 라는 디렉터리 안에 jsp 를 was(톰캣)이 변환한 서블릿 파일이 들어가 있습니다.
우리가 만들었던 jsp 파일이 sum10_jsp.java 라는 파일로 바뀌어 있는 것을 확인할 수 있습니다.
해당 파일을 열어보면 위와 같은 java 코드가 있는 것을 확인할 수 있습니다. 이 자바 파일에 _jspInit, _jspDestroy, _jspService 라는 메서드들이 있는 것을 볼 수 있는데요. 우리가 이전에 공부했던 서블릿과 같은 구조입니다. 우리가 jsp 에 작성했던 코드들은 기본적으로 _japService 라는 메서드 안에 작성됩니다. jsp 가 서블릿으로 만들 때 (자바로 만들 때) 알아서 만들어 놓는 객체들도 있습니다. 이런 객체들을 가리켜서 내장 객체라고 합니다.
코드를 조금 더 아래로 내려가보면 jsp 에서 우리가 작성했던 코드들이 여기에 자바로 구현되어 있는 것을 확인할 수 있습니다. <%=total%> 라는 코드도 out.print(total) 로 바뀌어 있는 것을 확인할 수 있습니다. 이렇게 jsp 로 작성된 코드는 특이한 형태의 서블릿으로 생성됩니다.
JSP 의 실행순서 정리
1. 브라우저가 웹서버에 JSP 에 대한 요청 정보를 전달한다. 2. 브라우저가 요청한 JSP 가 최초로 요청되었을 경우 - JSP로 작성된 코드가 서블릿(java)으로 변경된다. - 서블릿 코드를 컴파일해서 실행가능한 bytecode(class파일)로 변환한다. - 서블릿 클래스를 로딩하고 인스턴스를 생성한다. 3. 서블릿이 실행되어 요청을 처리하고 응답 정보를 생성한다.
JSP 라이프싸이클 실습
[ JSP라이프 싸이클을 확인할 lifecycle.jsp 를 작성한 후 다음의 경우 어떤 결과가 나오는지 확인한다. 1-브라우저가 최초 요청했을 때. 2-브라우저로 두 번째 요청했을 때. 3-lifecycle.jsp 를 수정한 후 요청했을 때 ]
콘솔 창에 문자열을 출력하는 jsp 코드를 작성했습니다. 우선 실행시켜 보겠습니다.
최초 실행 시최초 실행 하면서 jspService 가 콘솔 창에 출력되는 것을 확인할 수 있습니다.
2회차 실행 시새로고침 하면 위와 같이 출력되는 것을 확인할 수 있습니다. 서블릿을 공부했을 때 Init과 Service 메서드에 대해서 공부했었는데요. 최초로 실행되었을 때는 Init도 실행되지만 2회차부터는 Service 만 실행되는 것을 확인했었습니다. 코드가 수정이되거나 WAS 가 다시 실행되면 Destroy 가 호출이 되고 다시 Init 이 호출된다는 것을 확인했었습니다. 마찬가지로 jsp 에서도 그런 일을 할 수 있습니다.
우선 jsp 가 실행되어 생성된 java 파일을 보겠습니다. Service 메서드에 우리가 jsp 에서 작성한 코드들이 들어가 있는 것을 볼 수 있습니다.
즉, jsp 가 실행되어 생성된 java 파일에는 기존의 서블릿 처럼 Init 과 Destroy, Serivce 메서드들이 있지만 우리가 Jsp 에서 작성한 코드들은 모두 Service 메서드 안에 들어간다는 겁니다. 왜 그럴까요? 응답에 포함되는 것 Service 밖에 없기 때문입니다. 그런데 jsp 에서는 항상 서블릿의 service 메서드에만 쓸 수 있는 걸까요? 그렇지는 않습니다.
<%! %> 꺽쇠 퍼센트 느낌표를 활용하면 이 클래스에 메서드 혹은 필드를 선언할 때 사용할 수 있습니다. 꺽쇠 퍼센트 느낌표 안에서 작성된 코드는 Service 메서드 안에서 작성되는 것이 아니라 Service 메서드 바깥쪽에 해당 코드들이 작성되게 할 수 있습니다. <%! 꺽쇠 퍼센트 느낌표를 사용하여 메서드들을 작성해주었습니다. 이 코드를 실행시켜 보겠습니다.
jsp 에서 Service 를 제외한 다른 메서드를 작성하여 동작하는 것을 확인할 수 있습니다. Init 과 Service 가 실행되는 것을 확인할 수 있습니다. jsp 코드를 수정하고 새로고침을 진행하면 Destroy 메서드도 실행되는 것을 확인할 수 있습니다.
Jsp 에서 Service 메서드 뿐만 아니라 Init, Destroy 메서드를 수정할 수 있다는 것을 확인할 수 있습니다. 실제로 코드가 어떻게 바뀌었는지도 보겠습니다.