자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 9. 내장 객체의 영역(Scope) - session 영역, application 영역

개발학생 2023. 5. 3. 13:24
반응형

3. session 영역

  • session: 클라이언트가 서버에 접속해 있는 상태 혹은 단위. 주로 회원인증 후 로그인 상태를 유지하는 처리에 사용됨 → 포털 사이트에서 웹 브라우저를 닫으면 자동으로 로그아웃이 되는 이유가 session 객체의 특성 때문
  • 클라이언트가 웹 브라우저를 최초로 열고 난 후 닫을 때까지 요청되는 모든 페이지는 session 객체 공유 가능

 

*session 영역 동작 확인, session 영역이 이동된 페이지에서도 공유되는지 확인

//session 영역 동작 확인용
//SessionMain.jsp

<%@ page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset="UTF-8"
		page encoding="UTF-8"%>
<%
//1.(아래 코드 3줄)
ArrayList<String> lists = new ArrayList<String>();
list.add("리스트");
list.add("컬렉션");
session.setAttribute("lists", lists);    //2.
%>
<html>
<head><title>session 영역</title></head>
<body>
		<h2>페이지 이동 후 session 영역의 속성 읽기</h2>
		<a href="SessionLocation.jsp">SessionLocation.jsp 바로가기</a>    //3.
</body>
</html>
  1. ArrayList 컬렉션 생성 후 2개의 String 객체를 저장
  2. 1.의 ArrayList 컬렉션을 통째로 session 영역에 저장
  3. session 영역이 이동된 페이지에서도 공유되는지 확인하기 위한 링크
//링크릴 클릭해 이동할 페이지(session 영역이 이동된 페이지에서도 공유되는지 확인)
//SessionLocation.jsp
<%@ page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>
<html>
<head><title>session 영역</title></head>
<body>
		<h2>페이지 이동 후 session 영역의 속성 읽기</h2>
		<%
		ArrayList<String> lists = (ArrayList<String>)session.getAttribute("lists");    //1.
		for (String str : lists)    //2.
				out.print(str + "<br/>");
		%>
</body>
</html>
  1. session 영역에서 속성을 읽어온 후 형변환 [컬렉션 타입은 ArrayList(String)]
  2. for문을 이용해 ArrayList(String) 컬렉션에서 객체들을 꺼내 출력

 

SessionMain.jsp 파일 실행, [SessionLocation.jsp 바로가기] 링크 클릭
→ 페이지가 이동되었지만, session 영역에 저장된 속성값은 정상적으로 출력됨

  • 웹 브라우저 전체를 닫고, SessionLocation.jsp 파일을 실행하면 session 영역의 속성값이 삭제되어 ‘500 에러’ 발생
    → getAttribute(”lists”)로 속성값을 읽어오려 하면 null을 반환하여 NullPointerException이 발생하는 것
    → SessionMain.jsp 파일을 실행하면 그때 새로운 session 객체가 만들어지고,
        그때 저장된 속성값이 정상적으로 출력됨

 

4. application 영역

  • 웹 애플리케이션은 단 하나의 application 객체를 생성하고, 클라이언트가 요청하는 모든 페이지가 application 객체를 공유하게 됨
  • application 객체는 웹 서버를 시작할 때 만들어지며, 웹 서버를 내릴 때 삭제됨
  • 이 영역에 한 번 저장된 정보는 페이지를 이동하거나, 웹 브라우저를 닫았다가 새롭게 접속해도 삭제되지 않음

 

1) application 영역 동작 확인

//ApplicationMain.jsp

<%@ page import="java.util.HashMap"%>
<%@ page import="common.Person"%>
<%@ page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>
<html>
<head><title>application 영역</title></head>
<body>
	<h2>application 영역의 공유</h2>
	<%
	//1.(아래 3줄)
	Map<String, Person> maps = new HashMap<>();
	maps.put("actor1", new Person("이승기", 30));
	maps.put("actor2", new Person("신민아", 28));
	application.setAttribute("maps", maps);    //2.
	%>
	application 영역에 속성이 저장되었습니다.
</body>
</html>
  1. HashMap 컬렉션 생성 후 두 개의 Person 객체를 저장함
  2. 컬렉션을 통째로 application 영역에 저장함
  • 파일 실행 시, application 영역에 속성값이 저장됨

 

2) application 영역에 저장한 속성을 읽어오는 결과 페이지

//ApplicationResult.jsp
<%@ page import="java.util.Set"%>
<%@ page import="common.Person"%>
<%@ page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>
<html>
<head><title>application 영역</title></head>
<body>
	<h2>application 영역의 속성 읽기</h2>
	<%
	Map<String, Person> maps
	       = (Map<String, Person>)application.getAttribute("maps");    //1.
	Set<String> keys = maps.keySet();    //2.
	//3.(for 문 전체)
	for (String key : keys) {
		Person person = maps.get(key);
		out.print(String.format("이름 : %s, 나이: %d<br/>",
						person.getName(), person.getAge()));
	}
	%>
</body>
</html>
  1. application 영역에 저장한 “maps” 속성값을 읽어서 원래 형태인 Map<String, Person> 타입 변수에 저장함
  2. Map 컬렉션에 담긴 데이터를 확인하려면 key를 알아야 하는데, 여기서 keySet( )으로 얻어 옴
  3. 확장 for문에서 모든 키에 해당하는 값들을 하나씩 꺼내 출력 → Map에 저장된 객체를 꺼낼 때는 get( ) 사용
  • 위처럼 웹 브라우저 전체를 닫고(크롬 창이 단 한 개도 열려 있으면 안 된다) 파일 실행 시, ApplicationMain.jsp에 저장했던 속성값이 여전히 정상 출력됨

  • 이클립스 [Severs] 뷰에서 마우스 우클릭 → [Restart]로 톰캣 웹 서버를 재시작해보기 → 웹 브라우저에서는 500 에러 메세지를, 이클립스의 [Console] 뷰에서는 NullPointerException을 확인할 수 있음

반응형