본문 바로가기

웹/spring

@ModelAttribute , @RequestParam , RedirectAttributes

1. @ModelAttribute

controller의 메소드들을 보면 가끔 @ModelAtrribute 어노테이션이 붙은 파라미터를 볼 수 있다.

그러면 이 어노테이션이 붙은 파라미터의 타입의 객체가 생성이된다. 이때 이 객체는 비어있다.

이때 그 빈 객체의 클래스에는 @Getter 와 @Setter가 정의되어 있어야된다.

사용자가 요청한 쿼리스트링의 값들이 이 생성된 빈 객체에 setter를 통해 주입이된다. 

예를 들어 파라미터가 이렇게 있다고 하자

@ModelAttribute("modelName") SomeClass someClass 

그럼 SomeClass에 사용자가 요청을 하면서 서버로 넘겨준 값들이 SomeClass 객체에 바인딩 된다.

그리고 Model 에 modelName 이라는 이름으로 객체가 추가된다.

그리고 그걸 Model 객체에 담아 사용자에게 return을 한다.

그러면 클라이언트 페이지에서는 modelName.field 형식으로 접근할 수 있다.

 

2. @RequestParam 

이 어노테이션도 controller의 메소드에서 많이 볼 것이다.

이것은 사용자가 요청한 queryString의 값을 자신이 임의로 만든 Object에 바인딩 하는 것이다.

 

3.RedirectAttriubtes

redirect는 get 방식이다. 그리고 redirect는 요청정보가 유지되지 않는다. 

기존의 요청은 끊어지고 새로운 GET 요청이 시작된다.

때문에 redirect를 할 시 model은 의미가 없다. model은 비어있을 것이다.

 

근데 redirect를 하더라도 데이터의 전송은 필요하다. 그때 사용하는것이 RedirectAttributes 이다.

redirect에 대해서 알아볼때 PRG 패턴이라고 하는 방식도 알아두면 좋다.

POST 방식의 요청을 Redirect 시켜 GET 방식으로 새로운 요청을 하는 방식이다.

이런 PRG 같은 방식을 사용하는게 RedirectAttributes의 메소드들이다.

이 클래스는 몇개의 메소드를 제공한다. 대표적인 것으로 2가지 정도를 소개하고자 한다.

 

- addAttribute("key",value) 

primitive 타입의 데이터를 전송한다.

이때 uri에 key 와 value 값이 노출이된다.

참고로

스프링에서는 model에 원시타입 데이터를 담고 있는경우에 한해 자동으로 uri의 파라미터로 추가해서 응답을한다.

하지만

스프링 부트에서는 원시타입 데이터가 자동으로 추가되지 않는다.

redirectAttribute를 사용해야 한다.

만약에 자동으로 추가하는 옵션을 사용하고 싶다면 application.properties에 다음과 같이 추가하자

spring.mvc.ignore-default-model-on-redirect=false

 

- addFalshAttributes("key",value)

그럼 객체를 전달하려면 어떻게 해야 할까?

그때 사용하는게 addflashAttribute이다.

flash 속성이라는게 있다. 스프링에서 제공하는 속성이라고 생각하자.

이 falsh 속성은 1회용 세션이라고 보면 편하다. 

바로 다음요청까지 유효한 세션이다.

스프링말고도 Grails 나 Rails 같은 프레임워크도 이런 falsh scope 를 제공해준다. 처음 알았다.

flashAttribute 에 저장된 value는 Model 에 저장이 된다.

때문에 jsp와 같은 View에서는 Model에서 데이터를 가져오면 된다.

그리고 uri에도 key와 value 가 표시되지 않는다.

 

 

 

 

 

' > spring' 카테고리의 다른 글

redirect 시 attribute 전달  (0) 2021.05.21
spring --12.스프링 시큐리티  (0) 2021.03.03
spring --13 트랜잭션  (0) 2021.02.26
spring --11. RESTful API  (0) 2021.02.25
spring --11.예외처리  (0) 2021.02.22