thymeleaf + Spring MVC DELETE, PUT 메소드 사용하기
thymeleaf로 간단한 CRUD 기능이 있는 게시판을 MVC로 개발하는 중에 컨트롤러에서 DeleteMapping이 안되는 문제가 생겨서 해결 방법에 대해서 글을 작성하게 되었다.
일단 일반적으로 <form> 태그를 통해서 request를 전송할 때 GET, POST를 제외한 메소드는 지원하지 않는다. 그렇기 때문에 아래 코드처럼 <input> 태그를 통해서 메소드 정보를 전달해야 한다.
<form class th:action="@{/board/delete/{boardId}(boardId=${board.id})}" method="post" >
<input type="hidden" name="_method" value="DELETE">
<input type="hidden" name="_method" value="DELETE">를 삽입하면 원하는 메소드로 요청이 잘 전송된다.
그러나 더 간단한 방법이 있다.
form 에서 제공하지 않는 hidden method(PUT, DELETE 등)을 사용하기 위해 HiddenHttpMethodFilter를 추가해준 뒤 th:method를 사용하면 input 태그를 작성하지 않아도 잘 작동한다.
(어차피 위의 <input> 태그를 사용하더라도 아래 과정은 해줘야 한다.)
1. HiddenHttpMethodFilter를 Bean으로 등록
@SpringBootApplication
public class MvcApplication {
public static void main(String[] args) {
SpringApplication.run(MvcApplication.class, args);
}
@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new HiddenHttpMethodFilter();
}
}
2. application.properties에 등록
spring.mvc.hiddenmethod.filter.enable=true
위 두 가지 방법중 하나를 택해서 HiddenHttpMethodFilter를 사용하도록 설정해준 뒤에, 아래와 같이 <input> 태그를 생략하고 th:method를 사용해서 request를 보낼 수 있다.
<form class th:action="@{/board/delete/{boardId}(boardId=${board.id})}" th:method="delete" >
그런데 HTML의 form 태그가 GET과 POST밖에 지원하지 않는 이유가 궁금해서 찾아봤더니 정리된 글이 있었다.
REST - HTML Form에서 GET/POST만 지원하는 이유
대충 요약해보자면 form은 GET이나 POST는 form에 존재하는 컨트롤에 입력된 값을 서버에 제출하기 위해 존재하는데, PUT은 대상 리소스를 대체할 리소스 자체를 전송하는 것이고, DELETE의 URI는 리소스를 정확히 식별하고 요청을 보내기 때문에 form을 통해 값을 전달할 이유가 없다고 한다.
그런데 form 태그가 아니면 DeleteMapping에 매핑되지 않고 그냥 GET으로 들어가던데..
'JAVA > Spring' 카테고리의 다른 글
[Spring Boot] LocalDateTime Format 설정하기 (0) | 2022.08.26 |
---|---|
[Spring Boot] DTO 유효성 검증 그룹화 및 순서 지정과 테스트하기 (0) | 2022.07.09 |
Stomp WebSocket + JWT + Spring Security 채팅 구현 (3) | 2022.05.21 |
@Qualifier와 @Primary 어노테이션 사용법 (0) | 2022.05.13 |
JPA Column Enum으로 관리하기 (0) | 2022.05.11 |