Redirect VS Forward

2022. 9. 28. 17:20Spring 기초

Redirect 와 Forward는 둘 다 현재 작업중인 페이지에서 다른 페이지로 이동하는 기능이다. 
둘의 차이점을 간단한 비유로 설명하자면,
고객은 클라이언트, 중국집은 서버, 전화번호는 URL이라고 이해하면 쉽다.

[Redirect]
1. 고객이 '일미반점' 중국집에 123-4567로 전화를 건다.
2. 종업원은 고객에게 다음과 같이 말한다. "여기는 일미분식입니다.. 짜장 주문은  234-4567로 연락하시오!"
3. 고객은 234-4567로 다시 전화를 해서 주문을 한다. 

[Forward]
1. 고객이 '일미반점' 중국집에 123-4567로 전화를 건다.
2. 종업원은 재고나 부엌 사정을 알지 못해 옆에 주방장에게 문의해서 답을 얻는다.
3. 종업원이 고객의 주문을 처리한다. 

대충 감은 익혔을 테니, 자세히 한번 알아보자

[redirect] 최초 요청을 받은 URL1은 클라이언트에게 redirect할 URL2를 반환한다. 클라이언트는 새로운 요청을 생성하여 URL2에 다시 요청을 보내므로, 처음 URL1로 보냈던 Request, Response 객체는 유효하지 않으며 새롭게 생성된다.

예를 들어, 상품 등록을 완료했을 때 redirect를 사용해 응답 페이지를 호출하면, 사용자가 실수로 새로고침을 할 경우에 이미 기존의 요청 정보는 사라지므로 같은 상품이 여러 번 등록되는 것을 방지할 수 있다.

따라서 시스템, DB에 변화가 생기는 요청의 경우(가입, 등록 등)는 redirect를 사용하는 것이 바람직하다.

 

[forward] 포워드는 이동할 URL 요청정보를 URL2에 그대로 전달한다. 따라서 클라이언트가 최초로 요청한 request 정보는 URL2에서도 유효하다. 

만약 상품 등록을 완료한 후 forward를 이용하여 응답 페이지를 부르면 다음과 같은 문제가 발생한다. 
사용자가 forward 응답페이지에서 실수로 새로고침을 연타하는 경우 요청 정보가 아직 살아있기 때문에, 동일한 요청이 여러 번 전송되어 같은 상품이 중복으로 등록된다. 

따라서 시스템에 변화가 없는 단순 조회 요청에 forward를 사용하는 것이 바람직하다.  

 

둘의 차이점을 요약하자면,

URL이 변경되는가?  Redirect O,  Forward X
요청 객체를 재사용하는가? Redirect X, Forward O

 

추가로, Redirect 요청은 응답 헤더로 300번대를 사용한다. 

응답헤더에 302번 상태코드를 확인할 수 있다.
Location은 redirect하는 URL을 전송하게 되는데, 여기서는 뒤에 msg(메시지) 파라미터가 URL 인코딩 되어서 담겨있는 모습이다.