목차

스프링 부트에서 RESTful

🗓️

RESTful 게시판으로 변경하기

Controller

//...
@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로 구분 되는것을 알 수 있다.

View (template)

<!-- 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속성의 파라미터가 존재할 경우 그 값을 요청 방식으로 사용한다.

hiddenmethod filter

  • 스프링 부트 2.2부터 기본적으로 hidden method에 대한 filter가 bean으로 등록되더라도 비활성화 되어있다고 한다. 이것을 활성화해주면 PUT또는 DELETE를 지정하더라도 POST로 전송되는 오류를 방지할 수 있다.
  • application.properties

REST API

//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를 추가한다.