개발_기타/미분류

리다이렉트 (Redirect), 포워딩 (Forward) 방식의 차이

zuyo 2021. 1. 17. 22:13
반응형

Redirect

"내가 연락처 알려줄테니까 얘한테 다시 물어봐"

과정
1. 사용자가 링크를 클릭 (클라이언트가 서버에 요청)
2. 서버가 클라이언트에 Redirect 주소 보냄
3. 클라이언트는 서버에게 받은 새로운 주소로 재요청
4. 서버 응답

 

특징

  • 서버(웹 컨테이너)가 클라이언트(웹 브라우저)에게 알려준 주소로 서버에 재요청하는 것
  • 서버가 클라이언트에게 재요청하라고 응답하는 것이므로 response로 보냄
  • 웹 컨테이너 외부의 주소로도 이동 가능
  • URL이 바뀐다.
  • request와 response 객체가 새롭게 생성된다.
  • 시스템에 변화가 생기는 경우(생성, 수정, 삭제) 재요청을 방지하기 위해 사용한다.
  • redirect시 값을 전달하려면 GET 방식으로 보내야 한다. 요청 객체가 새로 생성되기 때문에 값을 보내려면 URL과 같이 보내야 하기 때문이다.
  • Spring에서는 RedirectAttribute를 사용하여 값을 보낼 수도 있다. 이 방법은 내부적으로 세션을 사용한다.

 

사용법

// return 시
return "redirect:#";

// return 시 (데이터 포함, GET 방식)
return "redirect:#?id="+userId;

// sendRedirect 메소드 호출
response.sendRedirect("#"); 

// sendRedirect 메소드 호출 (데이터 포함, GET 방식)
response.sendRedirect("#?id="+userId);

Forward

"내가 물어봐서 알려줄게"

과정
1. 클라이언트가 서버에 요청
2. 서버는 Web Container에 의해 다른 주소로 forward. 이때 객체 정보도 같이 전달
3. 서버는 새 주소에서 반환한 결과를 응답

특징

  • 서버에서 페이지를 바꿔서 다시 보여준다.
  • 서버가 다른 페이지를 요청하는 것이므로 request로 보냄
  • 웹 컨테이너 내부에서만 이동 가능
  • URL이 바뀌지 않는다.
  • request와 response 객체를 유지
  • 시스템에 변화가 생기지 않는 단순 조회 및 request, response 객체를 유지해야하는 경우 사용한다.

 

사용법

// return 시
return "forward:#";

// return 시 (데이터 포함, GET 방식)
return "forward:#?id=zuyo";

// forward() 메소드 호출
request.getRequestDispatcher("/#").forward(request, response);

// forward() 메소드 호출 (데이터 포함, GET 방식)
request.getRequestDispatcher("/#?id"+userId).forward(request, response);

// forward() 메소드 호출 (데이터 포함, request 객체에 담아서)
request.setAttribute("user", user);
request.getRequestDispatcher("/#").forward(request, response);

주의

 

글쓰기나 회원탈퇴 같이 데이터가 변경되는 경우 forward를 사용하면 요청이 중복으로 발생될 수 있기 때문에 주의해야 한다. (request, response 데이터가 계속 남아있기 때문)

반응형