[TIL] 2020. 07. 05. Buffer

달밤·2020년 7월 5일
1

TIL

목록 보기
61/110
post-thumbnail

오늘 배운 것

Buffer

우선 Node.js 공식문서 Buffer 정의

  1. JavaScript 언어에는 이진데이터 스트림을 조작하거나 읽을 수 있는 방법이 없었다. 이것을 가능하게 하기 위해서 도입한 것이 Buffer이다.
  2. Buffer 클래스는 TCP 스트림, 파일 시스템 작업에서의 octet 스트림과의 상호작용을 가능하게 하기 위해서 Node.js API의 일부로 도입되었다.
  3. Buffer의 크기는 생성시 설정되며 변경될 수 없다.
  4. Buffer 클래스는 글로벌 스코프에 있으므로 require('buffer')를 사용할 필요가 없다.

=> Buffer 클래스는 이진 데이터(Binary Data)들의 스트림을 직접 다루기 위해 Node.js API에 추가되었다.

Binary Data?

컴퓨터는 이진수로 데이터를 저장하고 표현한다. 1100, 101100 등 0과 1로만 표현될 수 있으며, 각각 이진수에서 1 혹은 0으로 되어있는 자리를 비트(Bit)라고 부른다. Bit = Binary digiT의 약자

따라서 컴퓨터가 어떤 데이터를 저장하거나 표현하기 위해서, 모든 데이터를 이진수로 변환해야 한다.

10진수 숫자는 이진수로 바꿔 주어야하고, 문자열의 경우에도 유니코드나, 아스키코드를 이용해 이진수로 바꾸어야만 저장할 수 있다.

Stream?

Node.js 에서의 스트림은 한 지점에서 다른 지점으로 이동하는 일련의 데이터를 의미한다. 만약 우리가 어떤 방대한 양의 데이터를 처리해야 할 때, 모든 데이터가 전부 다 사용가능 할 때까지 기다리지 않아도 된다는 것을 의미한다.

기본적으로 큰 데이터는 청크(Chunk)단위로 세분화되어 전송된다.

Again Buffer

우리는 데이터들의 스트림(Stream)이란 일련의 데이터들이 한지점에서 다른 지점으로 이동하는 것이라고 배웠다.

일반적으로 데이터의 이동은 그 데이터를 가지고 작업을 하거나, 그 데이터를 읽거나, 어떤 작업을 할 때 발생한다.

  1. 만약에 어떤 작업이 데이터를 처리하는 시간보다 데이터가 도착하는 게 더 빠르다고 가정해보자. 미리 도착한 데이터는 어디에선가 처리되기를 기다리고 있어야 할 것이다.

  2. 반대로 어떤 작업이 데이터를 처리하는 시간이 데이터가 도착하는 것보다 빠르다고 가정해보자. 이 경우에도 어느 정도의 데이터량이 쌓일 때까지 기다려야한다. (버퍼링이 걸리는 상황)

=> 즉 도착한 데이터들이 처리되기를 기다리는 영역이 Buffer이다.

만약 유튜브를 볼 때 인터넷 연결상태가 좋다면 이것은 상기의 1번 상황이다. 영상이 끊김없이 재생될 것이다. 데이터를 처리(영상을 보여주는 것보다)하는 것보다 데이터가 도착(데이터를 다운로드)하는 것이 빠르기 때문에 도착한 데이터들은 다른 데이터가 다 처리될 때까지 Buffer에서 대기해야 할 것이다.

반면 인터넷 연결상태가 좋지 않다면 2번 상황이다. 데이터의 처리가 데이터의 도착보다 빠르다면 우리는 데이터가 어느정도 모일 때까지(다시 영상을 보여줄 수 있을 때까지) 기다려야 할 것이다.(이것이 버퍼링) 이 때 데이터들이 어느정도 모일 때 까지 기다리는 곳이 Buffer이다.

Node.js는 Streaming하는 동안 자동으로 Buffer를 만든다. 데이터가 Buffer에 있는동안 우리는 Streaming 되는 이진 데이터들을 조작하고 다룰 수 있다.

Buffer를 다룰 수 있는 메소드는 Node.js 공식문서를 확인

참조 : https://tk-one.github.io/2018/08/28/nodejs-buffer/

오늘 하루

  1. MDN의 HTTP message, CORS 레퍼런스들을 읽어봤다. 클라이언트에서 서버로 Post 요청 시 전송한 데이터가 Node.js에서는 Buffer형식으로 전송된다. Buffer는 Node.js에서 제공하는 Binary 데이터를 담을 수 있는 객체라는 것과 그것을 내가 다루기 쉬운 String 형태로 바꾸기 위해서는 Buffer.concat() 이나 toString() 메소드를 사용해야 한다는 것을 알 수 있었다. 다만 아직 포스팅 할 만큼 관련 레퍼런스를 많이 읽은 것도 아니고해서 자신이 없네... 다음주에는 관련한 내용을 스프린트에서 배우려나. 찾다보니 모르는 개념이 너무 많아서 당황스럽다;; Writable, Readable한 것의 의미나 Stream의 의미를 정확히 알지는 못하지만 하다보면 자연스러워지겠지.
profile
다 늦은 밤, 달밤의 개발일기

2개의 댓글

comment-user-thumbnail
2020년 7월 5일

아하! 그래서 request에 on 이벤트 리스너로 'data'를 지정하는 까닭이 buffer때문이었군요ㅎㅎ
저는 데이터 그자체가 배열인데 배열을 또 왜 push, concat하냐 했거든요ㅋㅋ
그게 아니라 들어온 비트 값 하나하나 추가하는 과정이었고 그 과정이 다 끝났다는 건 'end'에서 보장할 수 있으니 이때 바이너리 데이터를 변환하는 과정을 넣는 거군요!
덕분에 이해하고 갑니다:)

1개의 답글