스프링에서 비동기 처리를 하는경우 @RequestBody와 @ResponseBody를 사용한다.
위 어노테이션을 사용하는 이유와 비동기 처리에 대해 포스팅 해 보겠다.
클라이언트와 서버의 비동기 통신처리
- 웹에서 이루어 지는 데이터 통신은 클라이언트(Client)와 서버(Server)간에서 이루어 진다. 예를들어 로그인 버튼을 누르게 되면 입력한 아이디와 비밀번호값이 서버로 넘어가 판단을 요청(Request)한다 서버에서 이를 판단 해 로그인을 시킬지 말지 결정을 한 후 클라이언트에 응답(Response)을 해준다.
- 여기서 중요한 포인트가 요청(Request)과 응답(Response)이다. 즉, 클라이언트에서 서버로 통신하는 메시지를 요청메시지라고 하고, 서버에서 클라이언트로 통신하는 메시지를 응답 메시지 라고 한다.
- 비동기 통신이란 화면전환(Refresh, F5)없이 이루어 지는 동작들을 말한다.
- 굳이 비동기 통신을 이용해야 하나? 라고 생각할 수 있다. 예를들어 우리가 회원가입을 한다고 가정해 보자 이름, 아이디, 비밀번호, 전화번호, 주소 등등을 모두 입력하고 아이디 중복 버튼을 누를때에 서버에서 응답 후 Refresh되어 입력한 값들이 모두 사라진다면 아주 곤란할 것이다. 이럴때에 비동기 통신을 이용해 요청과 응답을 하는것이다.
- 비동기 통신을 하기 위해서는 요청메시지와 응답메시지를 본문(Body)에 담아 보내야 한다. 여기서 요청본문(RequestBody), 응답본문(ResponseBody)라는 단어가 만들어 진다.
- 그렇다면 본문에 담겨야 하는 데이터 형식은 무엇일까???
- 요즘 가장 많이 사용하는 대표적인 것이 바로 JSON(Javascript Object Notation)이다.
- 즉, 비동기 클라이언트 서버 통신을 위해서 데이터를 전송하는데 JSON이라는 형식의 데이터를 서버와 클라이언트 서로서로에게 전송하는 것이다.
요청 본문에 담긴 값을 자바 객체로 Conversion
- @ReqeustBody 어노테이션을 이용해 요청본문에 담긴 값을 자바 객체로 Conversion한다. 일반적으로 HttpServletRequest를 이용해 데이터를 가지고오면 굳이 @ReqeustBody 어노테이션을 사용하지 않아도 된다. 하지만 VO나 DTO를 사용해 데이터를 받으려면 @RequestBody 어노테이션을 사용해 데이터를 Conversion 해주어야 한다.
이후 JAVA Object를 JSON 데이터로 응답해주는 @ResponseBody를 사용해 응답을 해준다.
@RestController
@RequestMapping("/api")
public class HttpMessageController {
/**
* @RequestBody를 통해 자바 객체로 변환할 때 HttpMessageConverter를 사용하여
* 헤더에 담긴 컨텐츠 타입을 보고 어떤 메시지 컨버터를 사용할 것인지 판단하여
* 요청 본문에 담긴 값을 자바 객체로 변환
*/
@GetMapping
@ResponseBody
public ResponseEntity<JsonResponse<Object>> create(@ReqeustBody Event event) {
// 생략
return new JsonResponse<Object>().setBody("JSON data").setStatusCode("S0000").buildResponse(HttpStatus.OK);
}
}
결론
- 클라이언드에서 서버로 데이터를 전송할때에 JSON형태로 데이터를 만들어 요청하면 서버에서는 @RequestBody 어노테이션을 이용해 HTTP 요청 본문에 담긴 값들을 자바 객체로 변환 시켜, 객체에 저장시킨다.
- 서버에서 클라이언트로 데이터는 전송할 때에는 자바 객체를 JSON 형태의 데이터로 변경해 응답을 한다. 즉 @ResponseBody를 이용해 자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송시킨다
'WEB' 카테고리의 다른 글
MsSQL 특정 아이디로 쿼리 합치기 #STUFF #FOT XML PATH (0) | 2022.02.16 |
---|---|
input 입력 제한 하기 #숫자만 입력 #onkeyPress (0) | 2022.02.14 |
[JAVA] DTO vs VO (0) | 2022.02.10 |
[JAVA]Mapper vs DAO (0) | 2022.02.08 |
[JSTL]<c:url>이란 무엇일까? #활용법 #사용이유 (0) | 2022.02.07 |