<목차>
1. Buffer(버퍼)란?
1-2. Stream(스트림)이란?
2. Buffer 사용 예시
1. Buffer(버퍼)란?
Node.js 공식문서는 Buffer를 다음과 같이 정의하고 있다.
바이너리 데이터들의 스트림을 읽거나, 조작하는 메커니즘.
Buffer클래스는 Node.js의 일부로 도입되어 TCP 스트림이나 파일시스템 같은 작업에서의 octet-stream(옥텟-스트림 : 일반적으로 8bit 형식으로 된 데이터를 의미)과의 상호작용을 가능하기 위해 만들어졌습니다.
즉, Buffer 클래스는 바이너리 데이터들의 스트림을 직접 다루기 위해 nodejs API에 추가된 것이라고 볼 수 있다.
Binary Data란?
컴퓨터는 2진수로 데이터를 저장하고 표현한다.
2진수는 단순히 0과 1의 집합이며, 0과 1로 되어있는 자리를 비트(bit)라고 한다. (bit : Binary digIT의 약자)
컴퓨터가 어떤 데이터를 저장하거나 표현하기 위해서는, 컴퓨터는 해당 데이터를 2진수로 변환해야 한다.
만약, 12라는 숫자를 저장하면 컴퓨터는 이진수 1100으로 변환해 저장해야 한다.
숫자의 경우 2진수로의 변환이 간단하지만 문자의 경우엔 변환이 복잡하다. 이때 필요한 것이 Character Set (문자 집합)이다.
Character Set (문자 집합)
Character Set은 문자를 숫자로 나타낼 수 있도록 정의해 놓은 규칙이며, 문자에 해당하는 숫자를 표로 정리해 놓은 것이라고 보면 된다.
Character Set은 여러 가지 종류가 있으며, 유니코드와, 아스키코드가 대표적으로 알려져 있다.
1. ASCII CODE(아스키 코드)
- 글자를 표현할 때 8bit만 사용한다. 1byte
- 8bit 중에서 1bit는 오류 체크용으로 사용하기 때문에 실질적으로 사용하는 bit는 7bit
- Parity bit(패리티 비트) : 오류 체크용으로 사용하는 비트
- 0000000 ~ 1111111 즉, 2^7 = 128까지 아스키코드는 128가지의 글자를 표현할 수 있다.
- 키보드 자판에 있는 영어와 특수 문자만 표현이 가능하다. (한글의 경우 1byte로 표현이 불가능하다.)
2. Unicode(유니코드)
- 유니코드는 전 세게의 문자를 일관되게 표현할 수 있도록 설계된 표준이다.
- 아스키 코드와 유니코드의 큰 차이점은 용량, 글자 하나당 1byte가 아닌 2byte를 사용한다.
Character Encoding (문자 인코딩)
문자를 숫자로 나타내는 것의 규칙이 있는 것처럼 숫자를 바이너리 데이터로 나타내는 것 또한 규칙이 있다.
정확히 말하면, 숫자를 몇 bit로 나타낼 것인가를 정하는 것이며, 이것을 Character Encoding이라고 부른다.
- A는 숫자 65를 나타내는데 2진수로 표현하면 1000001
- A12를 2진수로 표현하면 10000011100
- 10000011100이 하나의 값인지 여러 개의 값인지 구분할 수 없기 때문에 내가 원하는 결괏값이 나오지 않을 수 있다.
- 10000011100의 앞을 8bit 뒤를 4bit(1000001 1100)로 잘라야 A12를 만들 수 있다.
그렇기 때문에 문자 인코딩을 하는 것!
또한, 문자 인코딩 중 하나인 utf-8의 8은 8bit를 뜻하는데
- 12라는 숫자는 4bit로 표현이 가능하지만 문자 인코딩을 통해 8bit로 변환해야 한다.
- 변환은 어렵지 않다. 단순하게 4자리의 숫자를 8자리의 숫자로 표현하면 된다.
- 0000+1100으로 표현. 남아있는 자릿수를 0으로 채우는 것.
1 - 2. Stream(스트림)이란?
Node.js 에서의 스트림은 간단하게 한 지점에서 다른 지점으로 이동하는 일련의 데이터를 의미한다.
전체적인 의미로는, 방대한 데이터 처리를 할 때 모든 데이터가 사용 가능 할 때까지 기다리지 않아도 된다는 것.
기본적으로 큰 데이터는 청크 단위로 세분화되어 전송되는데, buffer의 정의에 따르면 파일 시스템에서 바이너리 데이터들이 이동한다는 것을 의미한다.
그렇다면 Streaming 하는 동안 buffer는 바이너리 데이터를 어떻게 다룰까?
Buffer
데이터 스트림이란 일련의 데이터들이 한 지점에서 다른 지점으로 이동하는 것이다. 그렇다면, 데이터가 어떻게 이동되는 것일까?
일반적으로 데이터의 이동은 그 데이터를 가지고 작업을 하거나, 그 데이터를 읽거나, 무언가를 하기 위해 일어난다. 그러나 어떤 작업을 할 때 특정 시간 동안 데이터를 받을 수 있는 데이터의 최소량과 최대량이 존재한다.
작업이 데이터를 처리하는 시간보다 데이터가 도착하는 게 빠르다면? 초과된 데이터는 어디에선가 처리되기를 기다리고 있어야 한다.
데이더를 처리하는 시간이 데이터가 도착하는 시간보다 빠르다면? 먼저 도착한 데이터는 처리되기 전에 어느 정도 데이터가 쌓일 때까지 대기해야 한다.
이때, 데이터가 대기하는 영역이 buffer
일반적으로 컴퓨터의 RAM영역에서 streaming 중에 데이터가 일시적으로 모이고, 기다리다가 데이터를 처리할 때 처리하기 위해서 데이터를 내보내 준다.
Node.js는 데이터가 도착하는 시간이나 전송되는 속도를 제어할 수 없다. Node.js가 결정할 수 있는 건 데이터를 내보내는 타이밍. 아직 데이터를 내보낼 때가 아니면 Node.js는 데이터들의 대기 영역인 RAM의 작은 영역인 buffer에 데이터를 쌓아 놓는다.
예를 들어, 유튜브 등의 영상을 볼 때 인터넷이 좋으면 버퍼를 빠르게 채우고 데이터를 빠르게 내보내서 처리하는 것을 반복, 반대로 인터넷이 좋지 않으면 로딩 중이라는 표시를 띄우면서 버퍼링이 걸리게 된다. 이는 데이터가 더 도착할 때까지 기다란다는 의미이며, 데이터가 더 쌓이고 처리되면 영상이 다시 보이게 된다.
2. Buffer 사용 예시
Node.js는 streaming을 하는 동안 자동으로 buffer를 만든다.
// 크기가 10인 버퍼객체 생성
const buffer1 = Buffer.alloc(10);
// 버퍼에 데이터 쓰기
buffer1.write("Hello Buffer");
// 버퍼에 있는 데이터를 문자열로 반환
buffer1.toString();
/*
위의 버퍼를 출력하면 크기로 인해 일부 글자가 잘림
*/
// "abcd"라는 문자열 데이터가 담긴 버퍼객체 생성
// 따로 크기를 제한하지 않았기 때문에 쓰인 데이터를 모두 읽는다.
const buffer2 = Buffer.from("abcd");
버퍼의 크기를 임의로 제한할 수 있지만 따로 설정하지 않는다면 V8엔진이 관리하는 Heap의 크기에 의존한다. 최소 크기는 기본적으로 0바이트지만 일반적으로는 빈 객체를 생성하지 않고 1바이트 이상의 버퍼를 생성한다.
'Node.js' 카테고리의 다른 글
Node.js - express모듈 (0) | 2024.06.27 |
---|---|
Node.js - fs모듈 (0) | 2024.06.24 |
Node.js - 간단한 TCP 서버 구현 (0) | 2024.06.18 |
Node.js - 모듈 만들기, 가져오기(exports, require) (0) | 2024.06.17 |
Node.js - 기초(2) (0) | 2024.06.14 |