본문 바로가기

웹 개발(OLD)/Spring Framework(OLD)

페이지간 정보 유지( 목록 -> 조회 -> 삭제 -> 원래 목록페이지 )

특정 게시물 조회 페이지에서 삭제를 했을 때, 삭제 처리 후 다시 원래 보고 있었던 리스트페이지로 이동하고 싶었다.
redirect를 이용하여 웹페이지를 이동할 때 RedirectAttributes 클래스의 addAttribute() 또는 addFlashAttribute() 를 이용한다.
그래서 session에 값을 담았다가 한 번 사용되고 나면 자동으로 없어지는 addFlashAttribute()를 이용하여 시도해봤다.

즉,

1. readPage.jsp 에서 아래와 같이 form 태그에서 hidden타입으로 page, perPageNum, bno값을 가지고 있는 상태에서( 이 값들은 목록 페이지에서 model에 담아서 넘겨준 값들이다.)


아래의 삭제 버튼을 클릭한다.


2. 그러면 해당 버튼의 클릭 이벤트 핸들러에서 위의 폼태그를 선택한 formObj객체를 통해 action과 method속성을 지정해주어 컨트롤러의 /board/delete에 uri가 매핑되는 컨트롤러의 메소드에서 폼 태그의 값들을 처리하도록 했다.

3. 그러면 컨트롤러의 해당 메소드인 deletePost 에서는 폼 데이터로 넘어온 bno는 @RequestParam으로 따로 받아주고, page와 perPageNum은 Criteria라는 클래스에서 함께 관리하고 있으므로 매개변수로 선언하여 파라미터를 자동으로 수집하도록 했다. 그런데 이때 보통 게시글 삭제 후 다시 원래 리스트 페이지로 이동하기 때문에, listPage로 redirect해줬다. 원래 보고있었던 리스트페이지로 이동하려면 page, perPageNum 정보를 알아야하기 때문에 RedirectAttributes의 addFlashAttriute() 를 이용하여 page, perPageNum 값을 담아 보내줬다.


4. 그러면 /listPage에 매핑되는 컨트롤러의 메소드 listPageGET에서 page, perPageNum 값을 다시 Criteria 객체로 수집할 수 있다.


5. 근데 찍힌 로거를 확인해보니 deletePost 메소드에서는 page와 perPageNum이 알맞게 찍히는데, RedirectAttributes의 addFlashAttriute() 를 이용하여 listPageGET 메소드로 보내고자한 page, perPageNum이 전달되지 않았다.
(listPageGET에서 page : 6, perPageNum : 10으로 찍혀야하는데 기본 값인 1과 10이 각각 찍혔다.)


그런데 아래처럼 /board/listPage경로의 jsp파일에서 RedirectAttributes의 addFlashAttriute() 를 이용하여 deletePOST 메소드에서 값을 담아 보낸 page와 perPageNum을 콘솔에서 확인해보니 잘 넘어오는 것을 확인할 수 있었다. 
(즉, 컨트롤러에서 addFlashAttriute() 를 이용하여 값을 담아서 다른 uri페이지로 넘기면 해당 uri에 매핑되는 컨트롤러로 가는 것이아니라 jsp페이지 즉 화면으로만 전달되는 것 같다.)
 


즉 addFlashAttriute()을 이용하여 값을 담으면 session에 해당 값을 저장했다가 jsp페이지에서 한 번 사용하고 나면 없애주는 방식으로 동작하기 때문에 컨트롤러로에서는 값을 수집할 수 없었다. 컨트롤러에서는 uri의 query 문자열로 넘어오는 값들을 자동으로 수집하기 때문에 session에 담긴 값을 읽어오지 못한 것이었다. 따라서 컨트롤러의 메소드에서 page, perPageNum을 유지해서 읽어오려면 deletePOST 메소드에서 값을 담아 보낼때 session이 아니라 uri의 query 스트링으로 담아 보내야했다. 이때 사용하는 것이  addAttribute()메소드 였다.( 애초에 addFlashAttribute() 는 uri에 노출시키지 않고 원하는 파라미터 값을 다른 페이지로 전달하고자 할 때 사용하는 메소드였다.)


물론 listPage.jsp에서 아래와 같이 form태그로 page, perPageNum값을 받아서 


아래 처럼 form 태그를 선택하여 다시 서버의 /board/listPage로 요청하게해서 원래 보고 있던 리스트 페이지로 이동할 수 는 있다. 하지만 그러면 화면 쪽에서 1페이지가 보였다가 다시 원래의 페이지로 이동되기 때문에 지저분하다. (바로 원래 페이지로 이동하지 못한다.)


6. 따라서 deletePost 메소드에서 /board/listPage로 값을 담아 보낼때 addAttribute()를 이용하도록 수정하여 전달할 파라미터를 uri의 문자열로 직접 값이 전달되도록 했다.


그리고 로거를 확인해보니 listPageGET메소드에서 deletePost 메소드로부터 받아온 page와 perPageNum 파라미터를 잘 수집한 것을 확인할 수 있다.


따라서 listPage.jsp에서는 page와 perPageNum을 갖고 있던 form태그를 지우고, script에서도 삭제 완료하면 alert로 삭제성공 정도만 띄워주도록 수정했다.


이것으로 ' 목록페이지 -> 조회 페이지 -> 삭제 버튼 -> 원래 보고 있던 목록페이지 ' 로의 이동 처리 끝.