진짜 개발자
본문 바로가기

FrameWork/Spring MVC

SpringMVC - 핸들러 메소드 - 6 (리다이렉트시 데이터 다루기 : RedirectAttributes, FlashAttributes)

728x90
SpringMVC - 핸들러 메소드 - 6 (RedirectAttributes, FlashAttributes)

핸들러 메소드의 매개변수중 하나인 RedirectAttributes, FlashAttributes에 대해 알아보도록 하겠습니다.

 

 

1. RedirectAttributes

1.1 RedirectAttributes 란 ?

Handler에서 요청을 처리한 뒤 redirect를 하는 경우가 있습니다. 예를 들면 중복 서브밋을 방지하기 위해 postHandler의 경우 getHandler로 redirect를 하는등의 경우가 있습니다. 이때 어떤 데이터를 같이 전달하고 싶은 경우 데이터를 전달하는 방법은 session, requestParameter 등이 있습니다.

 

하지만 session의 경우에는 한 클라이언트(브라우저)가 종료하기 전까지 유지해야하는 데이터(로그인 여부, 장바구니 등)를 담아야 하기 때문에, redirect를 할 때에 session에 데이터를 담는것은 올바르지 않을 수 있습니다.

 

이런 경우 때문에 SpringMVC에서는 위와 같이 model에 data를 담고 Redirect를 하는 경우, Primitive Type(기본자료형)에 한해서 자동으로 url의 Parameter로 추가해서 데이터를 넘겨 주었습니다.

 

SpringBoot의 경우에는 이 기능이 off가 되어있습니다. RedirectAttributes 매개변수를 핸들러에 추가하여 원하는 데이터만을 선택적으로 Redirect시 전달할 수 있습니다.

 

 

 

1.2 RedirectAttributes 예제

저희는 RedirectAttributes를 이용하여 데이터를 전달해볼 것입니다.

사용방법은 간단합니다. redirect시 primitive Type의 데이터를 parameter로 전달하고자 하는 handler에 매개변수로 RedirectAttributes를 추가하고 addAttribute() 메소드를 이용해 data를 추가하면 끝입니다. 간단히 설명드리면, /get에 맵핑된 handler는 요청을 받으면 model에 name, age를 추가하여 /redirect로 리다이렉션합니다. /redirect 에 맵핑된 handler는 요청을 받으면, 요청 url로 부터 parameter를 가져와 출력을 합니다.

 

어플리케이션을 시작하고 /get으로 요청합니다.

 

/redirect로 리다이렉션되면서 앞서 RedirectAttributes에 추가했던 데이터가 parameter로 자동으로 전달되는 것을 볼 수 있습니다.

 

 

 

1.3 ignoreDefaultModelOnRedirect 설정

앞서서 SpringBoot의 경우에는 Model에 담긴 Primitive Type의 데이터가 redirect시 자동으로 Parameter에 추가되는 기능이 off 되어있다고 말씀드렸습니다. 이것을 다시 활성화 시켜 자동으로 데이터가 parameter로 전달되는지 테스트를 해보겠습니다.

 

application.properties에 다음과 같이 설정을 합니다.

 

RedirectAttributes에 데이터를 등록할 필요가 없으므로 해당 로직이 제거된 것을 제외하면 1.2에서 작성했던 handler와 거의 동일합니다.

 

어플리케이션을 실행한 뒤 /get으로 요청을 보냅니다.

 

/redirect로 리다이렉션되며 자동으로 parameter들이 추가된것을 볼 수 있습니다.

 

 

 

2. FlashAttributes

2.1 FlahsAttributes란?

redirect시 Primitive Type이 아닌 Object를 전달하고 싶은 경우도 있을 것입니다. 이때 사용할 수 있는 것이 바로 FlashAttributes 입니다. FlashAttributesRedirectAttributes와 마찬가지로 Session에 데이터를 담는것이 올바르지 않을때 사용할 수 있습니다만, 사실 FlashAttributes도 Session을 이용해서 데이터를 전달합니다.

 

조금 자세히 설명드리자면, Redirect시 Parameter로 데이터를 전달하는 것은 문자열로 데이터가 넘어가기 때문에, Object를 전달하는데 어려움이 있습니다. 이 때문에 FlashAttributes를 사용합니다. 또 FlashAttributes는 Session을 이용하여 데이터를 전달하는데요, 이때 넘겨받은 핸들러에서만 사용이 가능하고, 넘겨받은 핸들러가 종료될때 Session에서 FlashAttributes에 저장된 데이터들은 삭제가 됩니다.

 

 

 

2.2 FlashAttributes 예제

FlashAttributes를 추가하는 방법은 RedirectAttributes의 메소드를 사용하여 추가를 할 수 있습니다. /get에 맵핑된 handler에서는 요청을 받게되면 Event 객체를 생성하여 FlashAttributes에 담아 /redirect로 리다이렉션 합니다.

/redirect에서는 요청을 받게되면 event객체를 매개변수로 받아 콘솔에 출력합니다. flashAttributes에 담긴 객체는 @ModelAttribute를 이용하여 가져올수도 있으며, 자동으로 Model에 등록되기 때문에 model 객체를 asMap()을 이용해 Map으로 변환하여 key값을 통해 가져올 수도 있습니다.

 

어플리케이션을 실행한 뒤 /get으로 요청합니다. Object형태로 데이터를 가져온 것을 볼 수 있습니다.

 

FlashAttributes에 담긴 데이터는 요청을 처리하게 되면 삭제된다고 말씀드렸습니다. 새로고침을 연타해봅니다. 그림과 같이 한번의 요청 처리 후 데이터가 제가 되었기 때문에 null이 출력되는 것을 볼 수 있습니다.