Spring에서 redirect를 사용하여 페이지를 이동할 때, 기본적으로 model 값은 보내지지 않는다. Redirect는 클라이언트에게 새로운 URL로 이동하라는 지시를 전달하는 것이므로, 이동한 페이지에서는 이전 요청과는 별개로 새로운 요청이 발생한다.
그러나 Spring에서는 리다이렉트 시에도 데이터를 유지하기 위한 방법을 제공한다. 주로 다음과 같은 방법을 사용한다.
RedirectAttributes를 사용하여 리다이렉트 시에 데이터를 전달할 수 있다. 이를 통해 모델에 추가된 속성들을 리다이렉트 시에도 유지할 수 있다. 주로 addFlashAttribute()
메서드를 사용하여 데이터를 전달하고, 리다이렉트된 페이지에서 @ModelAttribute
어노테이션을 사용하여 데이터를 받을 수 있다.
리다이렉트할 URL에 데이터를 파라미터로 추가하여 전달할 수도 있다. 예를 들어, redirect:/targetPage?data=value
와 같은 형식으로 URL을 작성하여 데이터를 전달할 수 있다. 이 경우, 리다이렉트된 페이지에서는 해당 파라미터를 추출하여 사용할 수 있다.
RedirectAttributes를 사용할때는 Controller 내부의 메서드 파라미터에 넣어줘서 사용하면 된다.
❓ Spring이 어떻게 자동으로 RedirectAttributes 객체를 생성해서 메서드에 전달할까?
➡️ Spring이 자동으로 RedirectAttributes 객체를 생성하고 메서드에 전달하는 과정은 스프링의 HandlerMethodArgumentResolver
기능을 통해 이루어진다.
HandlerMethodArgumentResolver
는 스프링 MVC의 요청 처리 중에 컨트롤러 메서드의 파라미터를 해석하고 값을 바인딩하는 역할을 수행한다. RedirectAttributes를 파라미터로 갖는 메서드의 경우, RedirectAttributesMethodArgumentResolver
라는 내장된 HandlerMethodArgumentResolver
가 실행되어 RedirectAttributes 객체를 생성하고 값을 바인딩한다.
실제로 RedirectAttributesMethodArgumentResolver
는 HandlerMethodArgumentResolver
인터페이스를 구현하고 있으며, supportsParameter()
와 resolveArgument()
메서드를 구현하여 동작한다. supportsParameter()
메서드는 해당 파라미터가 RedirectAttributes인지 확인하고, resolveArgument()
메서드는 실제 RedirectAttributes 객체를 생성하고 값을 바인딩하여 리턴한다.
따라서, RedirectAttributes를 파라미터로 선언하면 스프링은 내부적으로 RedirectAttributesMethodArgumentResolver
를 통해 RedirectAttributes
객체를 생성하고 메서드에 전달하는 것이다. 이를 통해 개발자는 편리하게 리다이렉트 시 데이터를 전달할 수 있다.