Spring

25. redirect와 forward - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 2. 9. 14:41

1. redirect와 forward의 처리 과정 비교

  • redirect
    • 클라이언트 (수동)요청(GET, POST) -> 서버 응답 -> 자동 요청(GET방식) -> 서버 응답
  • forward
    • 클라이언트 요청 -> 전달 -> 서버 응답
  • RedirectView(응답 헤더)
    • 클라이언트 요청 -> DispatcherServlet -> Controller
  • JstlView
    • 클라이언트 요청 -> DispatcherServlet -> Controller -> DispatchServlet -> JstlView -> 서버 응답 
  • InternalResourceView(forward)
    • 클라이언트 요청 -> DispatcherServlet -> Controller -> DispatcherServlet -> InternalResourceView -> DispatcherServlet -> JstlView -> 서버 응답
  • forward의 예시
@RequestMapping("/download")
public String download(HttpServletRequest request,
        @RequestParam(required=false, defaultValue="") String type) {
    List<User> userList = getUserList();
    request.setAttribut("data", userList); // request에 저장하면, forward된 곳에서 사용가능
    
    if(type.equals("pdf")) {
        return "forward:/pdfView";
    } else if(type.equals("csv")) {
        return "forward:/csvView";
    }
    
    return "forward:/txtView";
}
  • redirect
 @PostMapping("/register/save")  // 4.3부터
    public String save(User user, Model m) throws Exception{
        // 1. 유효성 검사
        if(!isValid(user)) {
            String msg = URLEncoder.encode("id를 잘못입력하셨습니다.","UTF-8") ;

            m.addAttribute("msg", msg);
            return "redirect:/register/add";
//          return "redirect:/register/add?msg="+msg;   // URL재작성(rewriting)
        }
        // 2. DB에 신규회원 정보를 저장
        return "registerInfo";

    }

    private boolean isValid(User user) {
        return false;
    }

  • HTTP/1. 1 302 -> 300번대 redirect요청
  • save -> 수동 요청, add?msg... -> 자동요청
  • redirect -> forward변경
@GetMapping("/register/add")
    public String register(){
        return "registerForm";  // WEB-INF/views/registerForm.jsp
    }
//  POST 방식으로만 받는다. 아래와 같은 뜻
//  @RequestMapping(value="/register/save", method=RequestMethod.POST)
    @PostMapping("/register/save")  // 4.3부터
    public String save(User user, Model m) throws Exception{
        // 1. 유효성 검사
        if(!isValid(user)) {
            String msg = URLEncoder.encode("id를 잘못입력하셨습니다.","UTF-8") ;

            m.addAttribute("msg", msg);
            return "forward:/register/add";
//          return "redirect:/register/add?msg="+msg;   // URL재작성(rewriting)
        }
        // 2. DB에 신규회원 정보를 저장
        return "registerInfo";

    }

  • /register/save 에서 /register/add로 forward를 하려하는데 POST와 GET형식이 안맞아서 오류가 발생
@RequestMapping(value="/register/add", method={RequestMethod.GET,RequestMethod.POST})
    public String register(){
        return "registerForm";  // WEB-INF/views/registerForm.jsp
    }

  • forward는 주소변경 없음