프로그래밍/Spring

[Spring] Servlet/JSP Scope에 대해 알아보자

byungmin 2021. 12. 30. 20:16

HTTP 프로토콜의 특징

상태 정보를 저장하지 않는다. (stateless)

 

Scope의 필요성

상태 정보를 저정하기 위한 저장소를 범위에 따라서 나눠놓은 것이 scope이다.

 

Scope의 종류

웹 애플리케이션에는 4개의 저장소가 존재한다. HttpServletRequest를 통해 받은 변수 혹은 지역 변수를 유효 범위 내에서 사용하기 위해서는 Scope를 알아야 한다. 저장소는 Map형태 (key, value)로 되어있으며 이 곳에 data를 저장해서 사용하면 된다.

 

유효 범위(Scope)의 종류

pageContext

  • 접근 범위 : 하나의 요청 받은 페이지 (다른 페이지에서는 접근 불가)
  • 지역변수를 저장한다. - 기본객체도 포함(response, request 등)
  • 접근가능하다는 것은 읽기과 쓰기가 가능하다는 것
  • forward가 될 경우 해당 Page scope에 지정된 변수는 사용할 수 없다.
    어떤 페이지로 요청이 들어온 뒤, 다른 페이지로 forward 될 경우 이전 page scope내에 있던 변수는 forward 된 page scope 내에서는 사용할 수 없다.
  • 요청할 때마다 새로 초기화 된다.

같은 페이지에 저장소가 있는 이유

JSP에서는 기존 <%=lv %> 안에서는 저장소에 data가 저장되어있지 않아도 요청받은 매개변수를 사용할 수 있는데 반해 ${} 로 쓰이는 EL태그는 같은 페이지에 있더라도 지역변수를 바로 불러오지 못하기 때문에 pageContext 저장소에 저장해서 사용하게 된다.

결국 EL 태그를 사용하기 위해 존재

 

request

이 저장소는 request 객체가 Map을 가지고 있는 경우이다. 클라이언트로부터 하나의 요청이 들어와서 서버가 일을 수행한 후 응답을 보낼 때까지 계속 사용할 수 있다.

  • request 저장소는 JSP에서 다른 JSP로 foward 시 값을 유지하고자 할 때 사용된다.

 

session

  • 접근 범위 : 클라이언트마다. 개별 저장소
  • 하나의 브라우저 당 1개의 session 객체가 생성됩니다.
  • 같은 브라우저 내에서 요청되는 페이지들은 같은 객체를 공유하게 된다.
  • 세션이 종료되면 객체는 반환됩니다.
  • id, 장바구니 등 사용자만 사용할 수 있는 개별 정보를 담아두면 좋다.

session의 단점

사용자마다 한 개씩 갖는 개별 저장소이기 때문에 사용자 수가 많아질수록 세션 객체도 계속 생성된다. 서버 부담이 제일 큰 scope이다. 그러므로 세션에는 최소한의 정보만 저장하는 것이 좋다.

 

application

  • 접근 범위 : WebApp 전체에서 접근 가능하다.
  • 딱 1개만 존재한다. 공통 저장소
  • 전체 애플리케이션에서 공유하는 저장소이기 때문에 개별적인 id 등을 저장하기에는 부적절 하다.

 

결국 웹 프로그래밍이라는 것은

페이지들 간의 이동과 데이터 전달이다. 페이지들간의 데이터를 전달할 때 제일 편한 것이 session이다. 하지만 session은 메모리 부담이 크다는 단점이 있다. 메모리에 가장 부담이 적은 request 객체를 사용하는 것을 추천한다.

 

scope 정리

기본 객체 유효 범위 설명
pageContext 1개 JSP 페이지 JSP 페이지의 시작부터 끝까지. 해당 JSP 내부에서만 접근가능. 페이지마다 1개
request 1+개 JSP 페이지 요청의 시작부터 응답까지. 다른 JSP로 전달 가능(forward). 요청마다 1개
seesion n개 JSP 페이지 session의 시작부터 종료까지 (ex. 로그인 ~ 로그아웃). 클라이언트마다 1개
application context 전체 Web Application의 시작부터 종료까지. context 내부 어디서나 접근 가능. 모든 클라이언트가 공유. context마다 1개

 

Scope의 공통 메서드

속성 관련 메서드 설명
void setAttribute(String name, Object value) 지정된 값(value)을 지정된 속성 이름(name)으로 저장
Object getAttribute(String name) 지정된 이름(name)으로 지정된 속성의 값을 반환
void removeAttribute(String name) 지정된 이름(name)의 속성을 삭제
Enumeration getAttributeNames() 기본 객체에 저장된 모든 속성의 이름을 반환