Spring Boot를 사용하기 시작하면서 페이지 redirect할 때 RedirectAttributes를 처음 사용해보게 되었는데
원래 자주 사용하던 Model 클래스와 어떤 차이점이 있는지 궁금하여 글을 쓰게 되었다.
Model
- Spring에서는 Redirect시 URI에 쿼리 파라미터가 전달됨
- Spring Boot부터 기본적으로 Redirect시 URI에 쿼리 파라미터가 전달되지 않음
- application.properties 설정을 통해 쿼리 파라미터 전달 가능
- Primitive type(기본자료형)의 데이터를 URL의 쿼리 파라미터로 전송
Model 클래스 사용 Redirect 코드 예제
@GetMapping("/redirectModelTest")
public String redirectModelTest(Model model){
log.info("redirectTest....................." );
model.addAttribute("param", "Model");
return "redirect:/redirect/modelPage";
}
@GetMapping("/modelPage")
public void modelPage(@ModelAttribute("param") String param, Model model){
log.info("modelPage....................." );
log.info("param : " + param);
model.addAttribute("param", param);
model.addAttribute("result", "modelPage");
}
결과 >>
redirectTest.....................
modelPage.....................
param :
-> 파라미터가 전달 안됨
application.properties
spring.mvc.ignore-default-model-on-redirect=false
application.properties에 Model 클래스 쿼리 파라미터 설정을 저장 후
다시 /redirect/redirectModelTest 로 페이지로 이동
-> URI뒤에 param 쿼리 파라미터가 따라 전달됨
RedirectAttributes
- Spring 3.1 이상 제공
- 기본 설정을 변경할 필요 없음
- Redirect할 시 원하는 값을 전달할 수 있음
- Primitive type(기본자료형)의 데이터를 URL의 쿼리 파라미터로 전송
RedirectAttributes 클래스
/**
* @author Rossen Stoyanchev
* @since 3.1
*/
public interface RedirectAttributes extends Model {
@Override
RedirectAttributes addAttribute(String attributeName, @Nullable Object attributeValue);
@Override
RedirectAttributes addAttribute(Object attributeValue);
@Override
RedirectAttributes addAllAttributes(Collection<?> attributeValues);
@Override
RedirectAttributes mergeAttributes(Map<String, ?> attributes);
RedirectAttributes addFlashAttribute(String attributeName, @Nullable Object attributeValue);
RedirectAttributes addFlashAttribute(Object attributeValue);
Map<String, ?> getFlashAttributes();
}
Model 클래스를 상속 받아 addAttribute를 오버라이딩함
-> Primitive type(기본자료형)의 데이터를 URL의 쿼리 파라미터로 전송할 수 있음
RedirectAtrributes 클래스 사용 Redirect 코드 예제
@GetMapping("/redirectRdAttrTest")
public String redirectRdAttrTest(RedirectAttributes redirectAttributes){
log.info("redirectRdAttrTest....................." );
redirectAttributes.addAttribute("param", "redirectRdAttrTest");
return "redirect:/redirect/rdAttrPage";
}
@GetMapping("/rdAttrPage")
public void rdAttrPage(@ModelAttribute("param") String param, Model model){
log.info("RdAttrPage....................." );
log.info("param : " + param);
model.addAttribute("param", param);
model.addAttribute("result", "RdAttrPage");
}
결과 >>
redirectRdAttrTest.....................
RdAttrPage.....................
param : redirectRdAttrTest1
-> URI뒤에 param 쿼리 파라미터가 따라 전달됨
-> page를 refresh하여도 파라미터가 계속 살아있음
FlashAttributes
- data가 URI에 노출되지 않음
- 임의의 객체 저장 가능
- Redirect전 DATA를 HTTP Session에 저장하고, Redirect후 즉시 제거함
- Primitive type(기본자료형)이 아닌 다른 Object type을 파라미터로 전달할 수 있음
FlashAtrributes 클래스 사용 Redirect 코드 예제
@GetMapping("/redirectFlAttrTest")
public String redirectFlAttrTest(RedirectAttributes redirectAttributes){
log.info("redirectFlAttrTest....................." );
TestClass testClass = new TestClass();
testClass.name = "sj";
testClass.age = 24;
redirectAttributes.addFlashAttribute("param", testClass);
return "redirect:/redirect/flAttrPage";
}
@GetMapping("/flAttrPage")
public void flAttrPage(@ModelAttribute("param") TestClass param, Model model){
log.info("flAttrPage....................." );
log.info("param.name : " + param.name);
log.info("param.age : " + param.age);
model.addAttribute("param", param);
model.addAttribute("result", "flAttrPage");
}
결과 >>
redirectFlAttrTest.....................
flAttrPage.....................
param.name : sj
param.age : 24
-> URI뒤에 param 쿼리 파라미터가 따라 전달되지 않음
-> page를 refresh하면 파라미터가 삭제됨
'Spring Boot' 카테고리의 다른 글
[Spring Boot]ResponseEntity (0) | 2021.11.28 |
---|---|
[Spring Boot] JPQL, Repository 확장 (0) | 2021.11.07 |
[Spring Boot] Spring Data JPA (0) | 2021.10.23 |
[Spring Boot] Entity VS DTO (0) | 2021.09.25 |