RedirectAttributes

2022. 3. 26. 12:12Spring 기초

게시판 내용을 작성한 후, post 메서드로 폼 태그를 전송하면

게시판 리스트로 리다이렉트하도록 코드를 작성하였다.

 

 @PostMapping("/write")
    public String write(BoardDto boardDto, HttpSession session, Model m, RedirectAttributes rattr) {

        String writer = (String) session.getAttribute("id");
        boardDto.setWriter(writer);

        try {
            int rowCnt = boardService.write(boardDto);

            if(rowCnt != 1) throw new Exception("Write failed");

            rattr.addFlashAttribute("msg", "WRT_OK");
            return "redirect:/board/list";

        } catch (Exception e) {
            e.printStackTrace();
            m.addAttribute("boardDto", boardDto);
            m.addAttribute("msg", "WRT_ERR");

            return "board";
        }
    }

try~catch 블록에서, 게시글 작성(등록)이 성공적으로 수행되면 board/list로 redirect 되어야 한다.

처음에는 게시글 등록이 성공적으로 수행되었는지 사용자에게 alert로 알림을 보여주기 위해 model에

m.addAttribute("msg", "WRT_OK");

처럼 코드를 작성하였다.

 

이렇게 model에 담아서 redirect하는 경우에는 

첫번째로, URL에 쿼리 파라미터로 값이 담기게 된다. URL이 노출되는 단점도 있지만,

redirect 페이지인 board/list로 이동하였을때도 계속 URL 쿼리 파라미터에 ?msg=WRT_OK 가 존재한다.

따라서 새로고침을 하면 계속해서 alert 알림창이 발생한다.

 

이럴때 해결방안은 RedirectAttributes 클래스를 이용하는 것이다.

RedirectAttributes는 model처럼 header가 아니라 session을 통해 전송한다.

리다이렉트 요청이 들어오면, 현재 session에 속성을 복사하고, redirect 이후에 저장된 속성을 세션으로부터 가져온다.

 

RedirectAttributes가 제공하는 addFlashAttribute 메서드는 위의 방식으로 동작하며, 리다이렉트 이후에는 저장된 속성이 소멸된다. 따라서 새로고침을 눌러도 같은 alert창이 나타나지 않는다.

 

 

 

 

 

 

 

++JSP의 스크립트 태그에서 addFlashAttribute의 속성 값(msg)를 사용할 때

let msg = "${msg}";   //RedirectAttr을 사용하면 param을 붙이지 않는다.
// model에 넘겨 값이 넘어올 때, 여기서는 redirect get 방식이므로.. param.msg로 값을 꺼낸다.

 

'Spring 기초' 카테고리의 다른 글

REST API와 Ajax(2)  (0) 2022.03.27
REST API와 Ajax(1)  (0) 2022.03.27
AOP(Aspect Oriented Programming)  (0) 2022.03.02
Spring JDBC Template  (0) 2022.02.25
Spring 통합 테스트  (0) 2022.02.25