Handler Method : Flash Attributes

2024. 10. 9. 16:24Spring Framework/Web on Servlet Stack

플래시 속성(Flash Attributes)하나의 요청에서 저장된 데이터를 다른 요청에서 사용할 수 있도록 하는 방법을 제공합니다. 이는 주로 리다이렉트할 때 사용되며, Post-Redirect-Get 패턴에서 자주 활용됩니다. 플래시 속성은 리다이렉트 전에 임시로 저장되며, 리다이렉트 후 다음 요청에서 사용할 수 있도록 전달됩니다. 이후 즉시 삭제되므로 일시적인 데이터 전송에 유용합니다.

플래시 속성의 주요 개념

  • FlashMap: 플래시 속성을 저장하는 객체입니다. 플래시 속성은 세션에 임시로 저장되며, 리다이렉트 후에 해당 속성을 사용할 수 있게 됩니다.
  • FlashMapManager: FlashMap 인스턴스를 관리하고, 플래시 속성을 저장하고 가져오며, 세션에서 이를 관리하는 역할을 합니다.

플래시 속성은 스프링 MVC에서 자동으로 활성화되어 있으며, 따로 설정할 필요가 없습니다. 플래시 속성을 사용하지 않으면 HTTP 세션을 만들지 않으므로, 성능에 미치는 영향도 거의 없습니다.

플래시 속성의 동작 과정

  1. 첫 번째 요청: 컨트롤러가 요청을 처리하는 동안 RedirectAttributes를 통해 플래시 속성을 추가합니다.
  2. 리다이렉트: 플래시 속성은 임시로 저장되며, 리다이렉트가 발생하면 플래시 속성이 자동으로 다음 요청으로 전달됩니다.
  3. 다음 요청: 리다이렉트된 페이지는 전달된 플래시 속성을 모델로 사용할 수 있으며, 플래시 속성은 한 번 사용된 후 삭제됩니다.

예시 코드 (Java)

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

@Controller
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(RedirectAttributes redirectAttributes) {
        // 파일 업로드 로직 처리
        redirectAttributes.addFlashAttribute("message", "File uploaded successfully!");
        return "redirect:/uploadStatus";
    }
}

코드 설명:

  1. RedirectAttributes: 이 파라미터를 사용해 리다이렉트할 때 전달할 플래시 속성을 추가합니다.
  2. addFlashAttribute(): 플래시 속성을 세션에 임시로 저장합니다. 이 속성은 리다이렉트 후에만 사용할 수 있으며, URL에 나타나지 않습니다.
  3. 리다이렉트 URL: redirect:/uploadStatus는 리다이렉트될 URL입니다. 이 URL로 이동하면 플래시 속성에 저장된 message를 사용할 수 있습니다.

리다이렉트된 이후, /uploadStatus 요청에서는 message 플래시 속성이 자동으로 모델에 추가됩니다.

리다이렉트 후 플래시 속성 사용 예시

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class UploadStatusController {

    @GetMapping("/uploadStatus")
    public String uploadStatus(Model model) {
        // 플래시 속성 사용
        if (model.containsAttribute("message")) {
            System.out.println(model.getAttribute("message"));
        }
        return "uploadStatus";
    }
}

코드 설명:

  1. Model: 리다이렉트된 페이지에서는 자동으로 플래시 속성이 모델에 추가됩니다. model.containsAttribute("message")를 통해 플래시 속성 여부를 확인할 수 있습니다.
  2. 플래시 속성 사용: 리다이렉트 후에 플래시 속성인 message는 모델에 자동으로 추가되며, 이를 사용하여 사용자에게 메시지를 출력하거나 다른 처리를 할 수 있습니다.

플래시 속성의 관리

  • FlashMap: 플래시 속성은 기본적으로 FlashMap에 저장됩니다. FlashMap은 HTTP 세션에 플래시 속성을 저장하고, 다음 요청에서 이를 사용할 수 있게 합니다. 리다이렉트 이후 플래시 속성은 자동으로 삭제됩니다.

  • FlashMapManager: FlashMapManager는 플래시 속성을 저장하고, 다음 요청에서 이를 가져와 사용할 수 있게 관리합니다. 이 매니저는 플래시 속성의 유효성을 유지하고, 이를 세션에서 적절히 삭제합니다.

플래시 속성과 동시성 문제

플래시 속성은 리다이렉트 이후 다음 요청에서만 사용되는 것이 목표이지만, 때로는 예상치 못한 다른 요청(예: AJAX 요청, 자원 요청 등)이 먼저 처리되면서 플래시 속성이 잘못 소모될 수 있는 동시성 문제가 발생할 수 있습니다.

이를 방지하기 위해, 스프링은 FlashMap에 리다이렉트 URL의 경로 및 쿼리 파라미터를 자동으로 "스탬프"하여, 올바른 요청에만 플래시 속성이 전달되도록 합니다. 그러나 이것이 완벽한 동시성 문제를 해결하지는 않으므로, 플래시 속성은 주로 리다이렉트 시나리오에서만 사용하는 것이 좋습니다.

요약

  • 플래시 속성(Flash Attributes)는 리다이렉트 과정에서 데이터를 안전하게 전달하기 위한 방법입니다. URL에 데이터를 노출하지 않고, 세션을 사용하여 다음 요청에서만 일시적으로 사용할 수 있습니다.
  • RedirectAttributes는 플래시 속성을 추가할 때 사용되며, 리다이렉트 이후 속성은 자동으로 모델에 추가됩니다.
  • 플래시 속성은 리다이렉트 후 삭제되며, 올바른 요청에만 전달될 수 있도록 스프링에서 URL과 쿼리 파라미터로 요청을 매칭합니다.

플래시 속성은 주로 Post-Redirect-Get 패턴에서 사용되며, 사용자가 폼 데이터를 제출한 후 메시지를 보여주고 다시 리다이렉트하는 경우에 유용합니다.


참고 : https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/flash-attributes.html