본문 바로가기
public void static main()/Spring

[Spring] Hidden Method

by 햄리뮤 2021. 11. 23.
반응형

회사 발표 준비....

1.Hidden Method?

  • 브라우저에 따라서 PUT, PATCH, DELETE 방식을 지원하지 않는 경우가 발생할 수 있습니다. 대부분의 많은 브라우저가 GET, POST 방식만 지원하기 때문에 REST방식을 제대로 사용하려면 브라우저가 지원하지 않는 상황에 대해서 고려해야만 합니다.
  • 대부분의 해결책을 브라우저에서 POST 방식으로 전송하고, 추가적인 정보를 이용해서 PUT, PATCH, DELETE와 같은 정보를 같이 전송하는 것입니다. 
  • 이를 Overloaded POST 라고 합니다.

 

[💬간단한 예시]

<form> 태그를 이용해서 데이터를 전송하는 경우에는 POST 방식으로 전송하되, "method" 라는 추가적인 정보를 이용합니다. 

 보통 <input type="hidden" name="_method" value="PUT"> 과 같은 형태로 사용해서 GET/POST 방식만을 지원하는 브라우저에서 REST 방식을 사용하기 위하여 <form> 태그 안에 저렇게 input 설정을 해 놓습니다. 

<예시>

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

제가 기대한 바는 POST로 전송하지만, PUT value를 이용하여 Controller의 @PutMapping("/boards/${board.id}") 애노테이션을 갖는 핸들러 메서드를 찾아가서 내 요청을 처리 하는 것인데

실제로는 이 요청을 POST로 해석해 🔴405 에러와 함께 @PutMapping을 찾는 것이 아니라 @PostMapping을 찾고 있었습니다.

 

그 이유는

해당 URL이 PUT요청으로 들어왔을 때 처리할 수 있는 핸들러 메서드만 가지고있기 때문입니다.

 

[✔️해결 방안 ******수정중입니다!****]

Spring Web MVC 에서는 

을 사용해서 POST를 PUT으로 해석합니다.

하지만 이것을 서버단에서 처리하려면 Filter역할을 해주는것이 Bean으로 등록 되어 있어야 합니다.

 

이런 역할을 해주는 것이 HiddenHttpMethodFilter 입니다.

1.1 HiddenHttpMethodFilter

Hidden 타입의 input 태그의 속성들을 읽어서 HttpServletRequestWrapper.getMethod() 반환 값을 변경해 요청된 Http 메서드 타입을 PUT, DELETE, PATCH로 변경해주는 필터 입니다.

이름 그대로 숨겨진 HTTP Method를 필터하는 클래스 입니다.

 

위 PutMapping을 찾지 못했던 에러는 HiddenHttpMethodFilter 클래스를 Bean으로 등록하면 해결됩니다.

 

<HiddenHttpMethodFilter를 Bean으로 등록하기>

@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {

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

}

HiddenHttpMethodFilter는 _method라는 이름의 파라미터가 존재할 경우 그 값을 요청 방식으로 사용합니다.

즉, _method의 값을 PUT으로 보내면 컨트롤러에서 RequestMethod.PUT의 값을 가진 URI가 호출됩니다.

 

<web.xml의 필터 설정 추가>

<filter>

<filter-name>hiddenHttpMethodFilter</filter-name>

<filter-class>org.springframework.web.filter.HiddenHtpMethodFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/</url-pattern>

</filter-mapping>

 

 

 

 

https://imbf.github.io/spring/2020/05/03/Spring-HiddenHttpMethodFilter.html

 

Spring의 HiddenHttpMethodFilter에 관한 이슈

이 포스팅에서는 HTTP Method의 처리 프로세스에 대한 서버단의 이슈에 관해서 설명하고자 한다.

imbf.github.io

https://earth-95.tistory.com/49

 

[SpringBoot] 게시판 구현하기 15 (RESTful 게시판 만들기)

들어가기 전에 하기 포스팅은 "스프링부트 시작하기(김인우 저)" 책을 공부하며 적은 포스팅입니다. 이번 포스팅에서는 RESTful에 대해 살펴보도록 하겠습니다. REST란? REST란 REpresentational State Tran

earth-95.tistory.com

 

 

 

 

 

 

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은

내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

댓글