[Spring] 14.SpringProject-리다이렉트




결과 페이지의 문제점 - 새로고침



저번 장에서 게시물 등록 페이지를 만들어 게시물을 등록해보았는데요~

한가지 문제점이 있습니다.

게시물을 등록한 후 새로고침을 누르게 되면 브라우저는 POST 방식으로 다시 한 번 데이터를 전송할 것인지 묻습니다!


image



만약 확인이 누르면 게시글이 정상적으로 등록되는데 이는 게시물 도배 현상을 일으키는 주범이됩니다!

이 문제를 해결하는 방법은 게시물을 등록하면 registPOST 실행 후 페이지를 다른 곳(다른 URI)로 이동시키는 것입니다!

바로 리다이렉트를 사용하는 것인데요~!

원래 보통 게시물을 등록하면 게시물 목록 페이지가 뜨죠? 저희도 registPOST가 끝나면 listAll 컨트롤러를 실행시켜 listAll.jsp 가 뜨게 리다이렉트 해보겠습니다!

다음과 같이 BoardController를 수정해줍니다!



//BoardController 일부


//수정
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String registerPOST(BoardVO board, Model model) throws Exception{
	logger.info("register post.....");
	logger.info(board.toString());
		
	service.regist(board);
		
	model.addAttribute("result", "registerOK");
		
	//return "/board/success";
	return "redirect:/board/listAll"; //리다이렉트
}

//추가
@RequestMapping(value = "/listAll", method = RequestMethod.GET)
public void listAll(Model model) throws Exception{
	logger.info("show all list");
}




그리고 listAll.jsp도 다음과 같이 만들어줍니다!


<!-- listAll.jsp -->


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" 
	pageEncoding="UTF-8"%>

<%@include file="../include/header.jsp" %>
<table class="table table-bordered">
	<tr>
		<th style="width: 10px">BNO</th>
		<th>TITLE</th>
		<th>WRITER</th>
		<th>REGDATE</th>
		<th style="width: 40px">VIEWCNT</th>
	</tr>
</table>
<%@include file="../include/footer.jsp" %>



그런다음 다시 Run on Server 해줍니다!


image



게시물을 등록하면 위와같이 listAll.jsp가 제대로 보여지는 것을 볼 수 있습니다!

이제 아무리 새로고침을 해봤자 계속 게시물 목록 페이지가 나오겠죠??

하지만 아직 문제가 있습니다 주소창에 보면 http:// localhost:8080/board/listAll?result=success와 같이 registPOST 에서 보낸 메시지가 그대로 URI에 노출됩니다~

새로고침을 해도 없어지지 않는데요~! 이문제를 해결하려면 Spring의 RedirectAttributes 객체를 이용해야합니다!


RedirectAttributes 를 이용한 숨김 데이터의 전송



RedirectAttributes 객체는 리다이렉트 시점에 한 번만 사용되는 데이터를 전송할 수 있는 addFlashAttributes()라는 기능을 지원합니다.


addFlashAttribute()는 브라우저까지 전송되기는 하지만 URI 상에는 보이지 않는 숨겨진 데이터의 형태로 전달됩니다.


다음과 같이 BoardController.java 의 registPosr를 수정합니다!


//BoardController.java


@RequestMapping(value = "/register", method = RequestMethod.POST)
public String registerPOST(BoardVO board, RedirectAttributes rttr) throws Exception{
	logger.info("register post.....");
	logger.info(board.toString());
		
	service.regist(board);
		
	rttr.addFlashAttribute("result", "registerOK");
		
	return "redirect:/board/listAll";
}




listAll.jsp에도 다음 script 문을 추가하여 게시물이 등록되면 경고창이 뜨게 하겠습니다~!


<!-- listAll.jsp -->


<script>
	var result = '${result}';
	if(result === 'registerOK'){
		alert('등록이 완료되었습니다.');
	}
</script>




image