본문 바로가기
Spring/Spring-detail

Multipart 는 HTTP POST 로만 사용

by YoonJong 2023. 1. 11.
728x90

프로젝트 중 상품 수정 관련하여 통합테스트 작성 중 Multipart 관련하여 오류가 발생해 찾아보게 되었다.

발생한 오류는 405 에러로, HTTP 메서드가 잘못된 에러였다.

여기서 궁금했던 점은 , 상품 등록 할 때와 똑같이 multipart 를 사용했고, contentType 도 MIXED 를 사용을 했는데

에러가 발생했다는 점이었다.

 

405에러니까 HTTP 메서드를 보았는데, 등록은 POST  수정은 PUT 이었다.

따라서 PUT 이 잘못되었다는 건데, POST 가 수정으로 사용할 수 있으니 바꾸어 테스트 해보니 정상적으로 통과가 되었으며, 실제 POSTMAN 에서 직접 POST 로 수정했을 때 정상적으로 DB 데이터와 S3 데이터 모두 정상변경 되는 것을 확인했다.

 

이제 왜 PUT 은 안되는지 확인해보았다.

 

HTTP 메서드를 학습하면서 수정과 삭제에도 POST 를 사용할 수 있다 라고 알고 있었지만,

" RESTful " 하도록 작성하는 것이 보편화되어있어, 습관적으로 수정은 PUT 이나 PATCH 를 사용했다.

또한, Multipart 를 사용하고 테스트 코드를 작성하면서 이번에 발생한 에러를 처음 접해보았다.

 

 

기존 FORM 에서 GET 또는 POST 로 전송하면 서버에서 PUT, DELETE 등으로 타입을 변환하여 사용 할 수 있도록 도와주는 HiddenHttpMethodFilter 가 처음으로 작동한다.

 

하지만 아래 메서드를 보니, Filter 가 작동하지않고 POST 로만 받게 되어있다.

 

왜 POST 만 지원할까?

RESTful 의 창시자인 로이필딩의 답변을 보면, 아래와 같다.

간단히 해석하면, 아래와 같다.

 

PUT 은 보낸 표현이 목적 리소스의 값을 대체하는 것을 의미한다.

서버는 멀티파트를 사용하는 것은 '정상'이 아니며, 파일 업로드 기능을 지원하지 않을 것으로 예상한다.

PUT 패키지를 쓰고 싶으면, 패키징 형태로(zip) 표현할 수 있는 리소스를 정의하고, 리소스의 값을 업데이트할 리소스에 PUT을 사용하는 것을 제안한다 

 

결론은 multipart 에 PUT 을 사용하면 안된다 라는 것이다.

 

나 같은 경우에는 하나의 URI 로 여러 리소스 ( 상품정보json , 이미지multipartfile ) 을 보내 한번에 처리하고자 해서 

PUT이 적합하지 않는다는 의미라고 해석했다.

 

 

참고

https://issues.apache.org/jira/browse/FILEUPLOAD-197

 

[FILEUPLOAD-197] ServletFileUpload isMultipartContent method does not support HTTP PUT - ASF JIRA

This method explicitly checks for method POST. I believe the PUT method can also have multipart requests, and there may be others. In our case we are receiving rest calls using Spring Framework's CommonsMultipartResolver which in turn uses this method of t

issues.apache.org

https://blog.outsider.ne.kr/1001

 

multipart는 HTTP POST로만 전송해야 한다 :: Outsider's Dev Story

작업을 하다가 `multipart/form-data`로 PUT 전송을 할 일이 생겼다. 예를 들어 일반적인 회원가입 폼을 생각해 보면 회원가입시에는 `/signup`에 POST로 폼 전송을 하지만 회원 가입 후 회원정보를 갱신한

blog.outsider.ne.kr

 

728x90

댓글