🔄 Spring MVC의 Redirect vs Forward 완벽 정리
- 요청 흐름을 제어하는 두 가지 방법
✅ Redirect와 Forward란?
웹 애플리케이션에서는 컨트롤러에서 다른 URL로 이동시키고 싶을 때가 많습니다.
Spring MVC에서는 이를 위해 Redirect(리다이렉트)와 Forward(포워드) 두 가지 방법을 제공합니다.
🔁 1. Forward (포워드)
📌 개념
서버 내부에서 한 컨트롤러 → 다른 컨트롤러 or 뷰로 요청을 전달
브라우저 주소창은 변하지 않음
🔧 예시 코드
@GetMapping("/step1")
public String forwardExample() {
return "forward:/step2";
}
- /step1 요청이 들어오면 서버 내부적으로 /step2로 이동
- 클라이언트는 여전히 /step1을 보고 있음
- 같은 request 객체 공유
✅ 특징
| 항목 | 설명 |
| 요청 방식 | 서버 내부에서 요청 전달 |
| 주소창 변화 | ❌ 없음 |
| request 유지 | ✅ 유지됨 |
| 속도 | 빠름 (서버 내부 이동이므로) |
| 주 사용처 | 내부 흐름 제어, request 데이터를 그대로 넘길 때 |
🔀 2. Redirect (리다이렉트)
📌 개념
클라이언트에게 응답을 보내어, 브라우저가 새로운 요청을 하도록 유도
주소창이 새 주소로 변경됨
🔧 예시 코드
@PostMapping("/form")
public String redirectExample() {
return "redirect:/success";
}
- /form 요청을 처리한 후, 브라우저에게 /success로 다시 요청하라고 지시
- 브라우저 주소창이 /success로 바뀜
- 완전히 새로운 request
✅ 특징
| 항목 | 설명 |
| 요청 방식 | 브라우저가 새 요청 수행 |
| 주소창 변화 | ✅ 바뀜 |
| request 유지 | ❌ 사라짐 (new request) |
| 속도 | 느림 (두 번 요청) |
| 주 사용처 | PRG(Post-Redirect-Get), URL 변경 필요 시, 중복 요청 방지 등 |
🔄 Forward vs Redirect 차이 한눈에 보기
| 항목 | Forward | Redirect |
| 주소창(URL) | 유지됨 (/step1) | 변경됨 (/success) |
| 요청 횟수 | 1회 (서버 내부) | 2회 (클라이언트가 다시 요청) |
| request 데이터 | 유지됨 (공유 가능) | 유지되지 않음 (필요 시 Flash 사용) |
| 주요 사용 시점 | 내부 이동, 서버 흐름 제어 | 폼 제출 후 이동, 새 페이지 유도 |
| 속도 | 상대적으로 빠름 | 상대적으로 느림 |
🧪 실전 예제: 로그인 후 리다이렉트
@PostMapping("/login")
public String login(@RequestParam String id, Model model) {
boolean success = authService.login(id);
if (success) {
return "redirect:/home";
} else {
model.addAttribute("msg", "로그인 실패");
return "loginForm"; // JSP 그대로 렌더링
}
}
- 로그인 성공 → Redirect → 새 페이지 이동 (/home)
- 로그인 실패 → 기존 요청 유지 → 같은 페이지 렌더링
💡 Flash Attributes와 함께 쓰기 (Redirect 시 request 유지 대안)
@PostMapping("/submit")
public String submit(RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("msg", "저장 완료!");
return "redirect:/result";
}
@GetMapping("/result")
public String resultPage(@ModelAttribute("msg") String msg) {
// FlashAttribute는 1회성 request로 전달됨
return "result";
}
✔ RedirectAttributes는 Redirect 시에도 데이터를 1회성으로 안전하게 전달할 수 있게 해주는 도구입니다.
🔚 마무리 요약
| 상황 | Forward 사용 | Redirect 사용 |
| 서버 내부 이동 | ✅ | ❌ |
| 브라우저 URL 변경 | ❌ | ✅ |
| request 데이터 유지 | ✅ | ❌ (Flash로 대체) |
| 중복 요청 방지 | ❌ | ✅ (PRG 패턴) |
| 성능 측면 | 빠름 | 느림 (2번 요청) |
Forward는 내부 흐름 제어,
Redirect는 외부 이동 또는 사용자 UX 제어에 적합합니다.
상황에 따라 두 가지 방식을 적절히 활용하면,
리소스를 아끼고 사용자 경험을 향상시키는 웹 애플리케이션을 만들 수 있습니다. 😊
'백엔드 > Spring' 카테고리의 다른 글
| Lombok @ToString(callSuper = true) (0) | 2025.06.01 |
|---|---|
| @PostConstruct란? (0) | 2025.04.30 |
| @RequestBody, @ResponseBody vs HttpEntity(RequestEntity, ResponseEntity) (0) | 2025.04.11 |
| StreamUtils.copyToString() - InputStream을 String으로 쉽게 변환하는 방법 (0) | 2025.04.07 |
| Spring MVC에서 HTTP 응답을 반환하는 두 가지 방식 (0) | 2025.04.03 |