웹 개발/웹 개발 기초

포워딩, 리다이렉트 비교

Blue_bull 2025. 2. 7. 21:01

📌 포워딩(Forward) 코드 vs 리다이렉트(Redirect) 코드 비교


✅ 1. 포워딩(Forward) 코드

서버 내부에서 이동하며, 클라이언트의 URL은 변경되지 않음.
request.setAttribute()로 저장한 데이터가 유지됨.
같은 요청 내에서 처리됨 (한 번의 요청).

🔹 포워딩 코드 (forward())

String gotopage = "member/meUpdateForm.jsp"; // 이동할 JSP 파일
RequestDispatcher dispatcher = request.getRequestDispatcher(gotopage);
dispatcher.forward(request, response);

📌 특징
request.setAttribute()로 저장한 데이터가 유지됨.
✅ 클라이언트(브라우저)의 URL이 변경되지 않음.
✅ 서버 내부에서 요청이 이동하기 때문에 빠름.
예제: 로그인 후 마이페이지로 이동 (forward("mypage.jsp")).


✅ 2. 리다이렉트(Redirect) 코드

클라이언트(브라우저)가 새로운 요청을 보내며, URL이 변경됨.
request.setAttribute()로 저장한 데이터는 유지되지 않음.
두 개의 요청이 발생 (기존 요청 → 새로운 요청).

🔹 리다이렉트 코드 (sendRedirect())

response.sendRedirect("member/meUpdateForm.jsp");

📌 특징
URL이 변경됨 (클라이언트가 새 요청을 보냄).
request.setAttribute()로 저장한 데이터는 유지되지 않음.
✅ 서버가 클라이언트에게 새로운 URL로 이동하라고 응답을 보내기 때문에 다소 느릴 수 있음.
예제: 로그아웃 후 로그인 페이지로 이동 (sendRedirect("login.jsp")).


✅ 3. 포워딩 vs 리다이렉트 비교 정리

구분 포워딩 (forward()) 리다이렉트 (sendRedirect())
요청 방식 같은 요청(Request) 내에서 이동 새로운 요청 발생
URL 변경 여부 변하지 않음 변함
요청 데이터 유지 (request.setAttribute) 유지됨 유지되지 않음
속도 빠름 (서버 내부 이동) 느림 (클라이언트가 새 요청 보냄)
사용 예시 로그인 후 마이페이지 이동, 데이터 전달 필요할 때 로그아웃 후 로그인 페이지로 이동

✅ 4. 어떤 경우에 사용해야 할까?

사용 사례 추천 방법 이유
로그인 후 마이페이지로 이동 포워딩 (forward()) 로그인한 사용자 정보(request.setAttribute())를 유지해야 하므로.
로그아웃 후 로그인 페이지로 이동 리다이렉트 (sendRedirect()) 세션을 초기화하고 새 요청을 만들어야 하므로.
폼 입력 오류 시 다시 입력 페이지로 이동 포워딩 (forward()) 사용자 입력 데이터와 오류 메시지를 유지해야 하므로.
회원가입 후 환영 페이지로 이동 리다이렉트 (sendRedirect()) 새 요청으로 이동하여 중복 제출을 방지해야 하므로.

✅ 결론

포워딩 (forward())은 같은 요청 내에서 서버 내부에서 이동하는 방식.
리다이렉트 (sendRedirect())는 클라이언트가 새로운 요청을 보내는 방식.
데이터를 유지하면서 페이지를 이동해야 하면 forward(), 새 요청을 보내야 하면 sendRedirect() 사용!

📌 포워딩(Forward)과 리다이렉트(Redirect)는 Spring과 Spring Boot에서도 사용되는가?

네, JSP뿐만 아니라 Spring과 Spring Boot에서도 포워딩과 리다이렉트 개념이 사용됩니다!

Spring과 Spring Boot에서는 forward:redirect:를 사용하여 JSP 또는 컨트롤러 간 이동을 수행합니다.
기본 개념은 동일하지만, Spring에서는 RequestDispatcher.forward()response.sendRedirect()를 직접 사용하기보다 return 값을 통해 이동을 처리합니다.



✅ 1. Spring/Spring Boot에서 포워딩 (Forward)

서버 내부에서 요청을 전달하며, 클라이언트의 URL은 변경되지 않음.
request.setAttribute()로 저장한 데이터를 유지할 수 있음.
뷰(JSP, Thymeleaf 등)로 데이터를 전달할 때 주로 사용됨.

🔹 Spring에서 포워딩 예제

@Controller
@RequestMapping("/member")
public class MemberController {

    @GetMapping("/update")
    public String showUpdateForm(Model model) {
        // 데이터 저장 (request.setAttribute()와 유사)
        model.addAttribute("message", "회원 정보를 수정하세요.");

        // "member/meUpdateForm.jsp"로 포워딩
        return "forward:/member/meUpdateForm";
    }
}

GET /member/update 요청이 들어오면 meUpdateForm.jsp로 포워딩됨.
URL은 그대로 유지되며, model.addAttribute()로 저장한 데이터가 JSP에서 사용 가능.

🔹 JSP에서 EL로 데이터 출력 (meUpdateForm.jsp)

<p>${message}</p>  <!-- "회원 정보를 수정하세요." 출력 -->

✅ 2. Spring/Spring Boot에서 리다이렉트 (Redirect)

클라이언트가 새로운 요청을 보내도록 함.
이동 후 브라우저의 URL이 변경됨.
이전 요청에서 저장한 데이터(model.addAttribute())는 유지되지 않음.

🔹 Spring에서 리다이렉트 예제

@Controller
@RequestMapping("/member")
public class MemberController {

    @PostMapping("/update")
    public String updateMember(@RequestParam String name) {
        // 회원 정보 수정 로직 수행
        System.out.println("회원 정보 업데이트: " + name);

        // 수정 후 "/member/list" 페이지로 리다이렉트
        return "redirect:/member/list";
    }
}

POST /member/update 요청이 들어오면 회원 정보를 수정한 후,
클라이언트가 /member/list로 새로운 요청을 보내도록 리다이렉트함.
결과적으로 URL이 /member/list로 변경됨.


✅ 3. Spring에서 forward: vs redirect: 비교

구분 forward:/URL (포워딩) redirect:/URL (리다이렉트)
요청 방식 같은 요청 내에서 이동 새로운 요청 발생
URL 변경 여부 변하지 않음 변함
데이터 유지 (model.addAttribute) 유지됨 유지되지 않음
속도 빠름 (서버 내부 이동) 느림 (클라이언트가 새 요청 보냄)
사용 예시 입력 폼 재표시, 데이터 유지 필요할 때 로그인 후 메인 페이지 이동, 새로고침 방지

✅ 4. Spring Boot에서도 포워딩과 리다이렉트 사용 가능?

Spring Boot에서도 Spring과 동일한 방식(forward:redirect:)을 사용합니다.
Thymeleaf 같은 템플릿 엔진과 함께 사용할 때에도 동일한 원칙이 적용됩니다.

🔹 Spring Boot에서 포워딩 예제 (Thymeleaf 사용)

@Controller
@RequestMapping("/member")
public class MemberController {

    @GetMapping("/update")
    public String showUpdateForm(Model model) {
        model.addAttribute("message", "회원 정보를 수정하세요.");
        return "forward:/member/meUpdateForm";  // Thymeleaf 템플릿으로 이동
    }
}

포워딩되므로 model.addAttribute() 데이터가 유지됨.

🔹 Spring Boot에서 리다이렉트 예제

@Controller
@RequestMapping("/member")
public class MemberController {

    @PostMapping("/update")
    public String updateMember(@RequestParam String name) {
        System.out.println("회원 정보 업데이트: " + name);
        return "redirect:/member/list";  // 리다이렉트 수행
    }
}

리다이렉트되므로 model.addAttribute() 데이터가 유지되지 않음.


✅ 5. 결론

포워딩과 리다이렉트는 JSP뿐만 아니라 Spring과 Spring Boot에서도 사용된다.
Spring에서는 forward:/URL을 사용하여 포워딩하고, redirect:/URL을 사용하여 리다이렉트한다.
포워딩(forward:)은 요청 데이터를 유지하면서 이동하며, URL이 변경되지 않는다.
리다이렉트(redirect:)는 새로운 요청을 발생시키며, URL이 변경된다.


📌 포워딩(Forwarding)의 핵심은 "데이터 유지 여부"인가? ✅

✅ 맞아!
포워딩(Forwarding)과 리다이렉트(Redirect)의 가장 큰 차이점 중 하나가 데이터 유지 여부야.
포워딩은 현재 요청과 데이터를 유지하면서 다른 리소스(JSP 또는 다른 서블릿)로 이동하는 방식이고,
리다이렉트는 새로운 요청을 생성하여 이동하기 때문에 기존 데이터가 유지되지 않아!

🔹 포워딩의 핵심은 "데이터 유지"가 맞아! ✅
✔ request.setAttribute()로 저장한 데이터를 유지하면서 JSP나 다른 서블릿으로 이동 가능.
✔ 서버 내부에서만 이동하므로 클라이언트의 URL이 바뀌지 않음.
✔ 반면, 리다이렉트는 새로운 요청을 보내므로 데이터를 유지할 수 없음.

'웹 개발 > 웹 개발 기초' 카테고리의 다른 글

MVC 개념 및 모델1 vs 모델2  (0) 2025.02.07
HTTP전달방식(GET방식과 POST방식)  (0) 2025.02.07
URL과 URI의 차이  (1) 2025.02.05
BOM (Browser Object Model)  (0) 2025.02.05
jsp 구성요소  (0) 2025.02.03