처음부터 차근차근

@DeleteMapping과 @PutMapping 본문

Framework/Spring

@DeleteMapping과 @PutMapping

_soyoung 2022. 5. 24. 13:55
반응형

REST API를 개발할 때
update 부분 : PostMapping -> PutMapping
delete 부분 : GetMapping -> DeleteMapping
으로 변경해보라는 조언을 받아 공부하게 되었다.

@DeleteMapping

DeleteMapping은 데이터를 delete할 때 사용하는 매핑이다.

html

<form id="delete_form" action="/board/${board.id}/delete" method="post">
    <input type="hidden" name="_method" value="delete"/>
    <a onclick="if (confirm('정말로 삭제하시겠습니까?')) document.getElementById('delete_form').submit();" class="btn btn-danger">삭제</a>
</form>

form에다 method="delete" 이렇게 하면 정상적으로 되지 않고,
저런식으로 hidden type을 생성하고 name="_method" value="delete" 해야 delete method로 보낼 수 있다.


controller

@DeleteMapping("/{id}/delete")
public String deleteMovie(@PathVariable int id) {
    boardService.deleteBoard(id);
    return "redirect:/board/list";
}

delete method로 온 요청을 delete mapping으로 받는다.


이렇게 해서 실행해보려고 했더니 웹 페이지에 error가 떴다.

org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
(요청 방법 'POST'가 지원되지 않습니다.)
즉, 서버 측에서 delete mapping을 인식하지 못했다는 뜻이다.

이 오류의 해결 방법은 아래의 블로그에서 찾을 수 있었다.
https://kth990303.tistory.com/51

 

[Spring] CRUD 기능 실습 중 @DeleteMapping 관련 에러

저번에 포스팅한 CRUD 실습을 이어하던 중, @DeleteMapping으로 삭제하려던 중 아래 사진과 같은 에러가 발생하였다. This application has no explicit mapping for /error, so you are seeing this..

kth990303.tistory.com

@DeleteMapping, @PutMapping 등의 최신 매핑기능을 이용하기 위해선 아래와 같은 코드를 작성해야 한다고 한다.

 

@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
    return new HiddenHttpMethodFilter();
}



src / main / java / 패키지 / 프로젝트명Applicaition class에 다음의 내용을 추가한다.
프로젝트Application.class

@SpringBootApplication
public class NoticeboardApplication {

	public static void main(String[] args) {
		SpringApplication.run(NoticeboardApplication.class, args);
	}

	// 이 부분 추가
	@Bean
	public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
		return new HiddenHttpMethodFilter();
	}
}



이렇게 했더니 서버측에서 delete mapping을 인식해서 잘 실행됐다.

@PutMapping

PutMapping은 데이터를 update할 때 사용하는 매핑이다.
사용하는 방법은 delete mapping과 유사하다.

html

<form action="/board/${board.id}/edit" method="post">
    <input type="hidden" name="_method" value="put"/>
    .
    .
    .
</form>


controller

@PutMapping("/{id}/edit")
public String update(@PathVariable int id, @Valid Board board, BindingResult bindingResult) {
    if(bindingResult.hasErrors()) return "boards/edit";
    boardService.updateBoard(board);
    return "redirect:/board/{id}";
}


실행했더니 delete mapping과 같이 잘 수행됐다.

반응형
Comments