HTTP 프로토콜의 특징
상태 정보를 저장하지 않는다. (stateless)
Scope의 필요성
상태 정보를 저정하기 위한 저장소를 범위에 따라서 나눠놓은 것이 scope이다.
Scope의 종류
웹 애플리케이션에는 4개의 저장소가 존재한다. HttpServletRequest를 통해 받은 변수 혹은 지역 변수를 유효 범위 내에서 사용하기 위해서는 Scope를 알아야 한다. 저장소는 Map형태 (key, value)로 되어있으며 이 곳에 data를 저장해서 사용하면 된다.
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() | 기본 객체에 저장된 모든 속성의 이름을 반환 |
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] Servlet/JSP Filter에 대해 알아보자 (0) | 2021.12.31 |
---|---|
[Spring] Servlet/JSP URL패턴과 DispatcherServlet (0) | 2021.12.30 |
[Spring] Servlet에 대해 간단히 알아보자 (0) | 2021.12.30 |
[Spring] 관심사의 분리와 MVC 패턴에 대해 알아보자 (0) | 2021.12.29 |
[Spring] Tomcat의 내부 구조, 설정 파일에 대해 알아보자 (0) | 2021.12.28 |