기본 객체별 생명 주기 scope
JSP에는 request, pageContext, application, session 등의 여러 기본 객체들이 있습니다. 기본 객체들 중 방금 말했던 네가지의 기본 객체들은 각각 다음 설명하는 클래스들의 인스턴스(객체)인데, 이들은 각기 서로 다른 생명 주기를 가지고 생성되며, 소멸 되어집니다.
기본 객체 |
클래스 |
생성 범위(scope) |
request |
javax.servlet.http.HttpServletRequest |
클라이언트가 HTTP 요청시마다 생성되고 결과를 응답할 때 사라집니다. 즉 세 번의 요청이 있으면 세 개의 request 객체가 생성됩니다. 최종 결과를 응답(출력) 할때까지는 소멸되지 않기 때문에 JSP에서 forward 또는 include 하는 페이지에서도 scope가 공유됩니다. |
pageContext |
javax.servlet.jsp.PageContext |
JSP 페이지를 요청했을때 JSP 페이지를 처리하는 범위동안 생성됩니다. 오로지 하나의 JSP 페이지에서만 범위를 갖기 때문에 request 객체보다 범위가 작습니다. |
application |
javax.servlet.ServletContext |
웹 어플리케이션 범위를 가지며, 웹 어플리케이션이 시작될 때 생성되었다가 웹 어플리케이션이 종료될 때 소멸됩니다. 따라서 모든 JSP 페이지에서 같이 공유할 수 있는 범위입니다. |
session |
javax.servlet.http.HttpSession |
브라우저 단위로 생성됩니다. 즉 하나의 컴퓨터에서 Internet Explorer와 Chrome을 각각 두 개 띄워 웹서버에 접근했다면 세션은 두 개 생성되며, 브라우저가 종료될때까지 해당 웹 어플리케이션에 대한 세션은 소멸되지 않습니다. |
기본 객체를 통한 데이터 공유
앞에서 설명한 각각의 기본객체의 공통점은 데이터를 저장하고 빼내올 수 있는 메서드들을 제공한다는 점 입니다. 각 객체들은 다음의 공통적인 메서드들을 통해 Scope에 따라 데이터를 공유할 수 있습니다.
메서드 |
설명 |
void setAttribute(String name, Object value) |
name을 key로 하는 데이터를 저장하는 경우 사용합니다. Object 타입으로 매개변수를 받기 때문에 모든 클래스 타입의 객체를 저장할 수 있습니다. 같은 name에 대해서 여러번 메서드를 호출하며 나중에 저장한 데이터로 덮어 씌워집니다. |
Object getAttribute(String name) |
name에 해당하는 저장 데이터를 가져옵니다. 이전에 setAttribute()로 저장한 데이터를 반대로 name을 key로 해서 가져오는 메서드입니다. 단 Object 타입으로 리턴되므로 원래 클래스 타입으로 캐스팅(형변환)하여 사용합니다. key에 해당하는 값이 없는 경우 null을 리턴합니다. |
void removeAttribute(String name) |
name에 해당하는 저장 데이터를 제거합니다. 이전에 setAttribute()로 저장한 데이터를 name을 key로 해서 제거 하는 메서드입니다. |
request 객체로 setAttribute() 이후 getAttribute()
<%
request.setAttribute("age", 30);
System.out.println((Integer)request.getAttribute("age")); //30 리턴
%> |
cs |
생명 주기에 따른 공유 범위(Scope)
앞 네 개의 기본 객체는 서로 다른 생존 범위를 가지고 있습니다. 그에 따라 웹어플리케이션 전역에서 데이터를 공유할 수 있는가 하면, 클라이언트로부터의 요청시에 생성되고 곧바로 소멸되어 하나의 요청 범위 안에서만 데이터를 공유하기도 합니다. 다음의 그림은 네 개의 기본 객체가 데이터를 공유할 수 있는 범위 즉 생존 범위를 나타낸 것입니다.
request 범위
request 범위는 웹 브라우저에서 요청한 하나의 HTTP request에 대한 범위를 가집니다. HTTP 프로토콜은 클라이언트가 request 메시지를 보내면 웹서버에서 response 메시지를 보냅니다. 이 하나의 작업 단위를 http 트랜잭션이라고 하는데, request객체는 이 한번의 트랜잭션 안에서 request에 대한 범위를 가집니다. 즉 같은 브라우저에서 F5 버튼을 통해 여러번의 새로고침을 하는 경우라 할지라도 각각 다른 request 객체를 생성하기 때문에 각각 다른 범위를 가집니다.
다음과 같이 JSP 페이지를 한 번 요청하게 되면 하나의 request 객체가 생성됩니다. JSP 페이지가 처리한 결과를 브라우저로 되돌려주면 생성되었던 request 객체는 소멸됩니다.
아래와 같이 JSP 페이지1을 요청한 경우에 request 객체가 하나 생성되는데 JSP 페이지1이 JSP 페이지2에 include나 forward를 사용하여 결과를 처리하는 경우에도 하나의 request 객체 범위를 갖게 됩니다. 즉 request 객체는 최종 처리 결과가 만들어져 브라우저에게 출력할 때 까지 살아있게 되므로 이 사이에서 처리에 참여하는 JSP 페이지1, 2 모두 하나의 request 객체를 공유하게 되는 것입니다.
pageContext 범위
pageContext는 하나의 JSP 페이지에 대한 범위를 가지게 됩니다. 앞서 reqeust를 설명할 때와 같은 상황에서 request 객체는 최종 응답 직전에 여러 JSP 페이지가 처리를 하는 경우 하나의 reqeust 객체를 공유한다고 했습니다. pageContext의 경우에는 다음과 같이 두 개의 JSP 페이지가 처리를 하는 경우 두 개의 pageContext 객체가 각각 생성되는 차이가 있습니다. 즉 페이지1과 페이지2는 각각의 pageContext 객체를 가지게 되므로 pageContext 객체로는 서로 데이터를 공유할 수 없고 request 객체를 통해서 공유하거나, 나중에 설명할 session이나 application 객체를 통해서 공유해야 합니다.
session 범위
session은 브라우저당 하나가 생성되는 객체입니다. 즉 하나의 컴퓨터에서 Internet Explorer, Chrome 두 개의 브라우저로 서버에 접속하면 두 개의 session 객체가 생성되며, 각각의 브라우저를 종료할 때까지 객체가 소멸되지 않습니다. 즉 서버에 여러개의 요청을 하는 경우에도 하나의 브라우저로부터 요청한 것이라면 session 객체를 통해 서로 데이터를 공유할 수 있습니다.
application 범위
application 객체는 웹 어플리케이션마다 하나씩 생성됩니다. 웹 어플리케이션이 시작될 때 생성되어 웹 어플리케이션이 종료될 때 소멸되고, 하나의 웹 어플리케이션 안에서라면 어디서든 공유될 수 있습니다. 웹 어플리케이션이라 함은 톰캣의 webapps 하위에 있는 각각의 어플리케이션들을 말합니다.
참고글
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] web.xml에서 org.apache.jasper.servlet.JspServlet의 mappedfile 설정 (0) | 2018.07.27 |
---|---|
[서블릿/JSP] JSP 기본 객체 getAttributeNames() 사용하기 (0) | 2018.07.27 |
[서블릿/JSP] JSP 기본객체 종류 (0) | 2018.07.07 |
[서블릿/JSP] JSP application 기본 객체로 웹 어플리케이션 파일 자원 가져오기 (0) | 2018.07.06 |
[서블릿/JSP] JSP application 기본 객체로 웹 컨테이너 로그(log) 남기기 (0) | 2018.07.06 |