JSP로 개발하다 JAVA코드가 너무 길어지면 지저분해졌다.
그래서 JAVA코드는 서블릿쪽으로만 집중 시키고 JSP는 되도록 HTML에 집중 시켰다.
> 리다이렉트가 아니라 포워드
JSP에서 이벤트가 발생했을때 대응하는 url이 있을것이다.
그 url과 서블릿을 대응시키고 서블릿은 또 JAVA클래스와 대응시킨다.
JAVA 클래스에서 동적처리를 진행하면 다음 JSP를 클라이언트에 보낸다.
이것이 바로 포워드이다.
서블릿에서 JSP로 이동이 브라우저를 통하지 않고 WAS 내에서만 진행하고 한 방에 갈 곳을 정해주는 방식이다.
(cf. 리다이렉트는 브라우저에 요청을 하게 지시(302)를 내리고 브라우저가 다시 요청을 하게되는 HTTP를 두번 요청하는 방식이다. )
> 요청 스코프
포워드 할때 요청 파라미터 바탕으로 서블릿에서 처리하고 그 결과를 JSP에 표시하도록 전달 방식이 필요하다.
예를 들어 아이디를 받아서 서블릿에서 DB를 참조해서 이름을 JSP에 넘겨줄 때이다.
그때요청스코프를 이용한다.
요청파라미터는 클라이언트에서 WAS로 넘겨줘서 WAS에서 읽기만 가능한 정보이다.
읽어온 요청파라미터 값을 가지고 처리한 다음 요청스코프에 값을 쓴다. (request.setAttribute())
이 요청스코프는 HTTP요청 1회에만 유효한다. 따라서 리다이렉트는 정보를 유지 할 수 없다.
JSP에서 요청스코프의 정보를 태그를 이용해 추출한다.
> 근데 세션으로 해결하면 안 되나?
안 된다.
세션은 일단 HTTP규격이 아니라 WAS에서 자의적으로 구현한 것이다.
따라서 WAS에서는 지속적으로 보존 될 수 있으나 클라이언트에서 스스로 세션 종료를 할 수가 없다.
그리고 세션이 안 좋은게 메모리를 많이 잡아 먹는데 세션이 종료되지 않고 축적되면 서버가 버티기 힘들다.
그래서 세션 접속 시간을 WAS에서 기록해서 타임아웃으로 자동 삭제하게 만들었다. (톰캣은 기본 30분)
아니면 로그아웃 같은 이벤트에 세션을 삭제 하게 만들면 된다. 그래도 브라우저 닫기만 하면 세션 정보가 남는다. 결국 세션스코프는 어떤 이벤트로 웹애플리케이션에 의해 삭제 될때 까지 보존 되는거라 인증 쪽으로만 쓴다. 반면 요청스코프는 하나의 요청안에서만 유효하며 WAS가 제어한다.