web.xml을 살펴보던 와중 의문을 갖게 한 문제의 코드...
<filter>
<filter-name>httpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpMethodFilter</filter-name>
<servlet-name>dispatcher</servlet-name>
</filter-mapping>
( dispatcher는 org.springframework.web.servlet.DispatcherServlet를 등록한 서블릿의 이름이다. 이 글에서 중요한 사항이 아니라 생략했다. )
HiddenHttpMethodFilter가 뭘까?
REST 방식을 사용하다 보면 GET, POST, PUT, PATCH, DELETE를 이용한다.
하지만 PUT, PATCH, DELETE 방식의 메소드를 지원하지 않는 브라우저가 있을 수 있다.
이럴 때 해결책으로 브라우저에서는 POST 방식으로 전송하고, 추가적인 정보를 이용해 PUT, PATCH, DELETE 같은 정보를 전송한다. ( =Overloaded POST )
이를 위해서는 두 가지 방법이 있는데, HiddenHTtpMethodFilter를 web.xml에 설정하는 것은 그 방법 중 하나이다.
1. Ajax 통신
$.ajax({
type:'delete',
url: ~ ,
headers:{
"Content-Type": "application/json",
"X-HTTP-Method-Override": "DELETE"},
...
},
...
})
- 'X-HTTP-Method-Override' 이용한 overloaded post
2. form 태그
<form id="del-info-form" action="/boards/${bno}" method="post">
<input type="hidden" name="_method" value="DELETE">
</form>
- post 방식이되, '_method' 이용한 overloaded post
- web.xml 파일에서 HiddenHttpMethodFilter를 추가해야 한다.
- <form>은 원래 GET, POST 방식만 지원하고, 다른 메소드들은 form의 역할과 거리가 멀다는 이슈가 있다. 이에 대해 자세한 사항이 궁금하다면 haah.kr/2017/05/23/rest-http-method-in-html-form/ 를 참고해도 좋다.
참고
velog.io/@ette9844/REST-PUT-PATCH-DELETE-%EB%AF%B8%EC%A7%80%EC%9B%90-%EC%B2%98%EB%A6%AC
'Develop > Spring+JPA' 카테고리의 다른 글
[Spring] Initializr로 스프링 부트 기반 프로젝트 생성 (0) | 2021.03.10 |
---|---|
[Spring] @JsonProperty (2) | 2021.03.08 |
[Spring] web.xml 분석하기 (0) | 2021.02.03 |
[Spring] Interceptor (0) | 2021.01.29 |
[Spring Boot] Request method 'DELETE' not supported (2) | 2021.01.20 |