강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

taehee-kim-dev님의 프로필 이미지
taehee-kim-dev

작성한 질문수

스프링과 JPA 기반 웹 애플리케이션 개발

테스트시, 파라미터 질문입니다.

해결된 질문

작성

·

388

0

SignUpForm 객체를 만들어서 ObjectMapper로 json으로 변환해서 post요청을 했더니,

매핑 자체가 안되네요..

이거는 강의에서의 성공 테스트인데,

위의 오류와 다른점은, 여기에서는 post 요청임에도 불구하고 파라미터 값들이 http body에 들어가지 않고 Parameters에 들어간다는 점 입니다.

제가 위에서 실패한 케이스는 content()에 json으로 넣었으니 당연히 http body에 json 형태로 들어가구요..

spring boot는 message converter가 json용으로 자동으로 들어가있다고 예전 spring boot 강의에서 배워서..

근데 이번엔 좀 다르네요 ㅠ

왜 이런 결과가 나오는 건가요??

답변 4

1

백기선님의 프로필 이미지
백기선
지식공유자

마지막에 @RequestBody가 없어"도"가 아니라 없어"야" 동작한다가 정확하겠네요. 그리고 콘솔에 찍히는 Parameters와 Body는 스프링이 HTTP 요청을 추상화해둔 개념들인고요. 실제로는 전부 HTTP 요청의 본문(body)에 들어가는 정보들입니다.

스프링이 다루는 요청 API 기준으로 정리한다면, 말씀하신 내용이 맞습니다.

0

정말정말 감사합니다!! 더 열심히 하겠습니다!!

0

아..네 죄송합니다.

나름 열심히 하고있는데 제가 좀 아직 많이 부족합니다.. 노력하겠습니다.

일단 제가 다시 찬찬히 생각해 본 결과,

content(json형 문자열)로 주었을 때, http body에 json형 문자열이 담겨져 보내지고,

controller에서 그것을 message converter로 매핑해서 받으려면 @RequestBody를 붙여야 하네요.

그런데 기선님이 성공하신 테스트의 로그를 보면, 

보내는 http요청의 body값이 null로 param값들이 담겨져 가지 않고, Parameters에 담겨져 들어가고 있습니다. 이 부분에 의문을 두고 생각해 본 결과를 정리하면 아래와 같습니다.

1. param()으로 데이터를 지정해 post 요청을 보내는 테스트를 돌리면, 테스트 로그상에는 body에 해당 내용이 존재하지 않고, Parameters 부분에만 보인다.

2. param()으로 데이터를 지정해 post 요청을 보내는 테스트를 돌리면, message converter를 거치지 않는다. 이것이 content()와 param()의 차이이다. content()는 Parameters가 아닌 body에 명시가 되고, 이는 @RequestBody에서 message converter를 거친다. 하지만, param()으로 보내면, body가 아닌 Parameters에 데이터가 포함된다. 이것은, message converter를 거치지 않고, message converter 직후의 작업부터 시작한다.

즉, @RequestBody가 없어도 작동한다. 그리고 get 요청이든, post요청이든 controller 함수의 매개변수에 param()의 값들을 바로 매핑해준다.

이렇게 정리해 봤는데요,, 맞나요??

0

백기선님의 프로필 이미지
백기선
지식공유자

스프링 MVC와 테스트에 대한 학습이 부족하신거 같네요. 혹시 제 다른 강좌도 수강하지 않으셨던가요? 왠지 아이디가 기억에 남는데.. 

일단 post().param()으로 넣은 데이터는 HTTP body에 들어가는 데이터가 맞습니다. 쿼리 스트링에 들어가는 데이터가 아니에요.
두번째로, ObjectMapper로 JSON 데이터를 넣었을 때 맵핑이 안되는 이유는 말씀 드리고 싶지 않습니다. 직접 공부해서 알아내시면 좋겠습니다. 한달 뒤에도 공부를 했는데도 모르시겠으면 그때 답을 알려드리겠습니다.

taehee-kim-dev님의 프로필 이미지
taehee-kim-dev

작성한 질문수

질문하기