Session 은 브라우저가 최초로 서버에 요청을 하게 되면 브라우저당 하나씩 메모리 공간을 서버에서 할당하게 된다.
이 메모리 영역은 브라우저당 하나씩 지정되며 요청이 새롭게 발생하더라도 같은 메모리 공간을 사용하게 된다.
이 영역은 브라우저가 종료될 때 까지 서버에서 사용할 수 있다.
sessionScope 에서 session 영역에 저장되어 있는 데이터를 사용할 수 있다.
HttpServletRequest request
reqeust.getSession() 을 통해 session을 사용할 수도 있지만
HttpSession session 으로 바로 사용할 수도 있다.
또는 다음과 같이 @SessionAttribute("id value") 형식자 이름
을 통해 받아올 수도 있다.
Session 영역에 저장되어 있는 객체를 사용하고자 할 때 메서드의 매개변수로 @SessionAttribute를
내부코드에서 session.getAttribute 뭐 할 필요없이 바로 받아올 수 있으니 편하다.
지난 시간에 커맨드 객체를 이용할 떄에
@ModelAttribute DataBean bean
이런식으로 받아왔었고, 어노테이션은 생략이 가능했다. 따로 정해진 이름이 없기 때문에 jsp 에서는 앞글자를 소문자로 딴 dataBean.data1 로 data값을 받아왔고, 이름을 따로 정해주려면 @ModelAttribute("asdf") DataBean bean 처럼 사용
하였는데, 이 ModelAttribute를 통해 주입 받는 Bean은 자동으로 request영역에 저장이 되어서 jsp 에서 바로 쓸 수가 있었다. 이 때, @ModelAttribute를 통해 주입받는 Bean을 @SessionAttributes로 지정해 놓으면 request 영역이 아닌 session 영역에 저장되고 session 영역으로 부터 주입 받을 수가 있다. 주의할 점은 @ModelAttribute를 활용하여 객체를 생성해 반환하는 메서드를 반드시 작성해 줘야 한다는 점이다.
원래 이 코드는 보면 sessionBean1 이라는 이름으로 bean을 주입받고 request영역에 자동으로 저장이 된다.
하지만 이것을
다음과 같이 Controller 어노테이션 밑에 @SessionAttributes("sessionBean1") 을 적어놓게 되면
이 컨트롤러에서 sessionBean1 이라는 이름으로 modelattribute를 통해 주입받는 객체는 request 가 아닌 session 영역에 저장을 하겠다 라고 명시를 하는 것이다.
이 때, 객체를 만들어서 반환하는 메서드를 만들어줘야 하는데, 브라우저가 최초의 요청이 발생하게 되면 sessionBean1 이라는 이름으로 등록되어 있는 메서드를 호출해서 걔가 반환하는 객체를 세션이 자동으로 저장을 하고 나중에 매핑되어있는 메서드가 호출이 될 때에 그곳으로 주입이 되는 것이다. 일단 세션 객체에 저장이 되어져 있어야지만 주입이 가능하기 때문에 세션 객체에 저장이 가능하도록 이곳에 ModelAttribute를 정의해주어야 하는 것이다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
SessionScope Bean 주입하기
SessionScope는 Bean을 정의할 때 session scope로 정의하면 브라우저가 서버에 최초의 요청을 보낼 때 bean 객체가 주입된다. 주입된 Bean은 주입만 이루어지는 것으로 session 영역에 저장되지는 않는다.
어제의 RequestScope는 request scope로 정의하면 요청이 발생할 때마다 bean 객체가 생성되어 주입된다.
sessionscope 설정 방식은 RequestScope Bean 주입과 매우 유사하다. @RequestScope 어노테이션을 사용하는 경우 @SessonScope로 바뀌었다는 점 정도?
***JAVA 방식***
Component 방식이 아닌 일반 방식은 RootAppContext.java 에 다음과 같이 어노테이션을 사용해준다.
component의 경우엔 databean 클래스 파일위에 다음과 같이 사용해주고 value 값을 정해도 된다.
component의 경우엔 ServletAppContext.java 파일에 @ComponentScan("kr.co.bepoz.beans") 써준다.
requestScope 때와 같이 Autowired 와 Resource를 사용해준다.
주입만 되고 session 영역에 저장되지는 않으므로 Model을 이용해 request에 저장을 해주어야 한다.
jsp 에서는 ${requestScope.sessionBean1.data1} 와 같이 이용해준다.
***XML 방식***
JAVA 방식과 다른점은 RootAppContext.java에 추가하는 것이 아니라 root-context.xml에
<bean class='kr.co.bepoz.beans.DataBean2' scope='session' id='sessionBean2'/> 를 추가해준다는 것과
ServletAppContext.java 가 아닌 servlet-context.xml 에
<context:component-scan base-package="kr.co.bepoz.beans"/> 를 추가해준 다는 것
그리고 requestScope 때와 유사하게 Component 방식이 아닌 일반적인 방식을 사용할 때에,
id 를 사용을 한다면 자동으로 session 객체에 저장이 되어서 따로 model.addAttribute를 해주지 않아도 된다는 점이다.
(requestScope 때에는 자동으로 request 객체에 저장이 되었었음)
<bean class='kr.co.bepoz.beans.DataBean2' scope='session' id='sessionBean2'/> 인 id를 설정해주었기 때문에
model에 추가하지않고도 ${sessionScope.sessionBean2.data3} 를 이용하여 jsp에서 접근이 가능하다.
ㅡㅡㅡㅡ
Application Scope
*서버가 가동될 때부터 서버가 종료되는 시점까지의 범위를 Application Scope라고 부른다.
*Application Scope 동안 사용할 수 있는 메모리 영역이 만들어지며 Servlet Context 라는 클래스 타입의 객체로 관리됨
*ServletContext에 저장된 데이터나 객체는 서버가 종료되기 전까지 서버는 웹브라우저에 관계없이
동일한 메모리 공간을 사용하게 된다.
얘는 서버가 가동되고 있을 때에 존재하기 때문에 다른 브라우저로 링크를 들어갔을 경우에 SessionScope 때에는
값 전달이 안되었지만 ApplicationScope는 전달이 된다!
*Bean을 정의할 때 application scope로 정의하면 서버가 가동될 때 자동으로 주입된다.
*주입된 Bean은 주입만 이루어지므로 application 영역에 저장되지는 않는다.
*서버가 가동될 때 자동 주입되므로 @Lazy를 설정하지 않아도 된다.
Java 방식은 @ApplicationScope 를 사용. XML은 scope="application" 을 이용한다.
지금까지 해왔던 Scope 적용방식과 같다.
이번에도 XML에서 id를 사용하고 Component 방식이 아닌 bean은 applicationScope 에 바로 저장이 돼서
Model 객체 없이 jsp에서 바로 사용할 수 있다.
'공부 기록들' 카테고리의 다른 글
2020.04.21 MVC(7) (JSR-303, JSR-380, Validator 커스터마이징, Interceptor) (0) | 2020.04.21 |
---|---|
2020.04.20 MVC(6) (쿠키, 유효성 검사, JSR-303) (0) | 2020.04.20 |
2020.04.16 MVC(4) ( Bean 주입 java/xml, form 태그, redirect, forward, requestScope ) (0) | 2020.04.17 |
2020.04.14-15 MVC(3) (파라미터 받아오기2, 커맨드 객체) (0) | 2020.04.15 |
2020.04.13 MVC(2) (파라미터 받아오기) (0) | 2020.04.13 |