HTTP에 대하여

윤현우·2022년 12월 3일
0
post-thumbnail

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
  • headers
  • body

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

  • 해당 request가 전송되는 목표 url

3. HTTP Version

  • HTTP 버전
  • 1.0, 1.1, 2.0 등의 버전이 있음

headers

  • 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
  • headers
  • body

status line

Response의 상태를 간략하게 나타내주는 부분

  • HTTP 버전
  • Status code: 응답 상태를 나타내는 코드, 숫자로 되어있는 코드 예를 들어, 200
  • Status text : 응답 상태를 간략하게 설명해주는 부분. 예를 들어, "Not Found"
    사람이 코드만 보면 잘 모를수있어서 텍스트로 보여줌.

HTTP/1.1 404 Not Found

headers

  • 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

profile
개발자가 되는 그날까지

0개의 댓글