[Spring] @RequestBody & @ResponseBody 어노테이션

0. 비동기(Asynchronous) 통신

0.1 동기(Synchronous)

동기식 통신 및 동기식 프로그래밍이란 Request를 보내면 얼마나 시간이 걸리든 Response를 받기 전까지 기다리는 방식을 말한다. 즉, Request를 보낸 Thread는 Response를 받기 전까지 아무것도 하지 않는 'Block' 상태가 됨을 의미한다.

이러한 방식은 Request와 Response 값의 순서를 보장하고, Request에 대한 처리 결과를 보장받을 수 있다는 장점이 있다. 하지만 단점으로는 Response가 지연되게 된다면 Request를 보낸 Thread는 무작정 기다리기만 한다는 것이다. 그렇게 되면 정작 Thread를 써야 할 때 Response를 기다리느라 쓰지 못하는 경우가 발생할 수 있다.

0.2 비동기(Asychronous)

비동기식 통신 및 비동기식 프로그래밍이란 동기식과는 반대로 Request를 보내더라도 Response를 기다리지도 않고 상관하지도 않는다. 이 경우에는 Thread가 마냥 Response를 기다리지 않으니 다른 일을 처리할 수 있다. Request를 보내고도 Response를 기다리지 않고 다른 일을 할 수 있는 이러한 상태를 'Non Block' 상태라고 부른다.

Response를 기다리지 않기 때문에 통신의 성능(속도)적인 면에 있어선 비동기식이 우세하지만, 순서를 보장하지 않기 때문에 Response에 대한 처리 결과를 보장받아야 하는 서비스에는 적합하지 않는다. 따라서 진행하고자 하는 서비스에 맞게 동기식과 비동기식 중 어떤 걸 사용할지 선택해야 한다.

0.3 Ajax란?

Ajax비동기 자바스크립트와 XML을 활용하여 빠르게 동작하는 웹 페이지를 만드는 개발 기법을 말한다.
Ajax는 웹 페이저 전체를 다시 로딩하지 않고도, 웹 페이지의 일부분만을 갱신할 수 있다.(비동기성) 또한, Json, XML, HTML, 텍스트 파일 등의 다양한 형태의 데이터를 주고 받을 수 있다. Ajax는 아래와 같은 작업을 할 수 있게 해준다.

  • 페이지의 새로 고침 없이 서버에 요청

  • 서버로부터 데이터를 받고 작업을 수행

0.4 JSON이란?

JSON(JavaScript Object Notation)은 Javascript 객체 리터럴(literal) 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다. 경량하다는 특징 덕분에 웹 애플리케이션에서 데이터를 전송할 때 일반적으로 사용하며, 저장할 때도 사용한다. XML형식에 비해 필요한 구조가 적고 Key : Value로 보통 존재한다.

{
  "employees": [
    {
      "name": "Suran",
      "lastName": "Kim"
    },
    {
      "name": "Seung",
      "lastName": "Baik"
    }]
  "email": "[email protected]", ...
}

위와 같이 Key값이나 문자열은 항상 " "(큰따옴표)를 이용하여 표기해야 한다. 또, 배열(Array)의 경우 [ ]을 이용하여 표현한다.

개별 JSON 객체의 경우 .json 확장자를 가진 단순 텍스트 파일에 저장할 수 있고, MIME타입application/json이다.

1. @RequestBody와 @ResponseBody 어노테이션

보통 웹에서 화면 전환(새로 고침) 없이 이루어지는 동작들은 대부분 비동기식 통신으로 이루어진다. 비동기식 통신을 하기 위해선 클라이언트든 서버든 메시지의 본문에 데이터를 담아 보내야 한다. 이 때, 요청과 응답에 따라 각각 '요청 메시지'와 '응답 메시지'로 불리고, 그 메시지 안의 본문(Body) 부분을 RequestBody(요청 본문)와 ResponseBody(응답 본문)으로 부른다. 웹 상에서는 이 Body 부분에 들어가는 것들 중 가장 많이 쓰이는 형식이 JSON형식이다.

@RequestBody : HTTP Body 안에 JSON을 VO에 Mapping하는 어노테이션

@RequestMapping(value = "/requestBodyTest.do") 
public String requestBodyTest(@RequestBody UserVO vo) throws Exception {
	return "test/login"; 
}

HTTP 요청 Body를 자바 객체로 Conversion해준다. 그냥 변환되는 것이 아니라 HttpMessageConverter에서 Request Header(요청 헤더)에 있는 Content-Type을 확인하고, JSON을 컨버팅 할 수 있는 컨버터(Jackson2ObjectMapperBuilder)를 선택해서 사용한다. 이 과정을 거쳐 요청 Body에 담긴 데이터는 자바 객체로 변환된다.
cf) Jackson2ObjcetMapperBuilder는 스프링부트에서 JacksonAutoConfiguration 클래스에서 자동으로 설정되므로 별다른 설정 없이도 JSON을 자바 객체로 변환하는 ObjectMapper를 사용할 수 있다.

@ResponseBody : VO객체를 JSON으로 바꿔 HTTP Body 안에 담는 어노테이션

@ResponseBody 
@RequestMapping(value = "/responseBodyTest.do") 
public UserVO responseBodyTest() throws Exception { 
  UserVO vo = new UserVO(); 
  vo.setId("테스트"); 
  
  return vo; 
}

요청한 형태에 맞춰 메시지 변환기를 통해 결과값을 반환한다.
@ResponseBody를 이용하면 자바 객체를 HTTP ResponseBody에 넣어 전송할 수 있다.





Link

https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-%EB%B9%84%EB%8F%99%EA%B8%B0Async%ED%86%B5%EC%8B%A0-%EB%8F%99%EA%B8%B0Sync%ED%86%B5%EC%8B%A0,
https://sudo-minz.tistory.com/21,
https://velog.io/@ym1085/JSON-%EC%82%AC%EC%9A%A9%EB%B2%95,
https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/JSON,
https://developer.mozilla.org/ko/docs/Web/Guide/AJAX/Getting_Started,
https://truecode-95.tistory.com/113,
https://medium.com/webeveloper/reqeustbody%EC%99%80-responsebody-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C-2efcab364edb#,

좋은 웹페이지 즐겨찾기