본문 바로가기
SPRING

ModelAttribute,RedirectAttributes

by brilliant-growth 2023. 11. 13.
@ReuqestMapping(value = "saveBoard", method = RequestMethod.POST)
          public String saveBoard(@ModelAttribute("BoardVO")BoardVO boardVO,
                 @RequestParam("mode") String mode, RedirectAttributes rttr) throws Exception{

           //edit이 오면 수정 아니면 글쓰기
             if(mode,equals("edit")){
                      boardService.updateBoard(boardVO);
              }else{
                      bpardService.insertBoard(boardVO);
              }
              return "redirect:/board/getBoardList";
}

 

게시판에서 글쓰기버튼을 눌러서 글쓰기페이지로 이동후 , 글작성 또는 수정하는 이벤트의 컨트롤러 부분이다

 

ModelAttribute

글 수정 또는 작성 버튼을 누르면 saveBoard url을 RequestMapping을 통해 컨트롤러에서 받으면

saveBoard()메소드가 호출되고 스프링 컨테이너는 @ModelAttribute설정을 해석해서 세션에

BoardVo라는 이름으로 저장된 데이터가 있는지 확인한다.

그후 있다면 해당 객체를 세션에서 꺼내서 매개변수로 선언된 boardVo변수에 할당한다

그리고 boardVo객체에 사용자가 입력한 파라메터값을 할당한다

수정정보값만 새롭게 할당되고, 상세보기 했을때 세션에 저장된 데이터가 유지된다.

 

순서대로 설명

1.@ModelAttribute를 선언하면 BoardVO 클래스의 객체 boardVO를 자동으로 생성

2.자동바인딩하여 해당 변수의 setter를 통해 변수에 저장 (ModelAttribute의 매개변수는 항상 geter&setter(vo,dto)이여야함)

3.ModelAttribute([NAME])의 형태로 붙일경우 jsp파일에서 ${[NAME].property}의 형태로 Model의 값을 사용 할 수 있게 된다.

4.그래서 뷰단에선 $("#title").val('<c:out value="${boardContent.title}"/>'); 이런형식으로 사용

model 객체에 추가되고 뷰단까지 그 내용이 전달이 됨으로써 model과 뷰에 동시에 반영 가능

 

 

RedirectAttributes

POST방식으로 서버로 보낸후 바로 다른페이지로 리다이렉트 한다.

위의 코드의 리다이렉트 주소는 게시판메인화면이다.

리턴 후 바로 주소값을 입력해서 메인화면으로 돌아가지 않는 이유는 중복방지이다.

글쓰기화면 - 저장단계(서버) - 리스트화면인데 뒤로가기를 누르면 저장단계로 가게되서 자칫 게시물 도배가 될수 있다. 여기서 RedirectAttributes를 사용하면 저장단계를 지나 글쓰기 폼으로 돌아가기 때문에 도배가 되는 상황을 막을 수 있다.

 

리다이렉트를 통해 데이터를 전송할 수도 있지만,리다이렉트는 GET방식이라 URL에 표시가 되기 때문에 적합하지 않다.

그래서 addFlashAttribute()를 사용한다

addFlashAttribute()는 리다이렉트 직전 플래시에 저장하는 메소드다 리다이렉트 이후에는 소멸한다

header가 아닌 세션을 통해 전달하는 addFlash는 뒤에 파라메터가 보이지 않는다

Flash가 아마? 휘발성인듯

 

rttr.addAttribute로 전달한 값은 url뒤에 붙으며, 리프레시해도 데이터가 유지된다.

rttr.addFlashAttribute로 전달한 값은 url뒤에 붙지 않는다. 일회성이라 리프세리 할경우 데이터가 소멸한다

또한 2개이상 쓸 경우, 데이터는 소멸한다. 따라서 맵을 이용하여 한번에 값전달해야한다.

//게시판수정
@ReuqestMapping(value = "/update",method = RequestMethod.POST)
public String update(BoardVO boardVO, @ModelAttribute("scri") SearchCriteria scri, RedirectAttributes rttr) thorws Exception{
    logger.info("update");

    service.update(boardVO);

    rttr.addAttribute("page",scri.getPage());
    rttr.addAttribute("perPageNum",scri.getPerPageNum());
    rttr.addAttribute("searchType",scri.getSearchType());
    rttr.addAttribute("keyword", scri.getKeyword());
 
      return "redirect:/board/list";
}

 

 

컨트롤러의 게시판 수정중,리 다이렉트 사용 예제이다.

리다이렉트는 /board/list까지 지만 실제 url을 보면 뒤에 ?page&perPageNum=&searchType=

이런식으로 addAttribute를 통해 url이 추가된다. 선택한 게시물에 대한 url을 수정할때 위치를 전달해준다

 

flash는 예를들면 로그인시에 사용할 수 있다.

로그인 시 회원정보가 맞으면 로그인, 맞지 않으면 초기화 해야 하는데

그때 addFalshAttribute를 사용 할 수 있다.

 

출처)

스프링 게시글 글쓰기 및 수정, ModelAttribute와 RedirectAttributes의 사용 — 간편 웹프로그래밍 (tistory.com)

'SPRING' 카테고리의 다른 글

Context란?  (1) 2023.11.24
로그인시 사용하는 HttpServletRequest와 HttpSession  (0) 2023.11.13
HttpServletRequest,RequestParam,ModelAttribute  (0) 2023.11.13
Model,ModelMap vs ModelAndView  (0) 2023.11.13
CDN  (0) 2023.07.10