바이너리 데이터들의 스트림을 읽거나 조작하는 매커니즘.
이 Buffer 클래스는Node.js
의 일부로 도입되어TCP 스트림
이나파일시스템
같은 작업에서의 octet 스트림과의 상호 작용을 가능하기 위해 만들어졌습니다.
- octet Stream은 일반적으로 8bit 형식으로 된 데이터를 의미합니다.
Buffer 클래스는 바이너리 데이터들의 스트림을 직접 다루기 위해 Node.js API에 추가되었다고 볼 수 있습니다.
컴퓨터는 이진수로 데이터를 저장하고 표현합니다. 이진수는 단순히 1과 0의 집합입니다. 각각의 이진수에서 1 혹은 0으로 되어있는 자리를 비트(bit)라고 합니다. 이는 Binary digit의 약자입니다. 예를 들어, 숫자 12를 변환하려면 컴퓨터는 12를 이진수인 1100로 변환해야 합니다.
하지만 우리가 다루는 데이터 중에는 문자열
도 있고 이미지
, 비디오
형식도 있습니다. 컴퓨터는 모든 유형의 데이터를 이진수로 변환하는 법을 알고 있습니다.
Character Set은 각각문자를 숫자로 나타낼 수 있도록 정의해놓은 규칙입니다. 각각 문자에 해당하는 숫자를 표로 정리해 놓은 것으로
유니코드
,아스키코드
가 그 예입니다.
문자를 숫자로 나타내는 것에 규칙이 있는 것처럼 숫자를 바이너리 데이터로 나타내는 데에도 규칙이 있습니다. 정확히 말하면 숫자를 몇 bit로 나타낼 것인가를 정하는 것입니다. 이것을 Character Encoding
이라고 부릅니다.
Character Encoding의 정의중 하나가 UTF-8
입니다. UTF-8은 문자가 바이트 단위로 인코딩
되어야 합니다. 1바이트는 8개 비트의 집합을 의미합니다. 즉 8개의 1 또는 0을 의미합니다. 그래서 문자를 바이너리로 나타내는데에는 8개의 1과 0으로 된 집합이 사용됩니다.
Node.js에서의 스트림은 간단하게 한 지점에서 다른 지점으로 이동하는 일련의 데이터를 의미합니다. 전체적인 의미로는 만약 우리가 어떤 방대한 양의 데이터를 처리해야 할 때, 모든 데이터가 전부다 사용가능할 때까지 기다리지 않아도 된다는 것입니다.
기본적으로 큰 데이터는 청크 단위로 세분화되어 전송됩니다. 이말은 처음 설명했던 Buffer의 정의에 따르면, 파일시스템에서 바이너리 데이터들이 이동한다는걸 의미합니다. 예를 들어 file1.txt의 텍스트를 file2.txt로 옮기는 것
을 의미합니다.
우리는 데이터들의 스트림이란 일련의 데이터들이 한지점에서 다른 지점으로 이동하는 것이라는 것을 배웠습니다. 하지만 데이터들이 정확하게 어떻게 이동한다는 것일까요 ?
일반적으로 데이터의 이동은 그 데이터를 가지고 작업을 하거나, 그 데이터를 읽거나 무언가를 하기 위해 일어납니다. 하지만 한 작업이 특정시간동안 데이터를 받을 수 있는 데이터의 최소량과 최대량이 존재합니다. 그래서 만약에 한 작업이 데이터를 처리하는 시간보다 데이터가 도착하는 게 더 빠르다면, 초과된 데이터는 어디에선가 처리되기를 기다리고 있어야 합니다. 데이터를 처리하는 시간보다 훨씬 빠르게 계속해서 새로운 데이터가 도착하면 어딘가에는 도착한 데이터들이 미친듯이 쌓일 것이기 때문입니다.
반면에, 한 작업이 데이터를 처리하는 시간이 데이터가 도착하는 시간보다 더 빠르다면, 먼저 도착한 데이터는 처리되기 전에 어느정도의 데이터량이 쌓일때까지 기다려야 합니다.
바로 그 기다리는 영역이 buffer입니다. 컴퓨터에서 일반적으로 RAM이라고 불리는 영역에서 streaming 중에 데이터가 일시적으로 모이고, 기다리며 결국에는 데이터가 처리되기 위해 내보내집니다.