본문 바로가기
Back-end/Spring MVC 개념

8. Forward와 Redirect

by devraphy 2022. 3. 3.

0. 개요

- 이전 포스팅에서 Servlet과 JSP를 이용한 MVC의 동작원리에 대해서 알아보았다.

- MVC가 가진 문제점 중 하나로 Forward를 언급하였는데, 이에 대해서 자세히 알아보도록 하자.


1. Forward

a) Forward 예시

- 고객센터를 예시로 Forward의 흐름을 알아보자.

 

- 고객이 123번이라는 번호로 고객센터에 전화를 건다. 

- 직원 A가 연결 되었고, 고객은 자신이 문의사항을 전달한다.

- 직원 A는 고객의 문의사항에 대한 답변을 몰라, 옆에 있는 직원 B에게 답변을 얻는다.  

- 고객은 직원 B가 누구인지 모르지만, 자신의 문의사항이 해결되었으므로 전화를 끝는다.

b) Forward의 기능

- 위에서 언급한 고객센터 예시를 염두에 두고 이해해보자. 

 

- Forward는 Client의 요청이 유지되는 상태에서 다른 페이지로 이동하는 기능이다.

- 즉, Server 내부적으로 다른 웹 페이지를 호출하고, Client의 요청을 공유한다.(직원 B에게 답을 구하는 것)

- 이와 같은 이유로 Client는 어떤 페이지가 호출된 것인지 알 수 없다. (고객은 직원 B가 누구인지 모른다)

- 무슨 말인지 이해가 잘 안 된다... 좀 더 쉽게 설명해보자. 

 

- Client는 페이지 A를 Server에게 요청한다.

- 해당 페이지를 담당하는 Controller의 비즈니스 로직에 의하여 내부적으로 B라는 페이지를 호출한다.(forward)

- Client 브라우저의 주소창에는 페이지 A의 URL이 적혀있지만, 실제로 Client에게 출력되는 것은 페이지 B가 된다.

 

- 여기서 주목해야 할 점은 Client가 최초에 전달한 요청 객체(request)가 유지된다는 것이다.

c) Forward의 문제점 

- 동일한 요청 객체가 유지된다는 점, 다른 페이지에게 공유된다는 점은 편하면서 문제가 된다.

- 다음과 같은 상황에서 적용할 수 있다.

 

ex) Client가 블로그에 글을 작성한다. 

     - Client가 작성을 완료하여 '글 등록하기' 버튼을 클릭한다. 

     - Controller에서 '글 등록이 완료되었습니다'라는 문구가 적힌 페이지를 forward로 호출한다.

     - Client가 실수로 해당 페이지에서 새로고침 버튼을 누른다. 

     - Client가 새로고침을 누른 횟수만큼 동일한 글이 중복 생성된다. 

 

- 왜 이와 같은 일이 발생할까? 

- 위에서 말했던 것처럼 forward는 request 객체를 다른 페이지에 넘길 때 동일한 request 객체를 전달하기 때문이다.


2. Redirect

- Forward와 자주 비교되는 기능이 Redirect다.

- Forward와 어떤 차이가 있는지, Redirect에 대해서 알아보자.

a) Rediret 예시 

- 동일하게 고객센터를 예시로 Redirect의 기능을 알아보자.

 

- 고객이 123번 번호로 고객센터에 전화를 건다.

- 직원 A가 연결 되었고, 고객은 자신이 문의사항을 전달한다.

- 직원 A는 해당 문의사항에 대해서는 456번으로 전화를 걸으라 말하고 전화를 끝는다.

- 고객은 456번 번호로 다시 전화를 건다. 

- 직원 B가 연결되었고, 고객은 문의사항을 다시한번 전달한다.

- 직원 B가 고객의 문의사항을 해결한다. 

b) Redirect의 기능 

- 위에서 언급한 고객센터 예시를 염두에 두고 이해해보자. 

 

- Client가 페이지 A를 요청한다.

- Server는 Client에게 페이지 B로 재요청하라고 말한다. (456번으로 전화를 걸으라고 말한다)

- Client는 Server로부터 페이지 B의 경로를 전달받고 새로운 요청을 전달한다. (456번으로 전화를 건다)

- 이때 Client는 새로운 request 객체를 생성하여 전달한다. 

- 내용은 동일할 지라도 다른 객체가 전달되는 것이다. (직원 B에게 다시한번 문의사항을 전달한다)

 

- Redirect를 사용하면 Client 브라우저의 주소창에는 페이지 A가 아니라 페이지 B의 경로가 적히게 된다. 

- Forward와 다르게, 새로운 요청 객체를 생성하여 새로운 주소로 재요청하기 때문이다.


3. 요약 및 결론

a) URL 변경 여부 

- Foward는 처음 요청된 URL이 브라우저에 표시되지만, 실제로는 다른 페이지를 출력한다.

- Redirect는 재요청된 URL이 브라우저에 표시된다.

b) request 객체의 재사용 여부

- Foward는 처음 전달된 request 객체를 다른 페이지에게 전달한다. 즉, request객체를 재사용한다.

- Redirect는 재요청 시 새로운 request 객체를 만들어 전달한다. 즉, request객체를 재사용하지 않는다.

c) 적용 대상 

- Forward는 Server의 데이터를 조회하는 기능에서 사용한다. (Read)

- Redirect는 Server의 데이터를 변경하는 기능에서 사용한다.(Create, Update, Delete)

'Back-end > Spring MVC 개념' 카테고리의 다른 글

10. Front Controller(2)  (0) 2022.03.07
9. Front Controller (1)  (0) 2022.03.04
7. MVC 1의 동작원리와 한계점  (0) 2022.03.02
6. MVC 1의 등장  (0) 2022.03.01
5. JSP의 등장  (0) 2022.02.28

댓글