스트림이란?

2023년 6월 12일

스트림은 자바에서도 사용되지만 이 경우에는 Web API로써 Stream 이 무엇인지에 대해서 다룬다.
stream은 기본적으로 데이터의 입출력이 원활하게 이루어질 수 있게끔 네트워크를 통해 전송된 데이터 스트림에 접근하여 데이터를 다루는 API에 해당한다.
streaming의 예시는 Youtube를 예시로 생각해볼 수 있다. Youtube로 영상을 시청할 때 인터넷이 느릴 경우 영상의 모든 시간이 로딩이 되지 않고 천천히 늘어나는 모습을 볼 수 있을 것이다. 이러한 현상이 일어나는 이유는 네트워크를 통해 받은 리소스, Raw Data를 Bit 단위로 잘게 나눠서 처리할 수 있게끔 만들어 전송하기 때문이다.
이렇듯 작은 단위로 Bit를 나눠서 데이터를 전송하는 방식의 장점은 Stream의 시작 또는 종료를 감지할 수 있다는 것과 여러 Stream을 엮어 에러를 처리하거나 필요한 부분에서 취소할 수 있다는 것입니다.
Stream의 주요한 기본 사용법은 fetch request를 통해서 정상적으로 응답된 데이터를 ReadableStream로 변환하여 관련된 API를 통해서 전송된 데이터를 다루는 방식으로 사용이 된다.

ReadableStreams

스트림에 대해서 다룰 때 데이터 소스를 어디에서 갖고 오는지가 중요하다. 지금 하려는 웹에서는 데이터를 네트워크 또는 도메인의 다른 위치에 있는 곳에서 불러오게 된다. 이 경우 소스를 갖고 오는 경우가 두 가지로 나뉘게 된다.
  • Push source, 데이터 입력, 전송 소스에 접속, 접근할 때 데이터를 지속적으로 전송하며 이러한 접속 또는 접근의 시작과 일시 정지 또는 취소를 하는 것은 사용자에게 달려 있다. ex) video stream, TCP/Web sockets
  • Pull source, 데이터 출력, 갖고 오기 연결된 후 데이터를 갖고 오기 위해서는 데이터를 명시적으로 요청해야 한다.
![[./stream.png]] 위와 같이 전달된 데이터는 청크, Chunk라고 하는 작은 조각으로 나뉘어 순차적으로 읽히게 됩니다. 청크의 종류는 다양한데 단일 바이트로 구성되어 있을 수도 있고 특정 크기로 입력된 배열과 같이 더 큰것일 수도 있습니다. 단일 스트림에는 한 가지 청크만 존재하는 것이 아닌 서로 다른 크기와 다른 유형의 청크가 포함될 수 있습니다.
여기서 스트림내에 청크가 대기열 처럼 자기의 순서를 기다리고 있다는 것은 큐의 데이터 저장과 출력의 방식으로 스크림내에서 대기하고 있는 청크들은 자신의 차례를 기다리고 있다 자신의 차례가 될 경우 출력되는 형식으로 사용됩니다.