Spring Boot

[Spring Boot] RedirectAttributes, FlashAttributes

KrystalJo 2021. 10. 1. 13:17

 

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하면 파라미터가 삭제됨

 

 

 

RedirectTestController.java
0.00MB

'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