Handler Method : Redirect Attributes

2024. 10. 9. 13:01Spring Framework/Web on Servlet Stack

RedirectAttributes리다이렉트를 수행할 때, 리다이렉트 URL로 전달할 데이터를 명시적으로 지정할 수 있도록 도와주는 스프링의 기능입니다. 기본적으로 스프링은 리다이렉트를 수행할 때, 모델(Model)에 포함된 모든 속성을 URL 템플릿 변수로 사용하거나, 기본 타입 속성(primitive type)을 쿼리 파라미터로 자동으로 추가합니다. 하지만, 이런 방식은 때로 불필요한 데이터가 URL에 노출될 수 있기 때문에, RedirectAttributes를 사용하여 리다이렉트 시에 전달할 속성을 제어할 수 있습니다.

기본 개념

  • 리다이렉트 시 모델 속성 처리: 스프링에서 리다이렉트를 사용할 때, 모델에 포함된 속성 중 기본 타입이나 컬렉션(또는 배열)은 자동으로 쿼리 파라미터로 URL에 추가됩니다. 예를 들어, /redirect?name=John&age=30과 같이 나타날 수 있습니다.
  • RedirectAttributes를 사용하여 명시적으로 전달할 속성만 지정할 수 있습니다. 이를 통해 불필요한 데이터가 URL에 포함되지 않도록 제어할 수 있습니다.
  • 플래시 속성(Flash Attributes): 리다이렉트 시 데이터를 URL에 노출시키지 않고, 세션에 저장하여 다음 요청에서만 사용할 수 있는 속성입니다. 플래시 속성은 세션에 일시적으로 저장되며, 세션에서 제거되지 않는 한 다음 요청에서만 사용할 수 있습니다.

예시 코드 (Java)

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

@Controller
public class FileController {

    @PostMapping("/files/{path}")
    public String upload(RedirectAttributes redirectAttributes) {
        // 파일 업로드 로직...
        redirectAttributes.addAttribute("successMessage", "File uploaded successfully!");
        return "redirect:/files/{path}";
    }
}

코드 설명:

  1. RedirectAttributes: 메서드에서 이 파라미터를 선언하면, 리다이렉트 URL로 전달할 속성을 명시적으로 지정할 수 있습니다.
  2. addAttribute(): successMessage라는 속성을 리다이렉트 URL로 전달합니다. 이 값은 자동으로 URL 쿼리 파라미터로 추가됩니다.
    • 예시: redirect:/files/path?successMessage=File%20uploaded%20successfully!
  3. 리다이렉트 URL: 리다이렉트는 URL 템플릿(files/{path})을 사용하여, 경로 변수를 유지하면서 데이터를 전달합니다.

플래시 속성 (Flash Attributes)

플래시 속성은 HTTP 세션을 이용하여 리다이렉트 후에도 데이터를 유지할 수 있도록 해줍니다. 이 속성은 URL에 노출되지 않으며, 다음 요청에서만 사용할 수 있습니다.

플래시 속성 사용 예시

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

@Controller
public class FileController {

    @PostMapping("/files/{path}")
    public String upload(RedirectAttributes redirectAttributes) {
        // 파일 업로드 로직...
        redirectAttributes.addFlashAttribute("flashMessage", "File uploaded successfully!");
        return "redirect:/files/{path}";
    }
}

코드 설명:

  1. addFlashAttribute(): flashMessage라는 속성을 플래시 속성으로 추가합니다. 이 값은 세션에 저장되어, URL에 노출되지 않고 다음 요청에서 사용됩니다.
    • URL 예시: redirect:/files/path (쿼리 파라미터 없이 리다이렉트)
  2. 플래시 속성의 사용: 플래시 속성은 리다이렉트 이후에만 사용할 수 있으며, 한 번 사용되면 세션에서 제거됩니다.

기본 모델 사용 방지

스프링에서는 리다이렉트 시 기본 모델 속성이 자동으로 URL에 추가되지 않도록 하는 플래그인 ignoreDefaultModelOnRedirect를 사용할 수 있습니다. 이 플래그를 활성화하면, 컨트롤러 메서드가 RedirectAttributes를 사용하지 않는 경우에는 기본 모델 속성이 리다이렉트 URL에 추가되지 않습니다.

예시 코드 (플래그 설정)

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureViewResolvers(org.springframework.web.servlet.config.annotation.ViewResolverRegistry registry) {
        registry.enableContentNegotiation()
                .ignoreDefaultModelOnRedirect(true);  // 기본 모델을 리다이렉트 시 무시
    }
}

URI 템플릿 변수

리다이렉트 URL에 경로 변수나 쿼리 파라미터로 속성을 추가할 때, URI 템플릿 변수는 자동으로 리다이렉트 URL에 포함됩니다. 모델이나 RedirectAttributes에 명시적으로 추가하지 않아도 현재 요청의 경로 변수는 자동으로 URL에 추가됩니다.

예시

@PostMapping("/files/{path}")
public String upload(RedirectAttributes redirectAttributes) {
    return "redirect:/files/{path}";  // {path}는 자동으로 유지
}
  • 이 경우, {path}는 URI 템플릿 변수로 자동 확장되어 리다이렉트 URL에 포함됩니다.

요약

  • RedirectAttributes는 리다이렉트 시 전달할 속성을 명시적으로 지정할 수 있게 해줍니다. 모델의 모든 속성이 자동으로 노출되지 않도록 제어할 수 있습니다.
  • 기본 타입 속성은 URL의 쿼리 파라미터로 자동으로 추가되지만, 불필요한 속성이 URL에 나타나는 것을 방지하기 위해 RedirectAttributes를 사용하는 것이 좋습니다.
  • 플래시 속성은 세션을 통해 리다이렉트 후에도 데이터를 유지할 수 있지만, URL에는 노출되지 않습니다.
  • URI 템플릿 변수는 별도로 지정하지 않아도 리다이렉트 시 자동으로 포함됩니다.

이 방식은 리다이렉트 URL에서 불필요한 정보를 제거하고, 필요한 정보만 전달할 수 있도록 해주어 보안과 효율성을 높입니다.

 

참고 : https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/redirecting-passing-data.html