Framework/Spring

[HTTP] @RequestParam vs @RequestBody

simDev1234 2022. 10. 19. 16:04

|  개요

- @RequestParam, @RequestBody

- @RequestParam은 URI를 통해서 넘겨 받는 값을 말하고,

- @RequestBody는 Http body에 데이터를 묶어서 받는 값을 말한다.

- 일반적으로 RequestParameter는 ?key=value와 같이 단일 데이터를 넘겨 받고,

  RequestBody는 x-www-form-urlencoded나 Json과 같이 특정 데이터 포맷으로 묶여서 담겨지는 경우가 많다.

- Post 방식으로 넘겨 받는 URI 모습

  *body 값으로 다양한 데이터 포맷이 존재하는 걸 볼 수 있다. 

|  실험

- POST 방식으로 Body에 담겨 넘어오는 데이터의 타입을 크게 두 가지로 분류해보았다. (물론 데이터 타입은 더 다양하다)

  1) x-www-form-urlencoded (form 디폴트 타입)

  2) json 타입

- Annotation, @RequestParam, @RequestBody에 따라

  두 가지 타입의 데이터를 어떻게 읽어오는지 아래의 메소드들을 사용해서 확인해보았다.

// 아래 각 케이스에 대하여 x-www-form / json 타입의 요청을 전달한다.

// case 1 : 단일 데이터 + @RequestParam
@PostMapping("/register")
public void register(@RequestParam String id){
    System.out.println(id); 
}

// case 2 : 단일 데이터 + @RequestBody
@PostMapping("/register2")
public void register2(@RequestBody String id){
    System.out.println(id); 
}

// case 3 : 객체 데이터 + @RequestParam
@PostMapping("/register3")
public void register3(@RequestParam UserRegister userRegister){
    System.out.println(userRegister); //
}

// case 4 : 객체 데이터 + @RequestBody
@PostMapping("/register4")
public void register4(@RequestBody UserRegister userRegister){
    System.out.println(userRegister); //
}

----- ++ 추가적으로 Annotion 미사용시 케이스도 확인

// case 5 : 단일 데이터 + Annotation 없음
@PostMapping("/register5")
public void register5(String id){
    System.out.println(id); //
}

// case 6 : 객체 데이터 + Annotation 없음
@PostMapping("/register6")
public void register6(UserRegister userRegister){
    System.out.println(userRegister); //
}

 

|  결과

  x-www-form-urlencoded json
단일 객체 단일 객체
요청 ) id=test1234 id=test1234&pwd=1234 {
    "id":"test1234"
}
{
     "id": "test1234",
     "pwd":"1234"
@RequestParam test1234 400 에러** 400 에러* 400에러****
@RequestBody id=test1234 415 에러*** {
    "id":"test1234"
}
UserRegister(id=test1234, pwd=null)
Annotation 없음 test1234 com.example.demo.dto.UserRegister@498727e7 null com.example.demo.dto.UserRegister@498727e7

*400 : Required request parameter 'id' for method parameter type String is not present

**400 : Required request parameter 'userRegister' for method parameter type UserRegister is not present

***415 : Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

****400 : Required request parameter 'userRegister' for method parameter type UserRegister is not present

 

|  정리

- @RequestParam은 x-www-form-urlencoded 타입의 단일 변수 값을 읽어올 수 있다.

- @RequestBody는 json 타입의 단일 또는 객체 값을 읽어올 수 있다.

  x-www-form-urlencoded json
단일 객체 단일 객체
사용방식
@RequestParam 또는
Annotaion 미사
Annotation 미사용 @RequestBody @RequestBody 또는
Annotaion 미사