우선 Node.js 공식문서 Buffer
정의
Buffer
이다.Buffer
클래스는 TCP 스트림, 파일 시스템 작업에서의 octet 스트림과의 상호작용을 가능하게 하기 위해서 Node.js API의 일부로 도입되었다.Buffer
의 크기는 생성시 설정되며 변경될 수 없다.Buffer
클래스는 글로벌 스코프에 있으므로 require('buffer')
를 사용할 필요가 없다.=> Buffer
클래스는 이진 데이터(Binary Data)들의 스트림을 직접 다루기 위해 Node.js API에 추가되었다.
컴퓨터는 이진수로 데이터를 저장하고 표현한다. 1100, 101100 등 0과 1로만 표현될 수 있으며, 각각 이진수에서 1 혹은 0으로 되어있는 자리를 비트(Bit)라고 부른다. Bit = Binary digiT의 약자
따라서 컴퓨터가 어떤 데이터를 저장하거나 표현하기 위해서, 모든 데이터를 이진수로 변환해야 한다.
10진수 숫자는 이진수로 바꿔 주어야하고, 문자열의 경우에도 유니코드나, 아스키코드를 이용해 이진수로 바꾸어야만 저장할 수 있다.
Node.js 에서의 스트림은 한 지점에서 다른 지점으로 이동하는 일련의 데이터를 의미한다. 만약 우리가 어떤 방대한 양의 데이터를 처리해야 할 때, 모든 데이터가 전부 다 사용가능 할 때까지 기다리지 않아도 된다는 것을 의미한다.
기본적으로 큰 데이터는 청크(Chunk)단위로 세분화되어 전송된다.
우리는 데이터들의 스트림(Stream)이란 일련의 데이터들이 한지점에서 다른 지점으로 이동하는 것이라고 배웠다.
일반적으로 데이터의 이동은 그 데이터를 가지고 작업을 하거나, 그 데이터를 읽거나, 어떤 작업을 할 때 발생한다.
만약에 어떤 작업이 데이터를 처리하는 시간보다 데이터가 도착하는 게 더 빠르다고 가정해보자. 미리 도착한 데이터는 어디에선가 처리되기를 기다리고 있어야 할 것이다.
반대로 어떤 작업이 데이터를 처리하는 시간이 데이터가 도착하는 것보다 빠르다고 가정해보자. 이 경우에도 어느 정도의 데이터량이 쌓일 때까지 기다려야한다. (버퍼링이 걸리는 상황)
=> 즉 도착한 데이터들이 처리되기를 기다리는 영역이 Buffer
이다.
만약 유튜브를 볼 때 인터넷 연결상태가 좋다면 이것은 상기의 1번 상황이다. 영상이 끊김없이 재생될 것이다. 데이터를 처리(영상을 보여주는 것보다)하는 것보다 데이터가 도착(데이터를 다운로드)하는 것이 빠르기 때문에 도착한 데이터들은 다른 데이터가 다 처리될 때까지 Buffer
에서 대기해야 할 것이다.
반면 인터넷 연결상태가 좋지 않다면 2번 상황이다. 데이터의 처리가 데이터의 도착보다 빠르다면 우리는 데이터가 어느정도 모일 때까지(다시 영상을 보여줄 수 있을 때까지) 기다려야 할 것이다.(이것이 버퍼링) 이 때 데이터들이 어느정도 모일 때 까지 기다리는 곳이 Buffer
이다.
Node.js는 Streaming하는 동안 자동으로 Buffer
를 만든다. 데이터가 Buffer
에 있는동안 우리는 Streaming 되는 이진 데이터들을 조작하고 다룰 수 있다.
Buffer를 다룰 수 있는 메소드는 Node.js 공식문서를 확인
참조 : https://tk-one.github.io/2018/08/28/nodejs-buffer/
Buffer.concat()
이나 toString()
메소드를 사용해야 한다는 것을 알 수 있었다. 다만 아직 포스팅 할 만큼 관련 레퍼런스를 많이 읽은 것도 아니고해서 자신이 없네... 다음주에는 관련한 내용을 스프린트에서 배우려나. 찾다보니 모르는 개념이 너무 많아서 당황스럽다;; Writable, Readable한 것의 의미나 Stream의 의미를 정확히 알지는 못하지만 하다보면 자연스러워지겠지.
아하! 그래서 request에 on 이벤트 리스너로 'data'를 지정하는 까닭이 buffer때문이었군요ㅎㅎ
저는 데이터 그자체가 배열인데 배열을 또 왜 push, concat하냐 했거든요ㅋㅋ
그게 아니라 들어온 비트 값 하나하나 추가하는 과정이었고 그 과정이 다 끝났다는 건 'end'에서 보장할 수 있으니 이때 바이너리 데이터를 변환하는 과정을 넣는 거군요!
덕분에 이해하고 갑니다:)