-
[Spring REST] @RequestBody와 @RequestParam 차이Back-End/Spring Legacy 2022. 9. 1. 16:42
컨트롤러에서 데이터를 인자에 할당하는 방법은 대표으로 2가지가 있다.
예를들어 <form> 태그로 값을 전달할 때
@RequestBody
데이터를 전송하고 컨트롤러에서 @RequestBody를 통해 데이터를 받아보면 입력한 'jun' 이름과 '13'이라는 나이가 잘 전달되었지만 name=jun&age=13이라는 String으로 전달되어 데이터를 사용하기에 불편함이 있다.
@RequestParam
이번엔 @RequestParam으로 받았을 때는 데이터를 저장하는 이름으로 메서드의 변수명을 설정해주어야 한다. 결과적으로 jun이라는 이름이 잘 전달 되었고, 이번엔 name이라는 변수가 할당되어 사용하기에도 용이하다.
JSON으로 데이터 전달하기
ajax를 이용해 데이터를 전달하기로 해보자. ajax는 비동기적으로 서버와 브라우저가 데이터를 주고 받는 방식이다.
'데이터전송' 버튼을 누르면 '/recieve' 주소에 post 방식으로 {name:"jun", age:"13" } 이라는 데이터가 JSON 형태로 전송된다. 위의 JSON을 통해 전달한 값을 받아보겠다.
@RequestParam
위와 같이 컨트롤러를 구현한 후 데이터를 전송해보았지만 에러가 발생한다 .
MissingServletRequestParameterException: Required String parameter 'name' is not present
name이라는 파라미터가 없다. 그 이유는 기본적으로 @RequestParam은 url 상에서 데이터를 찾기 때문에 <form> 태그를 이용해 데이터를 입력하고 제출 버튼을 누르면 입력한 데이터들이 url을 통해 전달되는 것이다.
예를 들면 'http://localhost:8080/receive?name=jun&age=13' 이런 식이다.
만약 @RequestParam("name") String name으로 매개변수 자리에 사용했다면 파라미터로 전달받은 name 값을 String형의 name 변수에 저장하겠다는 의미이다.반면 JSON 형식으로 데이터를 전송할 때는 http://localhost:8080/receive로 변함이 없고 body에 데이터를 포함하여 전송하기 때문에 @RequestParam 으로는 받을 수 없는 것이다.
그렇다면 fetch API로 데이터를 전달하되 주소를 /receive?name=jun&age=13 로 변경하고 전달해보면 정상적으로 NAME 변수에 jun이 할당된다.
@RequestBody
이번엔 JSON을 통해 입력한 데이터를 @RequestBody를 통해 받아본다. String req라는 변수를 생성했기에 결과 값은 큰 차이가 없어 보인다. 하지만 여기서 @requestBody를 쓰는 가장 큰 포인트는 자동 객체 생성에 있다. 만약 name, age를 필요로 하는 PersonVO 클래스가 있다고 한다면 우측처럼 person 객체를 생성할 수 있다. 결과 값으로 Person{name='jun' , age=13}을 출력하게 된다. @RequestBody가 아닌 @RequestParam을 이용한다면 불가능하다 .
@RequestBody에 대해 더 자세히 설명해보자면, @RequestBody는 전달된 요청(request)의 내용(body)을 이용해서 해당 파라미터의 타입으로 변환을 요구한다. 내부적으로 HttpMessageConverter 타입의 객체들을 이용해서 다양한 포맷의 입력 데이터를 변환할 수 있다. 대부분의 경우에는 JSON 데이터를 서버에 보내 원하는 타입의 객체로 변환하는 용도로 사용되지만, 경우에 따라서 원하는 포맷의 데이터를 보내고, 이를 해석해서 원하는 타입으로 사용하기도 한다.
반응형'Back-End > Spring Legacy' 카테고리의 다른 글
[4-ch17 댓글 처리 ③] jQuery와 Ajax 처리, JavaScript 모듈화 (0) 2022.09.01 [4 -ch17 댓글 처리 ② ] 서비스 영역과 Controller 처리 (@RequestBody, @PathVariable, consumes, produces ) (0) 2022.09.01 [4-ch17 댓글 처리 ① ] sql 댓글 테이블 생성과 영속 영역 설계 (MyBatis) (0) 2022.09.01 [4-ch16 REST 방식] @RestController, ResponseEntity, @RequestParam , 어노테이션과 JSON 알아보기 (0) 2022.08.31 [3-ch15 Spring 게시판] 검색 조건 처리 (0) 2022.08.29