이 게시글은 남궁성 강사님의 스프링의 정석 강의를 요약,정리한 글입니다.
redirect와 forward의 처리 과정 비교(JSP)
redirect
- 서버의 URL 재요청
- 요청에 대한 응답(300번대)으로 body는 없다
- 브라우저는 location 응답헤더의 URL로 자동으로 새로운 요청을 보낸다
- 브라우저의 URL창의 URL이 새로운 주소로 변한다.
- GET 방식만 사용
- 요청도 두 번, 응답도 두 번
- redirect시 model에 값을 저장하면 Spring이 queryString으로 자동변환해준다.
forward
- 요청 처리 불가 시 또는 일부 요청 처리 후 다른 URL로 요청을 넘기는 것이 forward
- forward할 때 request객체에 data를 담아 forward할 수 있다
- forward되어도 기존 request를 사용하기 때문에 브라우저의 URL은 변하지 않는다.
- forward시 model에 값을 저장해도 Spring이 queryString으로 자동 변환해주지 않고 값은 사라진다.
- MVC패턴의구현
- request는 model
- login.jsp는 view
- write.jsp는 Controller
- spring이 forward방식을 통해 MVC패턴을 구현한 것
RedirectView
- Controller에서 “redirect:/register/add” 문자열 반환
- DispatcherServlet에서 반환 받은 문자열의 “redirect”를 보고 RedirectView로 전달
- RedirectView에서 응답 헤더를 생성하여 응답
- 브라우저에서 응답을 보고 응답 헤더의 location의 url로 자동 요청
JstlView
- Controller에서 view이름(”registerForm”)을 반환
- DispatcherServlet(DS) 에서 InternalResourceViewResolver에 view이름을 넘겨줌
- InternalResourceViewResolver에서 view의 전체 경로를 DS에 반환(해석한다. 접두사 접미사, servlet-context.xml)
- jstlView은 전체 경로를 받아 해당 view에 model을 넘겨준다.
- registerForm.jsp는 최종 응답을 브라우저에 넘겨준다.
- jstlView는 jsp뷰를 처리(JSTL, JS Tag Library와 다름)
- spring에는 다양한 view가 있다. jsp니까 jstlView임.
InternalResourceView
- forwarding할 때 사용되는 view
- forward하여 request를 넘겨줄 path를 DispatcherServelet에 전달
= 내부 요청
- 브라우저가 요청을 1번만 해서 forward 되어 다른 곳에서 요청이 처리되어도 브라우저의 요청 URL은 달라지지 않는다.
- 실 사용 예
한 요청에 뷰 옵션이 여러 개가 있는 경우(은행 1년치 입출력 내역을 pdf, excel, csv로 할 것인지를 선택)(사용자가 몰라도 되는 처리 경로를 숨길 수 있다)