12주차 - jsp (14) 속성(Attribute), Redirect와 forward

2022. 9. 22. 22:52jsp/jsp

이번의 목표

01. 기본 객체 네가지에 대해 알아보자.

02. Redirect와 forward에 대해 알아보자.


JSP 는 네 개의 기본 객체를 가지고 있습니다. 이 네가지 기본 객체들의 이름은

pageContext, request, session, application 이며 (이름, 속성 값) 의 형태를 가집니다.

이것들은 페이지 사이에서 데이터를 주고받기 위해 사용 됩니다.

사용되는 메서드는 아래와 같습니다.

메서드 설명 반환 데이터
setAttribute(String name, Object value) 이름이 name, 값이 value 속성을 지정합니다. void
getAttribute(String name) 이름이 name인 속성의 값을 반환합니다. Object
removeAttribute(String name) 이름이 name인 속성을 삭제합니다. void
getAttributeNames()   속성의 이름 목록을 구한다. (pageContext 제외) Enumeration

 

각각의 객체의 특징은 아래와 같습니다.

객체 특징
pageContext 코드를 사용한 페이지 안에서만 사용이 가능
request 하나의 요청에서만 사용이 가능, 새로운 요청이 발생하면 기존의 값은 없어짐
session 웹 브라우저 프로그램이 켜져있는 동안 사용이 가능.
다른 브라우저 프로그램을 사용하면 서로 다른 session을 가지게 됨.
ex) 크롬에서 네이버 로그인을 해도 네이버 엣지에서 켜면 로그인이 되어있지 않은 상태
application 사용하는 모든 클라이언트가 공용으로 사용

여기서 request와 session에 대해 알아보겠습니다.

 

session클라이언트 별로 구분을 합니다. 이 session은 웹브라우저의 변수에 저장되기 때문에 브라우저를 종료하면 session도 함께 없어집니다. 이후 새로 브라우저를 켜면 새로운 session을 부여 받게 됩니다.

언뜻 보면 평소에 알고 있던 쿠키와도 비슷한 역할을 하는데 실제로도 쿠키 대신에 session을 사용하는 경우가 있다고 합니다. 의미적으로 보자면 session은 쿠키의 하위같은 역할이라고 합니다.

 

request는 하나의 요청에서만 사용이 가능합니다.

request의 특징을 쉽게 이해하기 위해서는 Redirect와 forward에 대해 알아볼 필요가 있습니다.

Redirect와 forward 둘다 다른 페이지로 이동하는 기능을 수행합니다.

Redirect는 페이지의 주소를 클라이언트에게 돌려주고, 사용자가 페이지의 주소로 찾아가는 형식입니다.

반면 forward는 서버가 페이지의 주소로 찾아가 데이터를 클라이언트에게 보여주는 형식입니다.

 

데이터 흐름의 예시를 함께 보겠습니다.

forward:
     [클라이언트] ---Request---> [A서버] ---Request---> [B서버]
     [B서버] ---Response---> [A서버] ---Response---> [클라이언트]

 

위의 형식을 가지기 때문에 클라이언트는 한번의 요청만 하게 됩니다.

그리고 결과적으로 클라이언트가 사용하는 서버는 A서버를 사용하고 있는 것이기 때문에 URL또한 A서버의 URL이 나옵니다.

 

Redirect:
    [클라이언트] ---Request---> [A서버]                      ( 클라이언트의 첫번째 Request 발생) 
    [클라이언트] <---Response--- [A서버]                   (A서버는 클라이언트에게 B서버의 주소를 돌려줌)
    [클라이언트] ---Request---> [B서버]                      (클라이언트의 두번째 Request 발생)
    [클라이언트] <---Response--- [B서버]                   (B서버가 클라이언트에게 Response)

위의 형식을 가지게 되기 때문에 클라이언트는 두번의 요청을 하게 됩니다.

그리고 클라이언트는 B서버를 사용하는 것이기 때문에 URL이 B서버의 URL로 바뀌는 것을 확인할 수 있습니다.

 

아래에는 객체의 값들을 저장해보고 forward로 이동했을때와 redirect로 페이지를 이동했을때 각각의 차이 점을 알아보겠습니다.

01. 객체에 속성을 지정하는 페이지 코드
02. forward로 이동한 페이지 코드
03. redirect로 이동한 페이지 코드
04. 실행 화면

01. 객체에 속성을 지정하는 페이지 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex05_A</title>
</head>
<body>
	<%
		pageContext.setAttribute("id", "pageId");
		request.setAttribute("id", "requestId");
		session.setAttribute("id", "sessionID");
		application.setAttribute("id", "applicationId");
		
		request.getRequestDispatcher("ex05_B.jsp").forward(request, response);
	%>
</body>
</html>

02. forward로 이동한 페이지 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex05_B</title>
</head>
<body>
	페이지 : <%= pageContext.getAttribute("id") %><br>
	요청 : <%= request.getAttribute("id")%><br>
	세션 : <%= session.getAttribute("id")%><br>
	애플리케이션 : <%= application.getAttribute("id")%><br>
	
	<a href="ex05_C.jsp">C 페이지로 이동</a>
</body>
</html>

03. redirect로 이동한 페이지 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex05_C</title>
</head>
<body>
	<h2>C 페이지</h2>
	페이지 :
	<%=pageContext.getAttribute("id")%>
	<br> 요청 :
	<%=request.getAttribute("id")%><br> 세션 :
	<%=session.getAttribute("id")%><br> 애플리케이션 :
	<%=application.getAttribute("id")%><br>
</body>
</html>

04. 실행 화면

① A페이지에서 네 종류의 객체에 속성을 지정하고 B페이지로 바로 이동했을때의 화면입니다.

    페이지가 바뀌었기 때문에 pageContext 값이 null인 것을 확인할 수 있습니다.

② forward로 이동할때에는 요청이 한번만 일어나기 때문에 request의 값도 남아 있는 것을 확인할 수 있습니다.

③ C페이지로 넘어갈때에는 Redirect로 넘어갔기 때문에 request의 값이 초기화 되어 null이 나오는 것을 확인할 수 있습니다.

④ C페이지에서 브라우저는 꺼지지 않았기 때문에 session은 남아있는 것을 확인할 수 있습니다.

⑤ 마지막은 네이버 웨일로 C페이지를 열었을 때의 화면입니다.

    브라우저가 꺼졌고 session을 받지 않고 바로 C페이지로 이동했기 때문에 session 값이 null인 것을 확인할 수 있습니다.

⑥ application은 모든 클라이언트가 공유하는 것이라서 다른 브라우저로 접속해도 그대로 남아있는 것을 확인할 수 있습니다.