Flash Attributes / RedirectAttributes
2024. 11. 29. 10:39

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