[Spring] @RequestBody?

추민석·2021년 6월 20일
0
post-thumbnail

Controller 메서드에서 Parameter 값을 매핑시키는 방법은 여러가지가 있다.
그 중 @RequestBody에 대해 알아보고자한다.

RequestBody?

@RequestBody는 클라이언트가 전송하는 Json(application/json) 형태의 HTTP Body 내용을 Java Object로 변환시켜주는 역할을 한다. 그렇기 때문에 Body가 존재하지 않는 Get 메소드에 @RequestBody를 활용하려고 한다면 에러가 발생하게 된다.

@RequestBody로 받는 데이터는 Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverter를 통해 Java 객체로 변환된다.

몇가지 작업을 통해 RequestBody에 대해 알아보자!

🎃form 태그를 사용해 Controller에서 데이터를 받아보기

	<form action="testRequestBody">
		<label>ID: </label> 
		<input type="text" name="id" id="id" />
		<label>NAME: </label>
		<input type="text" name="name" id="name" />
		<label>AGE: </label> 
		<input type="text" name="age" id="age" />
		<input type="submit" value="formSubmit"/>
	</form>
	@RequestMapping(value = "/testRequestBody")
	public String testRequestBody(@RequestBody MultiValueMap<String, String> testVo) {

		System.out.println(testVo);
		return "home";

	}

결과 👇👇
HTTP 상태 415 – 지원되지 않는 Media Type

원인 👇👇
415 오류는 지원되지 않는 형식으로 클라이언트가 요청을 해서 서버가 요청에 대한 승인을 거부한 오류를 의미한다. 이럴 경우에는 ContentType, Content Encoding 데이터를 확인할 필요가 있다.


form 태그를 사용하여 전송할 경우 Default Content_type은 application/json이 아니라 application/x-www-form-urlencoded 이다.

@RequestBody는 위에서 언급했듯이 JSON 형태로 데이터가 들어오면 (application/json) 해당 json 데이터를 jackson 라이브러리를 사용하여 model 객체로 변환한다.

application/x-www-form-urlencoded로 요청이 들어왔으므로 415 에러가 발생한 것이다.

결론 👇👇

요청이 application/x-www-form-urlencoded 형식이면(form데이터 이거나
ajax의 content_type이 default(application/x-www-form-urlencoded) 값일 경우
@RequestBody를 제거!!(제거하면 @ModelAttribute가 생략된 형태)



🎃ajax를 사용해 Controller에서 데이터를 받아보기

 <label>ID: </label> <input type="text" name="id" id="id" />
	<label>NAME: </label> <input type="text" name="name" id="name" />
	<label>AGE: </label> <input type="text" name="age" id="age" />
	<input type="button" value="goRequestBody" onclick="requestBodyTest()" /> 
		function requestBodyTest() {
		var info = {
			"id" : $("#id").val(),
			"name" : $("#name").val(),
			"age" : $("#age").val()
		};

		$.ajax({
			type : "POST",
			url : "testRequestBody",
			async : true,
			data : info,
			dataType : "json",
			contentType : "application/json;charset=UTF-8",
			success : function(data) {
				alert(data);
			},
			error : function(error) {
				console.log(error);
			}
		});
	}

결과 👇👇
400 에러!!

원인 👇👇
JSON 의 일반적인 용도는 웹 서버와 데이터를 주고 받는 것이다.
웹 서버로 데이터를 보낼 때 데이터는 문자열이여야 하며,
JSON.stringify()를 사용해서 Javascript 객체를 문자열로 변환해야한다.

		function requestBodyTest() {
		var info = {
			"id" : $("#id").val(),
			"name" : $("#name").val(),
			"age" : $("#age").val()
		};

		$.ajax({
			type : "POST",
			url : "testRequestBody",
			async : true,
			data : JSON.stringify(info),
			dataType : "json",
			contentType : "application/json;charset=UTF-8",
			success : function(data) {
				alert(data.home);
			},
			error : function(error) {
				console.log(error);
			}
		});
	}

👉👉 성공!!

참조

https://mangkyu.tistory.com/72
https://blog.naver.com/writer0713/221853596497
https://okky.kr/article/717506
https://holjjack.tistory.com/79

profile
풋내기개발자

0개의 댓글