RESTful 게시판으로 변경하기
//...
@RequestMapping(value = "/board/write", method = RequestMethod.GET)
public String openBoardWrite() throws Exception {
return "/board/restBoardWrite";
}
@RequestMapping(value = "/board/write", method = RequestMethod.POST)
public String insertBoard(
BoardDto board,
MultipartHttpServletRequest multipartHttpServletRequest) throws Exception {
boardService.insertBoard(board, multipartHttpServletRequest);
return "redirect:/board";
}
//...
- 두 요청의 mapping이 주소가 같으나
RequestMethod
가 GET과 POST로 구분 되는것을 알 수 있다.
<!-- restBoardDetail.html -->
<!-- .... -->
<input type="hidden" id="method" name="_method">
<!-- .... -->
<script type="text/javascript">
$("#edit").on("click", function () {
$("#method").val("put");
var frm = $("#frm")[0];
frm.action = "/board/" + boardIdx;
frm.submit();
});
$("#delete").on("click", function () {
$("#method").val("delete");
var frm = $("#frm")[0];
frm.action = "/board/" + boardIdx;
frm.submit();
});
<!-- .... -->
</script>
<!-- .... -->
- HTML은 POST와 GET방식만 지원하고 PUT, DELETE는 지원하지 않는다.
- 스프링에서 POST와 GET방식을 이용해 나머지 두가지를 사용할 수 있는 기능을 지원하는데
HiddenHttpMethodFilter
가 있다. 스프링 2.1이상에서는 자동으로 필터가 등록된다. HiddenHttpMethodFilter
는 _method
속성의 파라미터가 존재할 경우 그 값을 요청 방식으로 사용한다.
- 스프링 부트 2.2부터 기본적으로 hidden method에 대한 filter가 bean으로 등록되더라도 비활성화 되어있다고 한다. 이것을 활성화해주면
PUT
또는 DELETE
를 지정하더라도 POST
로 전송되는 오류를 방지할 수 있다. - application.properties
//RestBoardApiController
@RestController
public class RestBoardApiController {
@Autowired
private BoardService boardService;
@RequestMapping(value = "/api/board", method = RequestMethod.GET)
public List<BoardDto> openBoardList() throws Exception {
return boardService.selectBoardList();
}
@RequestMapping(value = "/api/board/write", method = RequestMethod.POST)
public void insertBoard(@RequestBody BoardDto board) throws Exception {
boardService.insertBoard(board, null);
}
@RequestMapping(value = "/api/board/{boardIdx}", method = RequestMethod.GET)
public BoardDto openBoardDetail(@PathVariable("boardIdx") int boardIdx) throws Exception {
return boardService.selectBoardDetail(boardIdx);
}
@RequestMapping(value = "/api/board/{boardIdx}", method = RequestMethod.PUT)
public String updateBoard(@RequestBody BoardDto board) throws Exception {
boardService.updateBoard(board);
return "redirect:/board";
}
@RequestMapping(value = "/api/board/{boardIdx}", method = RequestMethod.DELETE)
public String deleteBoard(@PathVariable("boardIdx") int boardIdx) throws Exception {
boardService.deleteBoard(boardIdx);
return "redirect:/board";
}
}
- 주소 혼동을 피하기 위해
RequestMapping
에 /api
를 추가한다.