Spring Framework에서 **Flash Attributes**는 리다이렉트(redirect) 시 데이터를 전달하기 위해 사용됩니다. 일반적인 요청 파라미터(query string)와 달리, Flash Attributes는 세션에 임시 저장되며, 리다이렉트 이후 자동으로 제거됩니다. 이를 통해 클라이언트가 보낸 데이터가 URL에 노출되지 않으면서도 데이터를 전달할 수 있습니다.
1. 주요 개념
Flash Attributes란?
- Flash Attributes는 리다이렉트 후 사용할 데이터를 일시적으로 저장하기 위해 사용됩니다.
- 데이터는 서버의 세션에 저장되며, 리다이렉트 이후 즉시 삭제됩니다.
- 주로 **RedirectAttributes**를 통해 설정하고, 다음 요청에서 **RequestContextUtils.getInputFlashMap(request)**로 접근합니다.
왜 사용하나요?
- 리다이렉트 이후에 데이터를 전달해야 하지만 URL에 노출되길 원치 않을 때 유용합니다.
- 예: 사용자 등록 후 확인 메시지를 보여주거나 특정 데이터를 리다이렉트된 페이지에서 처리해야 할 때.
2. 사용법
2.1 RedirectAttributes를 사용하여 Flash Attributes 추가
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 ExampleController {
@PostMapping("/submit")
public String submitForm(RedirectAttributes redirectAttributes) {
// Flash Attribute에 데이터 추가
redirectAttributes.addFlashAttribute("message", "Form submitted successfully!");
redirectAttributes.addFlashAttribute("status", "success");
// 리다이렉트
return "redirect:/result";
}
@GetMapping("/result")
public String resultPage() {
// Flash Attribute는 여기서 사용할 수 있음
return "resultPage"; // View 이름 반환
}
}
2.2 RequestContextUtils를 사용하여 Flash Attributes 읽기
Flash Attributes는 리다이렉트된 요청에서 읽을 수 있습니다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.support.RequestContextUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@Controller
public class ResultController {
@GetMapping("/result")
public String resultPage(HttpServletRequest request) {
// Flash Attributes 읽기
Map<String, ?> flashMap = RequestContextUtils.getInputFlashMap(request);
if (flashMap != null) {
System.out.println("Flash Attribute 'message': " + flashMap.get("message"));
System.out.println("Flash Attribute 'status': " + flashMap.get("status"));
}
return "resultPage";
}
}
2.3 JSP/Thymeleaf에서 Flash Attributes 사용
Flash Attributes는 리다이렉트된 요청의 모델 속성으로 자동으로 노출됩니다.
Thymeleaf 예제:
<div th:if="${message}" th:text="${message}"></div>
<c:if test="${not empty message}">
<div>${message}</div>
</c:if>
3. 주요 메서드
RedirectAttributes.addFlashAttribute(String key, Object value)
- Flash Attributes에 데이터를 추가합니다.
- 리다이렉트 이후, 모델 속성처럼 사용됩니다.
RedirectAttributes.addAttribute(String key, Object value)
- URL의 쿼리 파라미터로 데이터를 추가합니다.
RequestContextUtils.getInputFlashMap(HttpServletRequest request)
- 리다이렉트된 요청에서 Flash Attributes를 읽습니다.
- Flash Attributes는 리다이렉트된 요청에서만 유효하며, 이후 자동으로 제거됩니다.
4. 예제: 로그인 시 Flash Attributes 사용
Controller
@PostMapping("/login")
public String login(@RequestParam String username,
RedirectAttributes redirectAttributes) {
// 로그인 실패 시 Flash Attribute로 메시지 전달
redirectAttributes.addFlashAttribute("error", "Invalid username or password");
return "redirect:/login";
}
@GetMapping("/login")
public String loginPage() {
// Flash Attribute는 여기서 모델로 접근 가능
return "loginPage";
}
Thymeleaf View
<div th:if="${error}" th:text="${error}" class="error-message"></div>
<form action="/login" method="post">
<input type="text" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<button type="submit">Login</button>
</form>
5. Flash Attributes와 Session Attributes의 차이
| 특징 | Flash Attributes | Session Attributes |
| 수명 | 리다이렉트 이후 한 번 사용 후 제거 | 세션이 유지되는 동안 지속 |
| 저장 위치 | 세션에 임시 저장 | 세션에 저장 |
| 사용 목적 | 리다이렉트 시 임시 데이터 전달 | 사용자 상태 데이터 유지 |
| 설정 방법 | RedirectAttributes.addFlashAttribute() 사용 | @SessionAttributes 애노테이션 사용 |
6. 정리
- RedirectAttributes.addFlashAttribute는 리다이렉트 요청 간 데이터를 임시로 저장하고 전달하는 데 사용됩니다.
- RequestContextUtils.getInputFlashMap(request)는 리다이렉트된 요청에서 Flash Attributes를 읽는 데 사용됩니다.
- Flash Attributes는 리다이렉트 이후 한 번만 사용되며 자동으로 제거됩니다.
'Back-End > Spring' 카테고리의 다른 글
| WebSocket 예제 (0) | 2024.12.05 |
|---|---|
| WebSocket (0) | 2024.12.05 |
| Point cut (0) | 2024.11.27 |
| Spring AOP (0) | 2024.11.27 |
| Spring - AutoWired (0) | 2024.11.27 |