본문 바로가기

Dev.BackEnd/Java

@RequestBody, @ResponsBody, @RequestParam @PathVariable 차이점 비교

클라이언트가 서버쪽으로 데이터를 전달한다.

1. 클라이언트쪽에서는 일반적으로 json으로 데이터를 서버로 보내고 서버는 json데이터를 받아서 자바객체로 만들어 데이터를 읽어야 한다.

2. 서버는 읽은 데이터를 다시 json타입으로 만들어 클라이언트로 데이터를 return시켜줘야 한다.

 

@RequestBody

정의:

애너테이션의 역할은 클라이언트가 보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환하는 것입니다. HTTP 요청 본문 데이터는 Spring에서 제공하는 HttpMessageConverter를 통해 타입에 맞는 객체로 변환해준다.

 

HTTP 요청의 바디내용을 통째로 자바객체로 변환해서 매핑된 메소드 파라미터로 전달해준다. 

 

1번과 같은 상황에서 서버가 json데이터를 자바객체로 읽을 수 있게 도와주는 기능이 @RequestBody이다.

한 예로, 서버에서 Map으로 json데이터를 받고 싶을 때, requestBody를 사용하여 제이슨 데이터를 자바객체로 받아서 읽을 수 있다.

ajax로 제이슨형태의 aaa가 hello인 값과 bbb가 them인값을 서버로 넘기려 한다.

contentType: 'application/json'을 추가한 후에 

 

이런 에러가 났다. json타입에 대한 에러 인듯 하다.

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unrecognized token 'aaa': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'aaa': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')

 

 

그래서 2번 째 방법(json.stringify)으로 해야 서버에서 map으로 받을 수 있었다.

 

내 결론: reqeustbody는 클라이언트에서 제이슨문자열로 보낸걸 자바객체로 변경시켜주는 것

(json.stringfy로 보낸 데이터를 서버에서 map으로 받을 때 requestbody사용

    //JS
    function test() {
	*1: 에러
        com.requestAjax({
            type: "POST",
            url : "/pricing2",
            params : {
                "aaa" : 'hello',
                "bbb" : "them",
            },
        },function(data){
            console.log("data" , data);
        });

	*2: 성공
        const params = {
            "aaa" : 'hello',
            "bbb" : "them",
        }
        com.requestAjax({
            type: "POST",
            url : "/pricing2",
            contentType: 'application/json',
            data: JSON.stringify(params),
        },function(data){
            console.log("data" , data);
        });
    }
    
    //자바
    @RequestMapping(value="/pricing2")
    @ResponseBody
    public Map<String,Object> price2 (@RequestBody Map<String,Object> map)
    {

        logger.info(">>>>>>>>>>>>>>>>>getLoginId : " + map);
//        logger.info(">>>>>>>>>>>>>>>>>getPassword : " + user.getPassword());

        return map;
    }

 

@ResponsBody

정의: 자바객체를 HTTP요청의 바디내용으로 매핑하여 클라이언트로 전송한다.

즉, @Responsebody 어노테이션을 사용하면 http요청 body를 클라이언트가 자바 객체로 전달받을 수 있다.

 

서버에서 데이터를 제이슨데이터로 return시킬 때 사용한다.

보통 ajax로 호출되었을 때 데이터를 조회해서 다시 클라이언트로 보낼 때 사용된다.

 

ajax로 pricing2를 호출하면 404 에러가 난다. return user에서 스프링은 return에서 다 뷰라고 생각해 뷰페이지나 타일즈를 찾게 된다. 이때 @ResponsBody를 해주면 문자열 그대로 반환을 해준다. 그렇기 때문에 ajax로 요청시 return으로 user.getloginId와 password로 포함된 User객체를 success로 받을 수 있게 된 것 이다.

    @RequestMapping(value="/pricing2")
    public User price2 (User user)
    {
        logger.info(">>>>>>>>>>>>>>>>>getLoginId : " + user.getLoginId());
        logger.info(">>>>>>>>>>>>>>>>>getPassword : " + user.getPassword());

        return user;
    }
    
    
    
    
    jsp
        function test() {
        com.requestAjax({
            type: "POST",
            url : "/pricing2",
            params : {
                "loginId" : "hello",
                "password" : "them",
            }
        },function(data){
            console.log("data" , data);
        });
    }

 

 

 

 

@RequestParam @PathVariable 차이점 비교 (수정 2023.09.20)

***posttype으로 ajax를 사용하는데 데이터를 json형식으로 서버에 보냈을 때 requestparam을 굳이 안해도 보내는 변수와 매개변수 이름만 같다면 받아졌다. 당연히 requestparam을 해도 값은 받아졌다. 그럼 requestparam은 왜쓰는거지? 의문이 생겨 찾아보게 되었다.

 

 

1. requestparam은 포스트 타입의 form형식으로 데이터를 보냈을 때 값을 받기 위해 쓴다.

한예로 form에 name이 goodsData이고 value안에 스크립트로 params = {id : 1, goodsordedrId: 2,..} 이런식으로 객체를 json stringfy로 변환해서 서버로 보내고 서버에서

<form name="frm" action="" method="POST">
<input type="hidden" name="goodsOrderDetailData" id="goodsOrderDetailData" value="">
</form>
@RequestParam(value ="goodsOrderDetailData", required = true

requestparam을 붙여줘야 데이터를 받을 수 있었다.

 

 

2. postmapping에서 key value로된 많은 값을 객체로 만들어 서버에 ajax로 보내고 서버에서는 requestparam을 이용해 map으로 받음

var params = {
"goodsOptionDetailId" : $(".optionDetail").val() ,
"amount" : parseInt($(".amount").val()) ,
"payCycle" : $(".payCycle").val() == null ? 0 : parseInt($(".payCycle").val())
}
console.log( params )

com.requestAjax({
type : "POST",
url : "/product/basket",
data : params
@RequestParam Map<String, Object> map, Auth auth) {

3. get매핑에서 쿼리스트링을 받을 때 사용될 수 있고(검색)

 

 

@RequestParam @PathVariable 차이점: url의 매개변수를 어떻게 전달하느냐에 따라 나뉜다.

controller에서 api를 mapping을 어떻게 함에 따라 다르다.

 

 

ex: 

    @RequestMapping(value="/pricing/{id}")
    public String price (User user, @PathVariable long id)
    {
        logger.info(">>>>>>>>>>>>>>>>>");

        return "front:pricing";
    }
    @RequestMapping(value="/pricing2")
    public User price2 (User user, @RequestParam long id)
    {
        logger.info(">>>>>>>>>>>>>>>>>getLoginId : " + user.getLoginId());
        logger.info(">>>>>>>>>>>>>>>>>getPassword : " + user.getPassword());

        return user;
    }

또한 requestparam에는 defualtvalue가 있어 null값으로 들어왔을 때 default값을 설정 할 수 있다.

예로 page같은거 값이 안넘오왔을 땐 자동으로 1페이지로 가는것을 생각해보면 된다.

 

 

 

 

 

 

 

 

 

 

참고: https://cheershennah.tistory.com/179

 

[Spring] @RequestBody / @ResponseBody 어노테이션 이란?

스프링에서 비동기 처리를 하는 경우 @RequestBody , @ResponseBody를 사용한다. 비동기 처리를 위해 이 어노테이션들은 어떻게 작동할까? 클라이언트와 서버의 비동기 통신 클라이언트에서 서버로 통

cheershennah.tistory.com

https://willbesoon.tistory.com/102

 

@RequestParam @PathVariable 차이점 비교

웹 개발에서는 http의 비연결성으로 인해 데이터를 전달해줄 여러가지 방법들이 있어왔습니다. 예전에는 쿠키도 있었고 세션도 있었고 여러가지 방법들이 있었는데요. 스프링에서도 두 가지의

willbesoon.tistory.com

https://cheershennah.tistory.com/179

 

[Spring] @RequestBody / @ResponseBody 어노테이션 이란?

스프링에서 비동기 처리를 하는 경우 @RequestBody , @ResponseBody를 사용한다. 비동기 처리를 위해 이 어노테이션들은 어떻게 작동할까? 클라이언트와 서버의 비동기 통신 클라이언트에서 서버로 통

cheershennah.tistory.com