백엔드/Spring
Spring MVC의 Redirect와 Forward
manchesterandthecity
2025. 6. 1. 03:03
🔄 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 제어에 적합합니다.
상황에 따라 두 가지 방식을 적절히 활용하면,
리소스를 아끼고 사용자 경험을 향상시키는 웹 애플리케이션을 만들 수 있습니다. 😊