Spring/Spring icia 48일차

IntelliJ @RequestBody @ResponseBody

swkn 2023. 5. 1. 17:05

1. 사용처

Spring에서 비동기 처리를 하는 경우 @RequestBody와 @ResponseBody를 사용한다.

 

2. 클라이언트와 서버의 비동기 통신처리

웹에서 이루어지는 데이터 통신은 클라이언트(Client)와 서버(Server)간에서 이루어지는데 , 

예를 들어 로그인 버튼을 누르면 입력한 아이디와 비밀번호 값이 서버로 넘어가 판단을 요청(Request)한다.

그러면 서버에서 이를 판단해 로그인을 허용할 것인지 결정을 한 후 클라이언트에 응답(Response)을 해준다.

즉 , 클라이언트에서 서버로 통신하는 메시지를 요청 메시지라고 하고 ,

서버에서 클라이언트로 통신하는 메시지를 응답 메시지라고 한다.

 

비동기 통신이란 화면전환 ( F5 , Refresh 등 ) 없이 이루어지는 동작을 말하는데 , 

비동기 통신을 사용하지 않는다면 회원가입을 할 때 이름 , 아이디 , 비밀번호 , 전화번호 , 주소 등을 입력하고

아이디 중복 버튼을 누를때 서버에서 응답하면 Refresh되어 입력한 값들이 모두 사라질 것이다.

이럴 때 비동기 통신을 사용해 요청과 응답을 받는다.

 

비동기 통신을 하기 위해선 요청메시지와 응답메시지를 본문(Body)에 담아 보내야 하는데

여기서 요청 본문(RequestBody) , 응답본문(ResponseBody)라는 단어가 만들어졌다.

 

3. 본문에 담겨야 하는 데이터 형식

가장 많이 사용하는 것은 JSON ( Javascript Object Notation ) 이다.

 

JSON ( Javascript Object Notation ) 은 속성-값-쌍 ( Attribute - value pair and array data types ( or any other serializable value )) 또는 키- 값 쌍 으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 비동기 브라우저/서버 통신 ( AJAX ) 을 위해 , 넓게는 XML ( AJAX가 사용 ) 을 대체하는 주요 데이터 포맷이다. 특히 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다.

자료의 종류에는 큰 제한이 없으며 , 특히 컴퓨터 프로그램의 변수값을 표현하는데 적합하다.

즉 , 비동기 클라이언트 서버 통신을 위해서 데이터를 전송하는데 JSON이라는 형식의 데이터를 서버와 클라이언트 서로서로에게 전송하는 것이다.

 

@RequestBody 어노테이션을 이용해 요청 본문에 담긴 값을 자바 객체로 Conversion 한다 . 일반적으로는 HttpServletRequest를 이용해 데이터를 가지고 오면 굳이 @RequestBody 어노테이션을 사용하지 않아도 된다.

하지만 VO 나 DTO 를 사용해 데이터를 받으려면 @RequestBody 어노테이션을 사용해 데이터를 Conversion 해주어야 한다.

이후 Java Object를 JSON 데이터로 응답해주는 @ResponseBody를 사용해 응답을 해준다.

<script>
  const ajax10 = () => {
    const member = {
      "memberEmail": "aaa@aaa.com",
      "memberPassword": "abcdef1234!#$%",
      "memberName": "회원1"
    }
    $.ajax({
      type: "post",
      url: "/ajax_10",
      // js object를 JSON으로 변환
      data: JSON.stringify(member),
      // 서버에게 보내는 데이터의 타입을 지정
      contentType: "application/json",
      success: function (res) {
        console.log("요청성공",res);
        // member에 담긴 이름 접근
        console.log("name",res.member.memberName);
        for ( let i in res.member.memberList) {
          console.log(res.memberList[i]);
        }
      },
      error: function () {
        console.log("요청실패");
      }
    });
  }
</script>

결론으로는 클라이언트에서 서버로 데이터를 전송할 때에 JSON형태로 데이터를 만들어 요청하면 서버에서는 @RequestBody 어노테이션을 이용해 HTTP 요청 본문에 담긴 값들을 자바 객체로 변환시켜 , 객체로 저장시킨다.

서버에서 클라이언트로 데이터를 전송할 때에는 자바 객체를 JSON 형태의 데이터로 변경해 응답을 한다.

즉 , @ResponseBody를 이용해 자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송시킨다.