먼저 HTTP통신에 대해 간단히 설명하고 넘어가고자 한다.
HTTP
HyperText Transfer Protocol
- 하이퍼텍스트(HTML) 문서를 교환하기 위해 만들어진 protocol(통신 규약).
- 즉 웹상에서 네트워크로 서버끼리 통신을 할때 어떠한 형식으로 서로 통신을 하자고 규정해 놓은 "통신 형식" 혹은 "통신 구조" 라고 보면 된다.
프론트앤드 서버와 클라이언트간의 통신에 사용된다.
또한 백앤드와 프론트앤드 서버간에의 통신에도 사용된다. - HTTP는 TCP/IP 기반으로 되어있다.
- HTTP 기본적으로 request(요청)/response(응답) 구조로 되어있다.
클라이언트가 HTTP request를 서버에 보내면 서버는 HTTP response를 보내는 구조
클라이언트와 서버의 모든 통신이 요청과 응답으로 이루어 진다.
아래 내용은 HttpRequest의 예시다.
// start line
POST /payment-sync HTTP/1.1
// headers
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3
// body (JSON 형식)
{
"id": "test0101",
"email": "test0101@gmail.com",
"address": "google"
}
위 예시를 보면 HttpRequest는 start line, headers, body 세 부분으로 나누어져 있는데, HttpResponse 역시 비슷하게 status line, headers, body 세 부분으로 나누어져 있다.
여기서 주목해 봐야 하는 부분이 바로 body다. 앞서 살펴봤던 클라이언트와 서버 간의 HTTP 통신에서 요청과 응답을 보낼 때, 필요한 데이터를 담아서 보내는 공간이 바로 body이기 때문.
이때 요청하는 요청 본문을 requestBody, 응답하는 응답 본문을 responseBody라고 한다. 본문에 담기는 데이터 형식은 여러 가지가 있지만 가장 대표적으로 사용되는 것이 JSON이며, xml 형식도 사용된다.
@RequestBody, @ResponseBody
Spring에서는 @RequestBody, @ResponseBody 어노테이션을 명시함으로써 MessageConverter를 통한 데이터 변환 과정을 거치게 된다.
예를 들어서 클라이언트에서 서버에 JSON 형식의 requestBody로 요청 데이터를 전송했을 때, Java에서는 해당 JSON 형식의 데이터를 받기 위해서 JSON -> Java Object로의 변환이 필요하다.
마찬가지로 요청된 데이터를 처리 후, 서버에서 클라이언트로 다시 응답 데이터 responseBody를 보낼 때도 Java Object에서 JSON 또는 XML 같은 형식으로의 변환이 필요한데, 이러한 과정을 해당 어노테이션들이 처리해주는 것입니다.
@RequestBody 란?
HttpRequest의 본문 requestBody의 내용을 자바 객체로 매핑하는 역할을 한다. 해당하는 어노테이션이 붙어있는 메서드로 클라이언트의 요청이 들어왔을 때, DispatcherServlet에서는 먼저 해당 HttpRequest의 미디어 타입을 확인하고, 타입에 맞는 MessageConverter를 통해 요청 본문인 requestBody를 통째로 변환해서 메서드로 전달해준다.
이때 주의할 점으로는 일반적인 GET 메서드의 요청 경우에는 HttpRequest의 requestBody로 요청 데이터가 전달되는 것이 아니라, URI 또는 URL의 파라미터로 전달되기 때문에 @RequestBody 어노테이션을 통해 해당 요청 내용을 받을 수가 없다.
GET 메서드의 경우 @PathVariable, @RequestParam 등의 어노테이션을 통해서 요청을 전달받아야 한다.
@ResponseBody 란?
@ResponseBody 어노테이션은 자바 객체를 HttpResponse의 본문 responseBody의 내용으로 매핑하는 역할을 한다.
해당 어노테이션 마찬가지로 return Type에 맞는 MessageConverter를 통해 return 하는 객체를 해당 타입으로 변환해서 클라이언트로 전달하게 된다.
위 예시 코드를 보면 @ResponseBody가 생략되었는데, 그 이유는 Controller에 붙은 @RestController 때문입니다.
아래 @RestController 어노테이션을 살펴보면 @Controller와 @ResponseBody가 둘 다 붙어있는 것을 볼 수 있다.
이처럼 @RestController 어노테이션을 명시했다면 따로 @ResponseBody 어노테이션을 명시하지 않아도 자동으로 HttpResponse의 본문 responseBody에 자바 객체가 매핑되어 전달된다.
정리하자면, 클라이언트에서 서버로 필요한 데이터를 요청하기 위해 JSON 데이터를 요청 본문에 담아서 서버로 보내면, 서버에서는 @RequestBody 어노테이션을 사용하여 HTTP 요청 본문에 담긴 값들을 자바객체로 변환시켜, 객체에 저장한다.
서버에서 클라이언트로 응답 데이터를 전송하기 위해 @ResponseBody 어노테이션을 사용하여 자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송한다.
'program > Java, Spring' 카테고리의 다른 글
[Spring Boot] 회원 관리 예제 - 백엔드 개발 (0) | 2023.10.15 |
---|---|
[Spring Boot] 스프링 웹 개발 기초③ - API (0) | 2023.07.07 |
[Spring Boot] 스프링 웹 개발 기초② - MVC와 템플릿 엔진 (0) | 2023.07.07 |
[Spring Boot] 스프링 웹 개발 기초① - 정적 컨텐츠 동작 (0) | 2023.07.06 |
[Spring boot] Welcome page 만들기 (view 환경설정) (0) | 2023.07.06 |