ResponseEntity클래스에서 상태 코드를 반환하는 것과 데이터를 받아오거나 보낼 때 사용하는 @RequestBody, @ResponseBody를 공부하면서 데이터(JSON)가 어떤 방식으로 url을 통해 전송이 되는지 궁금해지기 시작해서 공부해보았다.
HTTP
- Hyper Text Transfer Protocol
- 하이퍼텍스트(HTML) 문서를 교환하기 위해 만들어진 protocol(통신규약)이다.
- 프론트앤드 서버와 클라이언트간의 통신에 사용된다.
- 또한 백앤드와 프론트앤드 서버간에 통신에도 사용된다.
- HTTP는 TCP/IP 기반으로 되어있다.
HTTP 구조
- HTTP의 통신 방식은 기본적으로 '요청과 응답(request, response)'으로 이루어져 있다.
- 클라이언트가 요청(HttpRequest)을 서버에 보내면 서버는 클라이언트에게 응답(HttpResponse)하는 구조이다.
HTTP Request
HTTP request 메세지는 크게 3부분으로 구성된다.
start line
start line에는 크게 3가지가 나타난다.
- HTTP method
- Request targer
- HTTP Version
1. HTTP method
- 해당 request가 의도한 action을 정의하는 부분
- HTTP Methods 에는 GET, POST, PUT, DELETE, OPTIONS 등이 있음.
- 주로 GET과 POST가 쓰임
2. Request targer
3. HTTP Version
- HTTP 버전
- 1.0, 1.1, 2.0 등의 버전이 있음

- HOST : 요청이 전송되는 target의 host url: 예를 들어, google.com
- User-Agent : 요청을 보내는 클라이언트의 대한 정보 : 예를 들어, 웹브라우저에 대한 정보
- Accept : 해당 요청이 받을 수 있는 응답(response) 타입
- Connection : 해당 요청이 끝난후에 클라이언트와 서버가 계속해서 네트워크 커네션을 유지할 것인지 아니면 끊을 것인지에 대한 지시
- Content-Type : 해당 요청이 보내는 메세지 body의 타입. 예를 들어, JSON을 보내면 application/json
- Content-Length: 메시지 body의 길이
body
- 해당 request의 실제 메세지/내용
- Body가 없는 request도 많다
- GET request들은 대부분 body가 없는 경우가 많음.
HTTP Response
HTTP Response도 HTTP Request와 마찬가지로 크게 3부분으로 구성되어있다.
status line
Response의 상태를 간략하게 나타내주는 부분
- HTTP 버전
- Status code: 응답 상태를 나타내는 코드, 숫자로 되어있는 코드 예를 들어, 200
- Status text : 응답 상태를 간략하게 설명해주는 부분. 예를 들어, "Not Found"
사람이 코드만 보면 잘 모를수있어서 텍스트로 보여줌.
HTTP/1.1 404 Not Found
- Requesg의 headers와 비슷함.
- response에서만 사용되는 header 값들이 있다.
body
- Request의 body와 비슷함.
- Request와 마찬가지로 모든 response에 body가 있지는 않음.
- 데이터를 전송할 필요가 없을 경우 body가 비어있음.
@RequestBody, @ResponseBody Annotation
-
Spring에서는 @RequestBody, @ResponseBody 어노테이션을 명시함으로써 MessageConverter를 통한 데이터 변환 과정을 거치게 된다.
-
클라이언트에서 서버에 JSON 형식의 requestBody로 요청 데이터를 전송했을 때, Java에서는 해당 JSON 형식의 데이터를 받기 위해서 JSON -> Java Object로의 변환이 필요
-
데이터를 JPA를 이용해 DB에 보낼 때 JSON형식이 아닌 Java Object로 변환하여 보내야함(데이터를 Entity로 변환시켜 Repository를 이용하여 DB로 데이터 전달하기 때문에)
@RequestBody
- JSON 형식 -> Java Object (convert)
- @RequestBody 어노테이션은 HttpRequest의 본문 requestBody의 내용을 자바 객체로 매핑하는 역할을 합니다.
- 클라이언트의 요청이 들어왔을 때, DispatcherServlet에서는 먼저 해당 HttpRequest의 미디어 타입을 확인하고, 타입에 맞는 MessageConverter를 통해 요청 본문인 requestBody를 통째로 변환해서 메서드로 전달해주게 됩니다.
@PostMapping("/api/articles")
public Article create(@RequestBody ArticleForm dto) {
Article article = dto.toEntity();
return articleRepository.save(article);
}
게시글을 추가시키는 메서드이다. 데이터를 받아올 때 ArticleForm이라는 DTO 클래스로 JSON형식이 아닌 Java Object로 변환하여 받아온다.
@ResponseBody
- Java Object -> JSON 형식
- @ResponseBody 어노테이션은 자바 객체를 HttpResponse의 본문 responseBody의 내용으로 매핑하는 역할을 합니다.
- @RestController 어노테이션에는에는 @Controller와 @ResponseBody 둘다 포함
- 따라서 @RestController 어노테이션을 명시했다면 따로 @ResponseBody 어노테이션을 명시하지 않아도 자동으로 HttpResponse의 본문 responseBody에 자바 객체가 매핑
References (참고 자료)
https://velog.io/@mokyoungg/HTTP-HTTP-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%ED%95%B5%EC%8B%AC-%EC%9A%94%E3%85%85
https://wildeveloperetrain.tistory.com/144