ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 데이터를 서버에 보내 원하는 타입의 객체로 변환하는 용도로 사용되지만, 경우에 따라서 원하는 포맷의 데이터를 보내고, 이를 해석해서 원하는 타입으로 사용하기도 한다. 

     

     

     

     

     

     

     

     

    참고 : https://ocblog.tistory.com/49

    반응형

    댓글

Designed by Tistory.