TIL no.95 - Node.js - Buffer - binary data, stream of data

박준규·2019년 12월 31일
0

Node.js를 단계별로 차근차근 포스팅 하고 싶었으나 꼭 정리하고 싶은 내용을 읽게 되어 Buffer를 먼저 포스팅하게 되었습니다.

해당 포스팅은 Do you want a better understanding of Buffer in Node.js? Check this out.을 토대로 번역, 의역, 구성 재배치, 첨언한 것입니다.

오역은 댓글로 남겨주시면 감사하겠습니다.


본문의 내용이 길어 총 2개의 포스팅을 준비했으며 해당 포스팅은 본격적으로 Buffer를 공부하기 전에 필요한 사전 지식을 다룹니다.

binary data와 stream of data에 대해 다룹니다.


Preface

공식 Node.js docs에서 Buffer에 대한 설명은 다음과 같습니다.

binary data의 stream을 읽거나 조작하는 mechanism.
Buffer class 는 TCP streams나 file system operations 같은 작업에서 octet streams과 상호작용하기 위해 Node.js API에 추가되었다.

위 문장은 사전지식 없이는 이해하기 어렵습니다.

이 말을 쉽게 고쳐보자면 다음과 같습니다.

Buffer class는 binary data의 stream과 상호작용하거나 조작하기 위해 Node.js API에 추가되었다.

훨씬 심플해졌지만 Buffer, streams, binary data은 여전히 이해하기 어렵습니다. 이 단어들의 의미를 뒤에서 부터 하나하나 알아보겠습니다.

Binary Data

컴퓨터는 data를 binary(이진수)로 저장하고 나타냅니다. Binary란 0과 1의 집합입니다. 예를들어, 다음 이진수들은 서로 다른 이진수이며, 이 이진수들은 서로다른 1과 0의 집합입니다.

10, 01, 001, 1110, 00101011

1,0Bit라고 불립니다. Binary Digit의 약어이죠.

data를 저장하거나 나타내기 위해서 컴퓨터는 data를 binary로 변환해야 합니다. 예를 들어, 숫자 12를 저장하기 위해서는 12의 binary형인 1100로 변환해야 하죠.

또한, 우리가 저장해야 할 데이터들은 number뿐 아니라 string, image, video등 종류가 많습니다. 컴퓨터는 위와 같이 다양한 종류의 데이터를 binary로 나타내는 방법을 알고 있습니다.

string 변환에 대해 알아보겠습니다. 컴퓨터는 "L"이라는 string을 어떻게 binaries로 나타낼까요? 그 프로세스는 다음과 같습니다.

character -> number -> binary representation

character를 number로 바꾸고
number를 binary 형태로 바꿉니다.

character를 number로 바꾸는 방법을 이해하기 위해 console에 다음을 실행시켜보세요.

"L".charCodeAt(0)

76이라는 숫자를 볼 수 있습니다.

이 숫자는 character "L"의 Character Code 혹은 Code Point라고 불리는 숫자입니다.

Character Sets

Character Set은 각 문자를 숫자로 나타낼 수 있도록 정의해놓은 규칙입니다. Character Set은 여러 종류가 있습니다. 이중에서 유명한 것들은 UniCode, ASCII Code이며 JavaScript는 UniCode와 잘 어울립니다. console 에서 "L"을 76으로 표현한 것은 UniCode입니다.

Character Encoding

character를 number로 나타내는 rule이 있는 것 처럼, number를 binary data로 나타내는 rule이 있습니다.

구체적으로 표현하자면, 몇 bit로 number를 나타낼 것인가 정하는 것입니다. 이를 Character Encoding 이라고 합니다.

Character Encoding에 관한 정의 중 하나가 UTF-8입니다.

UTF-8은 character를 byte로 encoding하는 Character Encoding 입니다.

byte는 8개 bit의 집합입니다.

즉, character를 binary로 나타내는데 8개의 1과 0의 집합을 사용합니다.

이를 이해하기 위해 예를 들어보겠습니다. 위에서 언급했듯이 number 12의 binary representation은 1100입니다.

UTF-8 따라 12는 8bit로 구성되어야 하며 8bit로 구성하기 위해 12의 실제 binary representation(1100)의 왼쪽에 더 많은 bit를 추가해야 합니다.
그러므로 12는 00001100 으로 저장될 것입니다.

위 논리에 따라 76은 01001100으로 저장될 것입니다.

이것이 컴퓨터가 character를 binary로 저장하는 방법입니다. 마찬가지로, image나 video를 convert, encode한 뒤 binary로 저장하는 rule 또한 정해져 있습니다.

한마디로, 컴퓨터는 모든 데이터를 binaries로 저장하며 이를 binary data라고 표현합니다.

Character Encoding에 대해 더 공부하고 싶다면 이 곳을 참고하시기 바랍니다.

Character Encoding Summary

Convertrequired ConceptExample
data -> numberCharacter SetUniCode
number -> byteCharacter EncodingUTF-8

binary data에 대해 알아보았습니다. 그렇다면, binary data의 stream이란 무엇일까요?

Stream

Node.js에서 Stream이란 한 point에서 다른 곳으로 이동하는 sequence of data를 의미합니다.

원문에서는 buffer의 정의에서 "streams of binary data… in the context of… file system"라는 표현이 쓰이는데 여기에서 stream은 file system 내에서 움직이는 binary data를 뜻합니다.

예를 들어, file1.txt의 텍스트가 file2.txt로 이동하는 것을 의미합니다.

profile
devzunky@gmail.com

0개의 댓글