Required request body is missing
이 에러를 본 적 있는가?
해석해보자면 요청의 body에 존재해야될 것이 존재하지 않는다는 것이다.
보통 400 Bad Request, 415 Unsupported Media Type 에러와 함께 발생할 확률이 높다.
해당 api를 사용할 때 요청에 들어있는 객체를 이용해서 처리하는데, 정작 요청 body에 값이 없는 것이다. 주로 POST, PUT http method API를 사용할 때 많이 발생한다.
해결 방법은 어떻게 될까?
1. (가장 높은 확률로) 요청 body에 담긴 값이 JSON이 아닐 때
400 Bad Request, 415 Unsupported Media Type 에러와 함께 postman을 이용하여 간접적으로 api 호출을 할 때 주로 발생하는 원인이다. 요청값을 JSON 형태로 보내지 않은 것이다. 주로 text로 보내고 있을 확률이 높다.
이 글을 참고하면 좋을 듯하다.
https://stackoverflow.com/questions/52974330/spring-post-method-required-request-body-is-missing
아니면 text/plain으로 보내고 있을 확률도 있다.
RestAssured를 이용하여 테스트를 하고 있다. 이 때, body에 sectionRequest를 담아서 요청을 보내주지만, Content type을 별도로 지정해주지 않았기 때문에 아래 에러가 발생하게 된다.
Content type 'text/plain;charset=ISO-8859-1' not supported
우리가 지금 보고 있는 Required request body is missing 의 자매품이라 보면 된다.
위와 같이 contentType을 JSON_VALUE로 지정해주어야 한다.
2. Http method를 잘못 지정했을 때
하지만 분명 Json 형태로 요청 body에 값을 담았는데도 위 에러가 발생한다면?
Http method를 올바르게 지정해서 사용하고 있는지 확인해보자.
?? 그러면 Method Not Allowed 에러가 발생했어야 되는거 아냐?
라고 생각할 수도 있다.
하지만, URI가 동일한 Http method만 다른 api가 존재한다면 충분히 가능성있다.
URI는 동일하지만 GET, PUT, DELETE http method의 api들이 있는 것을 확인할 수 있다.
만약 showLine 함수 기능의 api를 호출하려 했는데 updateLine 함수 기능의 api를 호출해버렸다면?
의도한 기능은 요청 body에 값을 필요로 하지 않는다. 하지만, 잘못 호출하여 사용된 updateLine 함수에는 @RequestBody로 요청 body에 값을 필요로 한다.
이렇게 Http method를 잘못 지정해줬다면 의도치 않은 api가 호출되어 에러가 발생할 수 있는 것이다.
이 경우는 해당 라인에 에러가 검출되지 않고 다른 라인에서 에러가 검출됐다고 IDE에서 표기해줄 확률도 있다. 게다가 Http method나 Content type을 잘못 지정했을리 없다고 생각하고 다른 데에서 원인을 찾으면서 삽질할 수도 있다.
정신을 차린 상태로 개발을 해야 되는 이유인 듯하다.
졸리거나 피곤하면 조금 휴식도 취하고 ㅎㅎ
'JAVA > JAVA | Spring 학습기록' 카테고리의 다른 글
[Spring] 인증 토큰을 생성하는 JwtTokenProvider를 알아보고 테스트를 작성해보자 (0) | 2022.07.22 |
---|---|
[Spring] 테스트에서 test 스키마가 아닌 main의 스키마를 의존한다면? _ application.yml 설정 (2) | 2022.06.09 |
[ERROR] Request method 'GET' not supported 해결 (0) | 2022.05.09 |
[Spring][TDD] RestAssured를 이용한 e2e test로 Controller API까지 통합 테스트해보자 (0) | 2022.05.05 |
[Spring] @Transactional로 DB 동시성 문제를 방지하자 (6) | 2022.05.02 |