1. Redirect
1.1 개념
- Redirect(리다이렉트)는 클라이언트의 요청을 서버가 처리한 후, 새로운 요청을 클라이언트로 다시 보냅니다.
- 서버가 클라이언트에게 HTTP 상태 코드 302(임시 이동)와 함께 Location 헤더에 새 URL을 전달하면, 클라이언트는 새 URL로 다시 요청을 보냅니다.
1.2 특징
- 클라이언트가 새로운 요청을 보냄:
- 클라이언트는 기존 요청이 끝난 후, 새로 지정된 URL로 새 요청을 시작합니다.
- URL 변경:
- 브라우저의 주소창에 새로운 URL이 표시됩니다.
- 요청 데이터 손실:
- 이전 요청의 데이터는 유지되지 않습니다(새로운 요청이기 때문).
- 브라우저 캐싱 가능성:
- 브라우저는 리다이렉트 URL을 캐싱할 수 있습니다.
1.3 사용 사례
- PRG 패턴(Post/Redirect/Get):
- POST 요청 후 브라우저에서 새로고침(F5) 시 중복 요청을 방지하기 위해 리다이렉트를 사용.
- 로그아웃 처리:
- 로그아웃 후 메인 페이지로 이동.
- 외부 URL로 이동:
- 외부 사이트로 사용자를 리다이렉트.
1.4 코드 예제
Spring에서 리다이렉트
@RequestMapping("/redirect")
public String redirectExample() {
return "redirect:/newPage";
}
- redirect: 접두사를 사용하면 클라이언트를 지정된 URL로 리다이렉트.
- redirectExample : 사용자가 /redirect URL로 요청을 보내면 /newPage로 리다이렉션 됨.
리다이렉트와 쿼리 파라미터
@RequestMapping("/redirectWithParams")
public String redirectWithParams() {
return "redirect:/newPage?status=success";
}
- redirectWithParmas : 사용자가 /redirectWithParams URL로 요청을 보내면 /newPage?status=success로 리다이렉션 됨. 이 경우 status 파라미터가 URL에 추가됨.
새로운 페이지 핸들러
@RequestMapping("/newPage")
public String newPage() {
return "newPage";
}
- newPage : 이 메서드는 /newPage URL에 대한 요청을 처리한다. 지금은 간단한 문자열을 반환하지만 , 실제 애플리케이션에서는 JSP, Thymeleaf 템플릿 등을 사용하여 HTML 페이지를 반환할 수 있다.
결과
- localhost:8080/redirect URL 요청
⇒
/newPage로 리다이렉션 되고, “This is the new page.” 가 표시됨.
⇒
/newPage?status=success로 리다이렉션 되고, 여전히 “This is the new page.” 가 표시됨. (파라미터는 서버에서 처리할 수 있도록 추가적인 로직이 필요할 수 있음)
결론
- 위 코드는 Spring MVC에서 리다이렉션을 처리하는 방법을 보여줌
- redirect: 접두사를 사용하여 리다이렉션을 수행 + URL에 파라미터를 추가
2. Forward
2.1 개념
- Forward(포워드)는 서버가 클라이언트의 요청을 처리하다가, 같은 서버 내의 다른 리소스로 요청을 전달합니다.
- 클라이언트는 자신이 요청한 리소스가 다른 리소스로 처리되었음을 알 수 없습니다.
2.2 특징
- 서버 내부에서 요청 전달:
- 클라이언트가 다시 요청하지 않으며, 요청 데이터가 그대로 유지됩니다.
- URL 변경 없음:
- 브라우저의 주소창 URL은 초기 요청 URL로 유지됩니다.
- 빠른 처리:
- 추가적인 네트워크 요청 없이 서버 내부에서 바로 처리.
2.3 사용 사례
- 데이터 전달:
- 요청 데이터를 다음 리소스에서도 그대로 유지해야 할 때.
- 뷰 렌더링:
- 컨트롤러에서 JSP 파일로 직접 포워딩.
- 에러 처리:
- 특정 에러 페이지로 포워딩.
2.4 코드 예제
Spring에서 포워드
@RequestMapping("/forward")
public String forwardExample() {
return "forward:/newPage";
}
- forward: 접두사를 사용하면 서버 내에서 요청을 전달.
3. Redirect와 Forward의 주요 차이
특징 | Redirect(리다이렉트) | Forward(포워드) |
동작 방식 | 클라이언트가 새 요청을 보냄 | 서버 내부에서 요청을 다른 리소스로 전달 |
URL 변경 | URL이 변경됨 | URL이 변경되지 않음 |
요청 데이터 유지 | 유지되지 않음 (새로운 요청이 시작됨) | 유지됨 (원래 요청 데이터 그대로 전달) |
브라우저 관점 | 브라우저가 리다이렉트를 인식하고 새로운 요청을 보냄 | 브라우저는 요청이 다른 리소스로 포워드된 것을 알지 못함 |
사용 사례 | PRG 패턴, 외부 URL 이동 | 서버 내부 데이터 전달, 에러 페이지 렌더링 |
성능 | 네트워크 요청 추가로 약간 느림 | 서버 내부 처리로 상대적으로 빠름 |
4. 사용 사례별 추천 방법
4.1 Redirect 추천 사례
1. 로그인 후 이동
- 로그인 성공 후 메인 페이지로 이동:
@PostMapping("/login")
public String login() {
// 로그인 성공 로직
return "redirect:/home";
}
2. 로그아웃 처리
- 로그아웃 후 로그인 페이지로 이동:
@RequestMapping("/logout")
public String logout() {
// 로그아웃 처리 로직
return "redirect:/login";
}
3. POST/Redirect/Get 패턴
- 사용자가 폼 데이터를 제출한 후 새로고침 시 중복 제출 방지:
@PostMapping("/submitForm")
public String submitForm() {
// 폼 데이터 처리 로직
return "redirect:/successPage";
}
4.2 Forward 추천 사례
1. 데이터 전달
- 클라이언트의 요청 데이터를 다른 컨트롤러 또는 JSP로 전달:
@RequestMapping("/process")
public String processData() {
return "forward:/nextStep";
}
2. 뷰 렌더링
- 데이터를 준비한 후 뷰 템플릿으로 바로 전달:
@RequestMapping("/showView")
public String showView() {
return "forward:/WEB-INF/views/result.jsp";
}
3. 에러 처리
- 에러 발생 시 에러 페이지로 전달:
@RequestMapping("/handleError")
public String handleError() {
return "forward:/errorPage";
}
'Spring' 카테고리의 다른 글
Spring Web MVC - WebMvcConfigurer (0) | 2024.12.23 |
---|---|
Spring Web MVC - HandlerInterceptor (0) | 2024.12.23 |
Spring Web MVC - 모델(Model) 폼 데이터 처리 (0) | 2024.12.20 |
Spring Web MVC - 세션(Session) (1) | 2024.12.20 |
Spring Web MVC - 쿠키(Cookie) (1) | 2024.12.20 |