본문 바로가기
IT/Spring

[Spring] - 스프링 리다이렉트(redirect)와 포워드(forward)의 차이점

by 차이나는 개발자 2022. 2. 21.
728x90
반응형

#스프링 리다이렉트(redirect)와 포워드(forward)의 차이점

 

 

#redirect(RedirectView)

-redirect는 서버가 클라이언트에게 요청할 주소를 응답결과로 전달하는 것을 의미합니다.

 

 

-redirect 흐름

1. 클라이언트에서 서버로 첫번째 URL로 요청합니다.

2. 서버에서 첫번째 URL로 받고 두번째 URL로 redirect 처리합니다.

3. Location 응답헤더에 HTTP status Code 302와 두번째 URL을 담아서 클라이언트에 전송합니다.

4. 클라이언트에서 Location 응답헤더에 있는 302 응답코드를 확인하고 두번째 URL로 재요청합니다.

(클라이언트는 응답결과로 받은 요청주소를 직접 요청)

(브라우저가 요청하는 것이므로 주소창의 URL주소는 변경)

(새로운 요청이기 때문에 request와 response는 새롭게 생성, HttpSession 객체는 유지)

5. 서버에서 요청 받은 두번째 URL 응답합니다.

-필터, 인터셉터에서 체크됩니다.

 

 

-redirect 예시

1. 사용자(클라이언트)가 고객센터 상담원(서버)1(첫번째 URL)에게 전화를 겁니다.

2. 상담원(서버)1(첫번째 URL)은 문의사항을 잘 이해하지 못하여 상담원(서버)2(두번째 URL)의 전화번호를 알려줬습니다.

3. 사용자(클라이언트)는 다시 상담원(서버)2(두번째 URL)에게 전화를 걸어 문의를 처리합니다.

 

 

-redirect 예시 코드

@Controller
public class TestController{
  
  @GetMapping("/test1")
  public String test1(HttpServletRequest request){
    String name = request.getParameter("name") // "홍길동"
    System.out.println(name); // "홍길동"
    return "redirect:/test2";
  }
  
  @GetMapping("/test2")
  public String test2(HttpServletRequest request){
    String name = request.getParameter("name") // null
    System.out.println(name); // null
    return "test2";
  }
  
}

 

 

 

#forward(InternalResourceView)

-forward는 코드의 흐름을 서버상에서만 이동하는 것을 의미합니다.

 

 

-forward 흐름

1. 클라이언트에게 서버로 첫번째 URL로 요청합니다.

2. 서버에서 첫번째 URL로 받고 두번째 URL로 바로 forward 처리합니다.

3. 서버에서 두번째 URL 바로 호출합니다.

(서블릿 컨테이너는 해당 요청을 그대로 타겟 URL로 포워딩 시킵니다.)

(브라우저는 다른 곳으로 흐름이 이동되었다는 것을 알 수 없기 때문에 주소창의 URL주소는 변경되지 않습니다.)

(request와 response, HttpSession 객체 모두 유지합니다.)

4. 서버에서 요청 받은 두번째 URL 응답합니다.

(응답은 redirect와 다르게 두번째 URL에 대한 응답 한번만 내려옵니다.)

-필터는 첫 요청 URL에서만 체크(필터는 Dispatcher Servlet 바깥에 있기 때문, 인터셉터는 둘다 체크됩니다.)

 

 

-forward 예시

1. 사용자(클라이언트)가 고객센터 상담원(서버)1(첫번째 URL)에게 전화를 겁니다.

2. 상담원(서버)1(첫번째 URL)은 문의사항을 잘 이해하지 못하여 옆에있는 상담원(서버)2(두번째URL)에게 물어봤습니다.

3. 상담원(서버)1(첫번째 URL)은 상담원2에게 도움을 받아 사용자(클라이언트)에게 문의를 처리해줍니다.

 

 

-forward 예시 코드

@Controller
public class TestController{
  
  @GetMapping("/test1")
  public String test1(HttpServletRequest request){
    String name = request.getParameter("name") // "홍길동"
    System.out.println(name); // "홍길동"
    return "forward:/test2";
  }
  
  @GetMapping("/test2")
  public String test2(HttpServletRequest request){
    String name = request.getParameter("name") // "홍길동"
    System.out.println(name); // "홍길동"
    return "test2";
  }
  
}

 

 

 

728x90
반응형

댓글