티스토리 뷰

Web/JSP

[JSP] 스코프(Scope), 생성주기

쩨리쩨리 2018. 4. 13. 03:35
반응형

* 스코프(Scope)

 

JSP의 내장 객체(implicit object)는 웹 컨테이너가 만들어 제공하는 객체로 jsp 페이지 안에서 선언을 하지 않고 사용할 수 있는 객체이다. 스크립트 릿, 표현식, 표현 언어에서 사용된다.

 

스코프(Scope, 영역)는 영역이란 의미로 jsp 페이지에서 사용되는 객체들은 jsp 내장 객체이든 페이지 내에서 만들어졌던 간에 모두 정해진 영역 안에서만 사용이 가능하다.

 

웹 어플리케이션에서 스코프(영역)은 총 4개가 존재하며 page, request, session, application 영역들이 있다.

 

 

 

 

 

 

 

* 기본 객체의 스코프와 생성주기

 

1. page 영역

page 영역은 한번의 클라이언트 요청에 대해서 하나의 jsp 페이지를 범위로 갖는다. 웹 브라우저의 요청이 들어오면 jsp 페이지를 실행하는데, 이때 jsp 페이지를 실행하는 범위가 하나의 page 영역이 된다.

 

Page는 따로 내장된 객체가 없기 때문에 pageContext 객체를 이용하며 하나의 page 안에서 입력과 출력이 모두 이뤄지며 페이지 이동을 하기엔 Page의 영역이 다른 Page에 닿지 않기 때문에 다른 페이지에서 pageContext 객체를 사용할 수 없다.

 

 

 

 

2. request 영역

request 영역은 한 번의 웹 브라우저 요청과 관련된다. 웹 브라우저의 주소에 url을 입력하거나 링크를 클릭해서 페이지를 이동할 때, 웹 브라우저가 웹 서버에 전송하는 요청이 하나의 request 영역이 된다. 웹 브라우저가 요청을 보낼 때 마다 새로운 request 영역이 생성된다. page 영역은 오직 하나의 jsp 페이지만을 포함하는데 반해, request 영역은 하나의 요청을 처리하는 데 사용되는 모든 jsp 페이지를 포함한다는 차이점이 있다.

 

 

 

아래의 코드를 보고 request 영역을 이해해보자.

 

 

 

* request.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 
    <form method="post" action="request2.jsp">
        이름 : <input type=text name="name"> 
        전화번호 : <input type=text name="tel"> 
        <input type=submit value="확인">
    </form>
 
</body>
</html>
cs

 

첫 jsp 페이지에서 post 방식으로 request2.jsp 페이지로 이동한다.

 

 

* request2.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 
 
    <% request.setCharacterEncoding("UTF-8");%>
 
    <% response.sendRedirect("page_control_end.jsp"); %> 
</body>
</html>
cs

 

request2.jsp 문서에서 값을 받고 다시 마지막 jsp 문서로 넘긴다.

 

 

 

* page_control_end.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>page_control_end 페이지</title>
</head>
<body>
 
    <h1>forward action 및 sendRedirect()</h1>
    <hr>
    지금 보이는 화면은 page_control_end.jsp 에서 출력한 결과입니다.
    <hr>
 
    이름:<%=request.getParameter("name")%>
    전화번호:<%=request.getParameter("tel")%>
 
</body>
</html>
cs

 

마지막 jsp 문서에서 request 객체를 이용하여 값을 받는다. 이렇게 되면 총 3 페이지를 이용하여 2번 페이지 이동을 거친 과정인 것이다.

 

 

 

* 실행화면

 

 

값은 전부 null 이 들어왔다. 왜 그럴까?

 

 

 

request 영역은 클라이언트가 한번의 요청을 할때마다 하나씩 생성된다. 즉, 페이지 이동 한번에 하나의 저장 영역이 있는 것이다. request.jsp는 한번의 요청을 받아서 request 영역을 생성후 그 request 영역에 데이터들을 저장시켰다. 이 데이터들은 request2.jsp 페이지 안에는 잘 전송 될 수 있지만, 다음 page_control_end.jsp 페이지로 이동하는 요청은 다른 request 영역이 생성되어 이동 된다. 따라서 마지막 페이지에서 request 객체를 이용하여 값을 받아오려 할때 아무것도 없는 영역에서 데이터를 받아오려 하니 null을 띄울 수 밖에 없다.

 

 

 

 

 

 

 

 

 

* Session 영역

session 영역은 하나의 웹 브라우저와 관련된 영역이다. 세션이 생성되면 하나의 웹 브라우저와 관련된 모든 요청은 하나의 session 영역에 포함된다. 각 세션을 구분하기 위해 세션마다 고유 id를 할당한다.

 

 

 

한번 생성된 세션은 지정한 유효 시간 동안 유지 된다. 웹 어플리케이션을 실행하는 동안 지속적으로 사용해야 하는 데이터의 저장소로 세션이 적당하다. request 기본 객체가 하나의 요청을 처리하는 데 사용되는 jsp 페이지 사이에서 공유된다면, session 기본 객체는 웹 브라우저의 여러 요청을 처리하는 jsp 페이지 사이에서 공유된다. 따라서 로그인한 회원 정보 등 웹 브라우저와 일대일로 관련된 값을 저장할 때에는 쿠키 대신 세션을 사용할 수 있다.

 

 

세션은 내가 웹 브라우저를 실행시킨뒤 웹 브라우저에 로그인 요청을 했을때, 생성된다. 즉 클라이언트의 세션 요청이 있을때 생성된다 할 수 있다.

 

 

 

 

* page_control.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>page_control 페이지</title>
</head>
<body>
 
    <!--  post  -->
    <form method="post" action="response_sendPost.jsp">
        response.sendRePost 이름 : <input type=text name="name3">
        <input type=submit value="확인">
    </form>
</body>
</html>
cs

 

 

* response_sendPost.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>response_sendPost 페이지</title>
</head>
<body>
 
Post 부분 입니다.
 
<% request.setCharacterEncoding("UTF-8"); %>
 
<%
String user = (String)request.getParameter("name3");
request.getSession().setAttribute("userName", user);
response.sendRedirect("page_control_end.jsp");
%>
 
</body>
</html>
cs

 

여기서 request 객체는 user 데이터를 UserName이란 객체에 담아 session 영역에 데이터를 올려 보낸다.

 

 

* page_control_end.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>page_control_end 페이지</title>
</head>
<body>
 
    <h1>forward action 및 sendRedirect()</h1>
    <hr>
    지금 보이는 화면은 page_control_end.jsp 에서 출력한 결과입니다.
    <hr>
 
    이름:<%=request.getParameter("name")%>
 
</body>
</html>
cs

 

 

 

그림으로 보면 아래와 같다.

 

 

 

 

 

session영역은 request 영역보다 범위가 넓기 때문에 하나의 페이지가 아닌 여러 페이지에 데이터를 저장하고 가져올 수 있다.

 

session 영역에 한번의 요청으로 데이터를 저장시켜 놓으면 다른 jsp 쪽에서 데이터를 받아 올 수 있다.

 

 

 

 

 

 

 

 

 

 

 

* application 영역

 

application 영역은 하나의 웹 어플리케이션과 관련된 전체 영역을 포함한다. 예를 들면 내가 네이버 페이지를 실행시키면 어플리케이션 영역이 생성 되는 것이다. 어플리케이션 영역은 내가 웹 서버에 접속하는 순간 생성되는 것으로 모든 유저들은 네이버가 제공하는 모든 jsp 문서 및 데이터를 공유할 수 있다. 하지만 session 영역은 한명의 유저가 네이버에 로그인 했을때 해당 유저의 로그인 데이터만 따로 관리하고 받아 올 수 있다.

 

어플리케이션 영역은 웹에 해당하는 웹 jsp 문서를 모두 공유하기 때문에 모든 사람들이 같은 웹 페이지를 모두 똑같이 볼 수 있다.

반응형
댓글
공지사항