청크 인코딩
- HTTP 응답을 한번에 다 만들고 보내는 방식이 아니라, 작은 조각 단위로 나누어 계속 보내는 방식이다.
- 청크 전송 인코딩에서 데이터 스트림은 서로 겹치지 않은 청크로 나눈다.
- 각 청크는 서로 독립적으로 송수신된다.
- 송신자와 수신자 모두 현재 처리 중인 청크 이외의 데이터 스트림에 대해 알 필요가 없다.
- 각 청크 앞에는 해당 청크의 크기가 표시되며, 크기가 0인 덩어리가 수신되면 전송이 종료된다.
- Transfer-Encoding Header 의 chunked 키워드는 청크 단위 전송을 나타냅니다.
일반적인 HTTP 방식의 한계점
보통 HTTP 응답은 다음과 같다.
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 42
{"id":1,"name":"kim","age":20}서버가 응답 본문의 전체 길이를 미리 알고 있다.
서버가 클라이언트에게 → “야! 응답 본문은 42바이트야, 이만큼 받으면 끝이야”
아래와 같이 보통 일반적인 API 응답은 서버가 JSON을 완성한 뒤 한번에 내려보내기 때문이다.
return ResponseEntity.ok(memberDto);그런데, 실시간 기능과 같은 스트리밍은 서버가 전체 길이를 알기 힘들다.
그렇기에 Content-Length를 쓸 수 없다.
이 때 사용하는 것이 청크 인코딩이다.
그래서 청크 인코딩이란
청크 인코딩은 응답 본문을 여러 조각으로 나눈다.
HTTP/1.1 200 OK
Content-Type: text/event-stream
Transfer-Encoding: chunked
Transfer-Encoding: chunked는 전체 응답은 모르니깐 데이터를 조각 단위로 보내겠다.
데이터는 아래와 같이 전송된다.
5
Hello
6
World만약 0을 보낸다면 더 이상 보낼 데이터가 없다는 것이며 접속이 종료된다.
5
Hello
6
World
0 <- 종료출처 및 참고자료
https://developer.mozilla.org/ko/docs/Web/HTTP/Reference/Headers/Transfer-Encoding
https://en.wikipedia.org/wiki/Chunked_transfer_encoding