들어가며
예전에 Spring Project를 진행하면서 redirect와 forward차이점에 대해 궁금하였지만 지금에 와서야 차이점을 알게 되었고 정리하기 위해 작성합니다.
Redirect란?
- Client가 Server에 Resource를 요청합니다.
- Server는 상태값 3XX와 함께 Redirect 주소[Location]를 같이 보내게 됩니다.
- Client는 새로운 주소값으로 다시 Resource를 요청합니다.
- Server는 새로운 Resource를 응답합니다.
HTTP/1.1 302 Found
Location: nesoy.github.io
Client에서 새로운 Location에 대해 요청을 하기 때문에 Web Container 내부에서 자원을 공유할 수 없습니다. 자원을 공유하기 위해선 QueryString를 생성해야합니다.
추가 자료
- 다양한 Redirect 종류 : https://developer.mozilla.org/ko/docs/Web/HTTP/Redirections
Forward란?
- Client가 Server에 Resource를 요청합니다.
- Server는 Web Container(Tomcat, Jboss등)에 의해 LoginServlet에서 HelloServlet로 forward하게 됩니다.
- 이때 객체 정보는 Request Scope, Session Scope, Page Scope를 통해 전달되게 됩니다.
- Server는 최종적으로 HelloServlet의 결과를 응답하게 됩니다.
- Client입장에서는 한번의 요청으로 결과물을 받아볼 수 있습니다.
Forward는 Web Container의 내부에서 이동하기 때문에 request와 response 객체를 공유할 수 있습니다.
결론
- URL의 변화여부가 필요하다면 Redirect를 사용하는 것이 좋습니다.
- 객체를 재사용하거나 공유해야한다면 Forward를 사용하는 것이 좋습니다.
Reference
댓글을 통해 피드백을 남겨주시거나 광고 한번 클릭해주시면 감사하겠습니다 :)
포워딩 방식 (return "viewname"; )
※ 주소는 viewResolver에서 /WEB-INF/view/ + " ~~~ " + .jsp 이런식으로 만들어짐.
※ 앞에 / 가 붙든 안붙든 상관없이 view/ 다음으로 간다
※ view 밑으로 폴더 명부터 다 써주기
※ jsp붙으니 .do아니다.
return "notice/noticeList"; , return "/notice/noticeList";
컨테이너가 찾는 주소 /mogaco/WEB-INF/view/notice/noticeList.jsp
브라우저에 표시되는 주소 http://localhost:8082/mogaco/notice/noticeList.do
- URL 주소 유지, 즉 브라우저 모르게 컨테이너 내부에서 이동
- request/response 객체 유지
- 같은 웹 서버 내에 있는 파일들로만 이동 가능
- 클라이언트 정보를 갖고 이동
- 클라이언트와의 통신없이 서버에서만 처리되므로 효율이 더 좋다고함
리다이렉트 방식 ( return "redirect:/"; )
※ 주소는 컨트롤러에 재 요청하는 주소다.
※ / 가 안붙으면 안된다.
※ 컨트롤러로 재요청하므로 url pattern 지켜줘야함 ".do"
return "redirect:/notice/noticeList.do";
브라우저 주소 http://localhost:8082/mogaco/notice/noticeList.do
return "redirect:/";
브라우저 주소http://localhost:8082/mogaco/
- URL 주소 바뀜, 컨테이너로 재 요청(단순한 이동)
- request/response 객체 소멸
- 같은 서버, 다른 서버 에 있는 페이지로 이동 가능
- 잘못된 예시
1. R 대문자 쓰면 안된다. 되돌아오면서 오류
"Redirect:/";
"Redirect:/notice/noticeList.do"; (http://localhost:8082/mogaco/notice/notice/noticeInsert.do )
2. /안붙였을때 > 폴더명 3번 붙여 찾는다. 왜지.
"redirect:notice/noticeList.do"; ( /mogaco/WEB-INF/view/notice/notice/notice/noticeList.jsp )
ModelAndView
ModelAndView는 포워드냐 리다이렉트냐 가 아니라
ModelAndView를 이용하여 포워드로도 리다이렉트로도 보낼 수 있는거다.
포워드
ModelAndView mv = new ModelAndView();
vm.setViewName("/notice/noticeList");
vm.addAttribute("message", msgService.getMessage());
return vm;
or
req.setAttrebute("message", msgService.getMessage());
return new ModelAndView("/notice/noticeList");
리다이렉트
ModelAndView mv = new ModelAndView();
vm.setViewName("redirect:/notice/noticeList.do?noticeNumber=2");
return vm;
or
ModelAndView mv = new ModelAndView();
vm.setView(new RedirectView("/notice/noticeList.do?noticeNumber=2",true));
return vm;
그럼 리다이렉트를 쓰고, 파티쉐님께 배운 주소 지우는것도 적용해보자테스트 하고 정리하느라 시간이 다 갔다.뭘 쓸지 여부는 response, request 유지 여부에 따라 나뉠까.?* 브라우저 표시되는 주소는 get,post 와 연결지어 봐서 정리해 줘야겠다.왜냐!!그런데 여기서 브라우저 표시되는 주소가 현재 주소가 되니링크가 꼬인다. 꼬리에 꼬리를 물고 모르는게 생긴다 ㅎㅎ+redirect로 새로 요청해주어야 재 요청시 꼬이지 않는다.
정말감사합니다 꾸벅
답글삭제