ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Redirect와 Forward에 대해 알아보자
    프로그래밍/Spring 2022. 1. 2. 16:45

    JSP에서 Redirect와 Forard 처리 과정

    Redirect

    redirect과정 출처 : https://nesoy.github.io/articles/2018-04/Redirect-Forward

    - 위와 같이 Redirect는 요청이 2번이며, 각 요청은 서로 다른 객체(request)이다.

    - 첫 번째 요청을 GET으로 하던 POST로 하던 Redirect로 인해서 두 번째 요청을 보낼 때는 자동으로 GET으로 요청을 보낸다.

     

    예시

    1. 클라이언트가 /doc으로 요청을 보낸다. ( 1번째 요청: 수동 )

    2. 서버에서 응답 헤더를 통해 300번(Redirect)대의 상태코드와 메시지를 응답한다. (300번대는 Body정보가 없다.)

    3. 클라이언트는 응답메시지를 보고 자동으로 다른 URL (/doc_new) 로 재요청을 한다. ( 2번째 요청: 자동 GET으로 )

    4. 서버는 요청에 대한 응답메시지를 클라이언트에 보낸다.

     

    실생활 예시

    1. 고객이 카드 분실로 인해서 카드사에 분실신고 전화를 한다. (요청)

    2. 전화 받은 카드사의 부서가 분실신고부서가 아닌 한도조회부서라서 분실신고 부서의 번호를 알려주고 그 쪽으로 다시 전화해달라고 한다. (300번대 응답 Redirect)

    3. 고객은 받은 분실신고부서 번호로 전화를 다시 한다. (재요청)

    4. 분실신고부서에서 처리해준다.

     

    추가적인 Redirect 정보


    Foward

    foward 과정 출처 : https://nesoy.github.io/articles/2018-04/Redirect-Forward

    - 클라이언트가 보낸 요청을 foward할 경우 클라이언트의 내용을 같이 보내기 때문에 전달받은 페이지에서는 바로 요청을 처리할 수 있다.

    - 클라이언트가 요청을 두 번 보낼 필요가 없다.

     

    예시

    1. 클라이언트가 /write.jsp로 요청을 보낸다.

    2. /write.jsp가 자신이 처리할 경우가 아닐 경우에 다음 jsp(ex. login.jsp)로 내용을 전달해준다.  

    3. 클라이언트가 처음 보낸 정보를 그대로 login.jsp로 보내기 때문에 다시 요청을 보낼 필요가 없다.

    4. login.jsp가 응답을 보낸다.

     

    실생활 예시

    1. 고객이 카드 분실로 인해서 카드사에 분실신고 전화를 한다. (요청)

    2. 카드사의 한도조회부서에서 전화를 받았지만 고객의 내용을 바로 분실신고부서로 연결해준다. (Foward)

    3. 분실신고부서에서 처리해준다.


    Spring에서는 어떻게 처리될까?

    RedirectView

    redirect로 응답할 때 RedirectView를 통해 응답헤더가 생성된다.

     

    과정

    스프링에서는 클라이언트에서 요청이 오면 먼저 DispatcherServlet이 요청을 받고 요청 URL에 해당하는 Controller로 전달한다.

    /register/save 로 요청

    DispatcherServlet에서 요청에 맞는 Contoller의 메서드를 호출

    @PostMapping("/register/save")
    public String save(User user, Model model) throws Exception {
    	// 오류 발생
        if (!isValid(user)) {
            String msge = URLEncoder.encode("id를 잘못입력하셨습니다.", "utf-8");
    
            model.addAttribute("msg", msg);
            // 반환
            return "redirect:/register/add";
        }
    	
        ...
        
    }

    Controller는 redirect:register/add를 DispatcherServlet에 반환해주고 RedirectView에서 응답헤더를 만들어준다.

    HTTP/1.1 302
    Location: /register/add?msg=id%EB%A5%BC+...
    Content-Language: ko-KR
    Content-Length: 0 Date: Sat, 13 Nov 2021 05:33:12 GMT

    클라이언트는 응답에 있는 로케이션으로 다시 요청을 보낸다.

    /register/add 로 요청

    DispatcherServlet에서 요청에 맞는 Contoller의 메서드를 호출

    @GetMapping("/register/add")
    public String register() {
        return "registerForm";
    }

    반환된 페이지로 응답해준다.

     

    InternalResourceView

    foward로 응답할 때 InternalResourceView를 통해 내부적으로 foward가 진행된다.

     

    예시

    @GetMapping("/download")
    public String download(HttpServletRequest request, @RequestParam(required = false, defaultValue = "") String type) {
        List<User> userList = getUserList();
        request.setAttribute("data", userList);
    
        if (type.equals("pdf")) {
            return "foward:/pdfView";
        } else if (type.equals("csv")) {
            return "foward:/csvView";
        }
    
        return "foward:/txtView";
    }

    댓글

Designed by Tistory.