프로젝트 중 상품 수정 관련하여 통합테스트 작성 중 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
https://blog.outsider.ne.kr/1001
'Spring > Spring-detail' 카테고리의 다른 글
RestTemplate의 개념과 기본 사용법 (0) | 2023.02.26 |
---|---|
@ResponseStatus 와 ResponseEntity 차이점 (0) | 2023.01.21 |
spring boot docker mysql 기본설정 (0) | 2023.01.09 |
spring 스케줄러(Scheduler) 적용하기 (0) | 2023.01.04 |
Springboot AOP 적용 + 어노테이션 기반 (0) | 2023.01.03 |
댓글