개발/Spring
[Spring]Model vs RedirectAttributes
함수형 인간
2025. 3. 16. 07:29
RedirectAttributes
RedirectAttributes는 Spring MVC에서 리다이렉트 시에 데이터를 전달하기 위한 인터페이스. Model 인터페이스를 확장하여 리다이렉트에 특화된 기능을 제공.
RedirectAttributes의 역할
- Flash Attributes: 일회성으로 데이터를 전달. 리다이렉트된 후, 즉 다음 요청에서만 해당 데이터를 사용할 수 있고, 그 이후에는 자동으로 소멸.
- 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¶m2=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 동작 방식 (내부)
- addFlashAttribute() 호출: RedirectAttributes에 Flash Attribute가 추가되면, 이 데이터는 임시로 세션(Session)에 저장됨. (정확히는 org.springframework.web.servlet.FlashMap이라는 객체에 저장되고, 이 FlashMap이 세션에 저장됨.)
- 리다이렉트: redirect: 접두사가 붙은 뷰 이름을 반환하면, Spring MVC는 클라이언트에게 HTTP 리다이렉트 응답(302 Found 등)을 보냄.
- 리다이렉트된 요청 처리: 클라이언트가 리다이렉트된 URL로 새로운 요청을 보냄.
- Flash Attribute 복원: Spring MVC는 세션에서 FlashMap을 찾고, 그 안에 저장된 Flash Attribute들을 Model에 자동으로 추가.
- Flash Attribute 제거: Model에 추가된 후, FlashMap은 세션에서 제거됨. (따라서 다음 요청에서는 Flash Attribute를 사용할 수 없다.)
정리
RedirectAttributes는 리다이렉트 시에 데이터를 안전하고 효율적으로 전달하는 방법을 제공. 특히 Flash Attribute는 일회성 데이터를 전달하는 데 매우 유용하며, 사용자에게 메시지를 보여주거나, 리다이렉트 후 특정 작업을 수행하는 데 활용할 수 있다. URL에 데이터를 직접 포함시키는 것보다 Flash Attribute를 사용하는 것이 보안 및 URL 가독성 측면에서 더 좋다.