[JSP] 03. 내장 객체의 영역 (Scope)

Min's Study Note·2023년 11월 1일
0

JSP

목록 보기
5/16

▣ 내장 객체의 영역이란

  • 각 객체가 저장되는 메모리의 유효기간
  • JSP는 페이지 단위로 구성되므로 4가지 영역을 통해 데이터를 공유할 수 있음

▣ 내장 객체의 4가지 영역

  • page 영역
    - 동일한 페이지에서만 공유되어 페이지를 벗어나면 소멸
    - pageContext 객체를 사용
  • request 영역
    - 하나의 요청에 의해 호출된 페이지와 포워드(요청 전달)된 페이지까지 공유
    - request 객체를 사용
  • session 영역
    - 클라이언트가 처음 접속한 후 웹 브라우저를 닫을 때까지 공유
    - session 객체를 사용
  • application 영역
    - 한 번 저장되면 웹 애플리케이션이 종료될 때까지 유지
    - application 객체를 사용

▣ 내장 객체의 영역별 접근범위 및 포함관계

  • 범위의 크기 : application > session > request > page
  • 애플리케이션 구조에 따라 큰 영역은 작은 영역을 하나 이상 포함할 수 있음

▣ 주요 메서드

  • 위 메서드는 4가지 내장객체의 영역에서 공통으로 사용
  • 즉 사용법의 차이는 없고, 단지 공유 범위에서만 차이가 있음

▣ DTO란

  • DTO(Data Transfer Object)는 주로 데이터를 저장하거나 전송하는 데 쓰이는 객체
  • 별 다른 로직 없이 순수하게 데이터만 저장하는 기능을 가짐
  • 데이터만 가지고 있으므로 VO(Value Object)라고 하기도 함
  • 자바빈즈(Java Beans) 규약에 따라 작성
    - 자바빈즈는 기본(default) 패키지 이외의 패키지에 속해야 함
    - 멤버 변수(속성)의 접근 지정자는 private으로 선언
    - 기본 생성자가 있어야 함
    - 멤버 변수에 접근할 수 있는 게터(getter)/세터(setter) 메서드가 필요
    - 게터/세터 메서드의 접근 지정자는 public으로 선언

▣ Person 클래스 생성

  • Java Resources 하위의 src/main/java에 생성

  • Java Resources → src/main/java → 마우스 우클릭 → [New] → [Class] 클릭

✔️ 예제 3-1] Java Resources/common/Person.java

  • 멤버변수 선언 및 기본생성자 정의
  • Getters / Setters 생성
  • 편집창에서 마우스 우클릭 → [Source] → [Generate Getters and Setters...] 선택

  • [Select All] → [Generate] 클릭해서 완성

▣ page 영역

  • 클라이언트의 요청을 처리하기 위해 JSP 페이지 당 하나씩 생성
  • pageContext 객체를 통해 영역을 사용함
  • 해당 페이지에서만 공유되고 페이지를 벗어나면 소멸
    -include 지시어를 통해 포함한 파일도 공유됨(다음 페이지)

예제 3-3] 03Scope/PageContextMain.jsp



❷ setAttribute()로 속성 저장
❸ getAttribute()로 속성 읽기
❹ 사용시 반드시 원래의 타입으로 형변환

  • 예제 3-3]에 포함시킬 JSP문서 생성
  • 해당 파일은 page 지시어를 제외한 모든 HTML태그를 제거한 후 작성

예제 3-4] 03Scope/PageInclude.jsp


❷ 해당 페이지는 include 지시어를 통해 포함되었으므로 page영역이 공유되어 모든 내용이 출력됨

  • 예제 3-3]에서 <a>태그의 링크로 이동할 페이지
  • 해당 파일은 HTML태그를 제거하지 않고 작성

✔️ 예제 3-5] 03Scope/PageLocation.jsp


❷ 페이지 이동시 page 영역은 소멸되므로 모든 값이 출력되지 않음

▣ request 영역

  • request 영역은 하나의 요청에 대한 응답이 완료될 때 소멸
  • 페이지 이동시에는 소멸되지만, 포워드 된 페이지까지는 영역을 공유할 수 있음
  • 따라서 page 영역보다는 접근 범위가 넓음

예제 3-6] 03Scope/RequestMain.jsp


❶ 영역에 저장시에는 setAttribute() 를 동일하게 사용
❷ 삭제시 removeAttribute() 를 사용
❸ 삭제할 속성이 없더라도 에러가 발생하지 않음

  • 포워드는 다소 복잡한 함수의 조합으로 기술해야 함

✔️ 예제 3-6] 03Scope/RequestMain.jsp(계속)


RequestForward.jsp로 포워드 하면서 쿼리스트링을 통해 파라미터도 함께 전달

  • 포워드 되는 페이지 작성

✔️ 예제 3-7] 03Scope/RequestForward.jsp


❶ request 영역은 포워드 된 페이지까지는 공유되므로 속성을 읽어올 수 있음
❷ ❶에서 읽은 속성값 출력
❸ Tomcat 10.1에서는 한글 깨짐 현상이 없으므로 생략가능. 9이하에서는 깨짐 현상 발생됨.
❹ 쿼리스트링을 통해 전달된 파라미터 출력

▣ session 영역

  • 웹 브라우저를 최초로 연 후 닫을 때까지 요청되는 모든 페이지는 session 영역을 공유
  • 세션(session)이란 클라이언트가 서버에 접속해 있는 상태 혹은 단위

✔️ 예제 3-8] 03Scope/SessionMain.jsp


❶ List 컬렉션에 문자열 저장
❷ List를 session영역에 저장
<a> 태그를 통해 페이지 이동

  • session영역은 웹 브라우저를 닫을때까지 공유되므로 이동한 페이지에서도 데이터를 읽어올 수 있음

✔️ 예제 3-9] 03Scope/SessionLocation.jsp


❶ session 영역에 저장된 List 컬렉션을 읽어온다. 이때 형변환 해야한다.
❷ 갯수만큼 반복해서 출력한다.
session 영역의 속성값을 삭제하려면 웹 브라우저를 완전히 닫았다가 다시 열면 됨
주의) 탭만 닫아서는 session이 삭제되지 않음

▣ application 영역

  • 웹 애플리케이션은 단 하나의 application 객체만 생성하고, 클라이언트가 요청하는 모든 페이지가 application 객체를 공유
  • 웹 서버가 시작될때 생성되고, 종료할때 소멸
  • 따라서 웹 브라우저를 새롭게 시작해도 소멸되지 않음

✔️ 예제 3-10] 03Scope/ApplicationMain.jsp


❶ Map 컬렉션에 Person 객체를 2개 추가
❷ application 영역에 Map 컬렉션을 저장

  • 웹 브라우저를 완전히 닫아도 영역이 공유되므로 예제를 단독으로 실행

✔️ 예제 3-11] 03Scope/ApplicationResult.jsp

❶ application 영역에 저장된 속성인 Map 컬렉션을 가져옴
❷ Map은 key를 먼저 얻어온 후 반복해야 함
❸ key의 갯수만큼 반복하여 value를 읽어와서 출력

  • application 영역에 저장된 속성을 삭제하고 싶다면 서버를 재시작하면 됨
  • 이클립스 하단의 [Servers] 탭에서 Restart 버튼을 클릭
  • 예제 3-11]을 단독으로 재실행하면 NullPointerException 이 발생됨

▣ 핵심요약

  • page 영역 : 동일한 페이지에서만 공유되고, 페이지를 벗어나면 소멸.
  • request 영역 : 하나의 요청에 의해 호출된 페이지와 포워드(요청 전달)된 페이지까지 공유. 페이지 이동시 소멸.
  • session 영역 : 클라이언트가 최초 접속한 후 웹 브라우저를 닫을 때까지 공유. 페이지 이동시에도 소멸되지 않음.
  • application 영역 : 한 번 저장되면 웹 애플리케이션이 종료될 때까지 유지됨. 서버가 셧다운 되었을때 소멸

0개의 댓글

관련 채용 정보