개발/Spring

[Spring]Model vs RedirectAttributes

함수형 인간 2025. 3. 16. 07:29

RedirectAttributes 

RedirectAttributes는 Spring MVC에서 리다이렉트 시에 데이터를 전달하기 위한 인터페이스. Model 인터페이스를 확장하여 리다이렉트에 특화된 기능을 제공.

RedirectAttributes의 역할

  1. Flash Attributes: 일회성으로 데이터를 전달. 리다이렉트된 후, 즉 다음 요청에서만 해당 데이터를 사용할 수 있고, 그 이후에는 자동으로 소멸.
  2. URI Template Variables (URL에 포함되는 데이터): 리다이렉트 URL에 포함될 데이터를 추가(쿼리스트링 사용).

Model vs. RedirectAttributes

  • Model:
    • 일반적으로 forward 시에 데이터를 전달하는 데 사용됨.
    • Model에 추가된 데이터는 해당 요청 내에서만 유효하며, 리다이렉트 시에는 유지되지 않는다.
  • RedirectAttributes:
    • 리다이렉트 시에 데이터를 전달하는 데 특화.
    • Flash Attribute는 다음 요청에서만 사용 가능하며, 이후에는 자동으로 제거됨.
    • URI Template Variable은 리다이렉트 URL에 포함되어 전달됨.

 

Java
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Controller
public class MyController {

    @PostMapping("/submitForm")
    public String handleFormSubmission(RedirectAttributes redirectAttributes) {

        // ... 폼 처리 로직 ...

        // Flash Attribute 추가 (일회성 데이터)
        redirectAttributes.addFlashAttribute("message", "Form submitted successfully!");

        // URL에 포함될 데이터 (URI Template Variable) 추가 - 잘 사용하지 않음. Flash Attribute 사용.
        redirectAttributes.addAttribute("param1", "value1");
        redirectAttributes.addAttribute("param2", "value2");


        return "redirect:/successPage"; // 리다이렉트
        // 실제 리다이렉트 URL: /successPage?param1=value1&param2=value2
        // Flash Attribute "message"는 리다이렉트된 후 /successPage에서 사용 가능
    }

    @GetMapping("/successPage")
    public String successPage() {
      // Flash Attribute "message"는 여기서 Model을 통해 접근 가능.
      // addAttribute로 추가한 파라미터는 @RequestParam으로 받아서 처리 가능
        return "success";
    }
}

설명

  • redirectAttributes.addFlashAttribute("message", "Form submitted successfully!");
    • "message"라는 이름으로 Flash Attribute를 추가. 이 데이터는 redirect:/successPage로 리다이렉트된 후, /successPage를 처리하는 컨트롤러 메서드에서 Model을 통해 접근할 수 있다. 한 번 사용된 후에는 자동으로 제거됨.
  • redirectAttributes.addAttribute("param1", "value1");
    • "param1"이라는 이름으로 URL에 포함될 데이터를 추가. 이 데이터는 redirect:/successPage로 리다이렉트될 때 URL에 쿼리 파라미터 형태로 추가 (/successPage?param1=value1).

success.jsp (뷰)

Java
 
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Success</title>
</head>
<body>
    <h1>Success Page</h1>

    <p>${message}</p> <%-- Flash Attribute "message" 출력 --%>
</body>
</html>

Flash Attribute 동작 방식 (내부)

  1. addFlashAttribute() 호출: RedirectAttributes에 Flash Attribute가 추가되면, 이 데이터는 임시로 세션(Session)에 저장됨. (정확히는 org.springframework.web.servlet.FlashMap이라는 객체에 저장되고, 이 FlashMap이 세션에 저장됨.)
  2. 리다이렉트: redirect: 접두사가 붙은 뷰 이름을 반환하면, Spring MVC는 클라이언트에게 HTTP 리다이렉트 응답(302 Found 등)을 보냄.
  3. 리다이렉트된 요청 처리: 클라이언트가 리다이렉트된 URL로 새로운 요청을 보냄.
  4. Flash Attribute 복원: Spring MVC는 세션에서 FlashMap을 찾고, 그 안에 저장된 Flash Attribute들을 Model에 자동으로 추가.
  5. Flash Attribute 제거: Model에 추가된 후, FlashMap은 세션에서 제거됨. (따라서 다음 요청에서는 Flash Attribute를 사용할 수 없다.)

정리

RedirectAttributes는 리다이렉트 시에 데이터를 안전하고 효율적으로 전달하는 방법을 제공. 특히 Flash Attribute는 일회성 데이터를 전달하는 데 매우 유용하며, 사용자에게 메시지를 보여주거나, 리다이렉트 후 특정 작업을 수행하는 데 활용할 수 있다. URL에 데이터를 직접 포함시키는 것보다 Flash Attribute를 사용하는 것이 보안 및 URL 가독성 측면에서 더 좋다.