스프링의 정석/Ch. 02 Spring MVC

14. 서블릿과 JSP (2)

돌맹이떼굴떼굴 2023. 7. 10. 15:39

8. 유효 범위(scope)와 속성(attribute)

HTTP 특징 중에 상태 정보를 저장하지 않는다는 것을 'stateless' 하고 반대되는 개념은 'stateful'이라 한다. 'stateful' 상태 정보를 저장한다는 뜻이된다. HTTP 'stateless'특징 때문에 저장소가 필요하고 유효 범위(scope) 따라 4개가 있다. 4개의 저장소를 구분 짓는 특징은 접근 범위, 생존 기간이 있다. 접근 범위와 생존 기간이 다른 4개의 저장소가 있다.

 

저장소는 Map 형태로 data 저장한다.

 

저장소 1. pageContext

pageContext안에 Map 있다. 저장소는 lv 지역변수를 저장한다. 기본 객체(request, response) lv이기 때문에 pageContext안에 들어있다. 범위는 page이고 page안에 있는 코드만 접근할 수 있다. 프로그래밍에서 접근 읽고 쓰기가 된다는 뜻이다. 정확히는 Map 읽고 쓴다.

 

같은 메서드 안에 있는데 lv 굳이 저장해야 할까 하는 의문이 있다. EL때문에 lv 저장해야 한다. jsp에서 찍을 <%=lv%> 된다. 하지만 EL ${lv}가 안된다. EL로는 lv 직접 접근할 없다. EL에서 쓰려면 pageContext 저장하고 다음에 EL에서 lv 읽을 있다. 이렇게 쓰는 이유는 <%=lv%> 불편해서 EL인 ${lv}로 개선했는데 저장소가 필요했고 이 저장소가 pageContext이다.

 

같은 page안이지만 pageContext 저장소를 사용해서 값을 읽고 쓴다. 또한 기본 객체를 사용하려면 pageContext 거쳐서 사용해야 한다. 기본 객체는 lv 지역변수이다. pageContext 장점은 다른 page 접근이 불가능하다. 요청할 때마다 초기화되어 앞에 사람이 쓰던 값이 남아있는 경우가 없다.

 

저장소 2. application

접근 범위로는 Web Application 전체에서 접근 가능하다. 1개만 존재한다. pageContext에서는 쓰기, 다른 pageContext에서는 읽기가 가능하다. 저장소 Map 형태로 data 저장하는데  data 쓰기(저장) setAttribute 메서드, data 읽기는 getAttribute 메서드를 사용한다. 메서드는 저장소에서 data 읽고 쓰 공통 메서드이다.

 

클라이언트가 첫 요청으로 id, pwd 입력해서 login하고, 두 번째로 글쓰기 요청을 보내면 요청에서는 login 했다는 것을 없다. 이유는 HTTP 상태 정보가 없어 요청이 같은 클라이언트인지 모른다.

 

application 저장소key값에 id 저장한다. key가 속성(attribute)이기 때문에 읽고 쓰는 메서드에 Attribute 단어 들어간다. 하지만 application 저장소는 모든 페이지에서 접근가능하므로 다른 사용자가 login 하면 value 기존 정보가 사라진다. application 전체에서 공유하는 저장소이기 때문에 개별적인 data(id, pwd) 저장하기에는 좋지 않다.

 

저장소 3. session

application 저장소 단점으로 session 저장소가 생겼다. 클라이언트 있는 개별 저장소이고 클라이언트와 저장소가 1:1 이다. 클라이언트의 저장소에 id로 'asdf' 저장되고 다른 클라이언트의 저장소에는 id로 'aaa' 저장된다. 따라서 로그인 후에도 로그인 정보가 남아있어 글을 쓸 수 있. 나중에 쿠키를 배울텐데 session 쿠키를 이용해서 session 어느 클라이언트의 저장소인지 연결한다.

 

session 저장소는 클라이언트에 있는 개별 저장소이다. login하면 개별 저장소가 생기고 logout하면 삭제된다. 저장소에는 id, 장바구니 개인정보를 담으면 좋다. 단점은 사용자마다 갖는 개별저장소이기 때문에 사용자 숫자만큼 객체가 생긴다. 최소한의 data session 저장소 저장해야한다. session 저장소가 서버부담이 제일 크다. session 객체는 login하는 동안 여러 저장소가 접근 가능해 프로그래밍하기 쉽지만 서버부담이 크기 때문에 최소한의 data 저장해야한다.

 

저장소 4. request

request 객체도 Map 갖고 있다. 요청할 때마다 생기고 클라이언트에 독립적이다. 요청을 하나의 JSP page 담당해서 JSP안에서 request 객체를 사용할 있다. Map data 저장할 있다.

 

보통은 요청을 JSP 응답하면 끝이 나는데 반드시 그런건 아니다. 요청을 번째 JSP 응답을 하지 않고 다른 JSP request 객체를 넘겨줄 있다. 이를 forward 한다. a.jsp 호출 했는데 request 처리하지 못할 경우 b.jsp request 객체를 넘긴다.

 

web 프로그래밍이란 page간의 data이동이다. 제일 쉬운 저장소가 session이다. 하지만 메모리 부담이 제일 크다. 다음 제일 많 사용하는 저장소가 request이다. request 사용하지 못할 session 잠깐 저장했다가 삭제한다.

 

pageContext 범위 :  page(EL ${ } 때문에 사용한다.)

application 범위 : Servlet Conext 전체(page에서 application 접근 가능하다. 프로그램 전체에서 공통으로 사용하는 dat 저장한다.)

session 범위 : 클라이언트가 접근하는 page 전체(web page간의 data전달인데 request 담아서 전달하는 방법이 일반적이다. 대신 서버의 메모리 부담이 사용하고 바로 삭제한다.)

request 범위 : 요청할 request 객체에 담아서 page 이동하므로 우선적으로 request 담는다.

 

setAttribute, getAttribute 둘을 가장 많이 쓴다. setAttribute data Map 형태로 저장되어 있어 매개 변수로 key, value 적어야 한다. remove session객체의 부담으로 바로 삭제할 사용한다.