Coding Planet
PRG(Post/Redirect/Get) ํจํด๊ณผ ์์ ๋ณธ๋ฌธ
| PRG ํจํด
์น ๊ฐ๋ฐ์์ ์ฌ์ฉ๋๋ ํจํด์ผ๋ก ์ฌ์ฉ์๊ฐ ํผ์ ์ ์ถํ ํ ์๋ก ๊ณ ์นจ์ ๋๋ฅด๋ฉด ๋์ผํ ๋ฐ์ดํฐ๊ฐ ์ค๋ณต ์ ์ถ๋๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ์ด๋ด ๊ฒฝ์ฐ ๋์ผ ๊ฒ์๋ฌผ์ด๋ ๊ฐ์ ์ฃผ๋ฌธ์ด ๋ฐ๋ณต๋์ด ์ด๋ฃจ์ด ์ง ์ ์๋ค. ์ด ํจํด์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ๋์ํ๋ค.
1. POST: ์ฌ์ฉ์๊ฐ ์น ์์์ ์์ฑํ๊ณ ์ ์ถํ๋ฉด, ๋ฐ์ดํฐ๋ POST ์์ฒญ์ ํตํด ์๋ฒ๋ก ์ ์ก๋๋ค.
2. Redirect: ์๋ฒ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ํ, ์ฌ์ฉ์๋ฅผ ๋ค๋ฅธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ(์: ์ฑ๊ณต ํ์ด์ง, ๋ฆฌ์คํธ ํ์ด์ง ๋ฑ)ํ๋ค. ์ด๋ ๋ฆฌ๋ค์ด๋ ํธ๋ GET ์์ฒญ์ ์ฌ์ฉํ๋ค.
3. GET: ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฆฌ๋ค์ด๋ ์
์ง์์ ๋ฐ๋ผ GET ์์ฒญ์ ํ์ฌ ์ ํ์ด์ง๋ฅผ ๋ก๋ํ๋ค.
์ด ํจํด์ ํต์ฌ์ POST ์์ฒญ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์งํ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ก๊ณ ์นจ์ ํ๋๋ผ๋ GET ์์ฒญ๋ง ๋ค์ ์ํ๋๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ๊ฐ ์ค๋ณต์ผ๋ก ์๋ฒ์ ์ ์ก๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ํตํด ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ณ , ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐ๋๋ฅผ ๋์ผ ์ ์๋ค.
| PRG ํจํด ์์ - ๊ฒ์ํ ๊ธ ๋ฑ๋ก
์๋ ์์๋ ๊ด๋ฆฌ์ ํ์ด์ง ์ ๊ท ๊ณต์ง์ฌํญ ๋ฑ๋ก๊ธฐ๋ฅ์ ๊ดํ ๊ฒ์ด๋ค.
1. ์ฌ์ฉ์๋ ์๋ JSP์์ ๊ฒ์๊ธ์ ๊ด๋ จ ํญ๋ชฉ์ ์ ๋ ฅํ๊ณ ๋ฑ๋กํ๋ค. '์ ์ฅ'๋ฒํผ ํด๋ฆญ์ javascript ํจ์๊ฐ ์๋ํ๋ฉด์ ์ปจํธ๋กค๋ฌ์ POST ์์ฒญ์ด ์ ๋ฌ๋๋ค.
<section id="container">
<div class="contents">
<h2>๊ณต์ง์ฌํญ ${subTitle}</h2>
<form name="insertNoticeBoardOne" method="post" enctype="multipart/form-data">
<input type="hidden" name="noticeBoardSubType" value="${noticeBoardSubType}"/>
<input type="hidden" id="editmode" name="editmode" value="${editmode}"/>
<div class="inner">
<div class="inputWrap">
<div class="gridWrap">
<!-- ์ ๋ชฉ ์
๋ ฅ ํ๋ -->
<div>
<span>์ ๋ชฉ</span>
<input type="text" id="bbsTtl" name="noticeTitle" maxlength="200"/>
</div>
<!-- ์์ฑ์ ์ ๋ณด -->
<div>
<span>์์ฑ์</span>
</div>
<!-- ์์ฑ์ผ ์
๋ ฅ ํ๋ -->
<div>
<span>์์ฑ์ผ</span>
<div>
<input type="text" name="noticeFirstRegistPtm" readonly="readonly" class="no-border"/>
</div>
</div>
<!-- ๋ด์ฉ ์
๋ ฅ ํ๋ -->
<div>
<span>๋ด์ฉ</span>
<textarea id="bbsCn" name="bbsCn" rows="10" cols="40" maxlength="4000"></textarea>
</div>
<!-- ํ์ผ ์ฒจ๋ถ ํ๋ -->
<div class="file-upload">
<span>ํ์ผ์ฒจ๋ถ</span>
<div id="file_upload_posbl" class="board_attach2">
<input name="file_1" id="egovComFileUploader" type="file" multiple />
<div id="egovComFileList"></div>
</div>
</div>
</div>
</div>
<!-- ๋ฒํผ ์์ญ -->
<div class="btnArea">
<ul>
<li>
<button type="button" onClick="goList()">๋ชฉ๋ก</button>
</li>
<li>
<button type="button" onClick="editData()">์ ์ฅ</button>
</li>
</ul>
</div>
</div>
</form>
</div>
</section>
2. POST : ์ปจํธ๋กค๋ฌ์์๋ ์น์์ ์์ฒญ๋ฐ์ insertAdminNoticeBoard๋ฉ์๋๋ ๊ฒ์๊ธ ๋ฑ๋ก ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ค. ์๋ฒ์ ์ ์ฅ์ด ๋๋ ๋ค ๋ชฉ๋ก ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ค.
3. GET: ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฆฌ๋ค์ด๋ ์ ์ง์์ ๋ฐ๋ผ GET ์์ฒญ์ ํ์ฌ ๊ฒ์๊ธ ๋ชฉ๋ก ํ์ด์ง๋ฅผ ๋ก๋ํ๋ค.
@PostMapping(value = "/insertAdminNoticeBoard.do")
public String insertAdminNoticeBoard(final MultipartHttpServletRequest multiRequest, NoticeBoardVO boardVO, ModelMap model) throws Exception {
List<FileVO> result = null;
String atchFileId = "";
boardVO.setNoticeBoardType(4);
final Map<String, MultipartFile> files = multiRequest.getFileMap();
if (!files.isEmpty()) {
result = fileUtil.parseFileInf(files, "BBS_", 0, "", "");
atchFileId = fileMngService.insertFileInfs(result);
boardVO.setAtchFileId(atchFileId);
}
announcementAdminSerivce.insertBoard(boardVO);
model.addAttribute("editmode", "I");
model.addAttribute("boardVO", boardVO);
return "redirect:admin/selectAminNoticeBoardList.admin";
}
@GetMapping({"/Announcement.do","/Board.do", "/QnA.do"})
public String selectAminNoticeBoardList(@ModelAttribute("searchVO") NoticeBoardVO searchVO, HttpServletRequest request, ModelMap model){
/* pageing setting */
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(searchVO.getPageIndex());
paginationInfo.setRecordCountPerPage(searchVO.getPageUnit());
paginationInfo.setPageSize(searchVO.getPageSize());
searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
searchVO.setLastIndex(paginationInfo.getLastRecordIndex());
searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
List<NoticeBoardVO> boardList = announcementAdminSerivce.selectBoardList(searchVO);
int totCnt = announcementAdminSerivce.selectBoardListTotCnt(searchVO);
paginationInfo.setTotalRecordCount(totCnt);
model.addAttribute("boardList", boardList);
model.addAttribute("noticeBoardSubType", searchVO.getNoticeBoardSubType());
model.addAttribute("paginationInfo", paginationInfo);
return "admin/AdminNoticeBoardList.admin";
}