blob_file_array-buffer.md

๐Ÿก

File: Blob, ArrayBuffer, TypedArray(Uint8Array)

๋ชฉํ‘œ: ์ด๋ฏธ์ง€ File์„ ์ข€ ๋” ์ œ๋Œ€๋กœ ์•Œ๊ณ  ๋‹ค๋ค„๋ณด์žโœจ
๊ฐœ์š”: ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŒŒ์ผ์„ ๋‹ค๋ฃจ๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ธ Blob, ArrayBuffer, Binary Data์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ์ „์†ก, ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

0. ๋ฒจ๋กœ๊ทธ ํฌ์ŠคํŠธ: File: Blob, ArrayBuffer, TypedArray(Uint8Array)

1. CodeSandbox ์‹คํ—˜ > https://codesandbox.io/s/unit8array-raw-binary-data-buffer-z3ki4q?file=/src/form/Form.jsx:275-694

2. MDN ๋ ˆํผ๋Ÿฐ์Šค Blob: https://developer.mozilla.org/en-US/docs/Web/API/Blob
Binary Data Buffer: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
TypedArray: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray
Unit8Array: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array


1. Blob์ด ๋Œ€์ฒด ๋ญ์•ผ?๐Ÿค”

Theย Blobย object represents a blob, which is a file-like object of immutable, raw data Blob - Web APIs | MDN

File๊ณผ Blob

์›น ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ File์„ ๋‹ค๋ฃจ๋‹ค๋ณด๋ฉด Blob์„ ๋ณด์…จ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”. Blob์€ ๋ญ ํ•˜๋Š” ์นœ๊ตฌ์ผ๊นŒ์š”?

  • File๊ณผ Blob์€ ๋ชจ๋‘ ์›น ํ”Œ๋žซํผ์—์„œ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

    • ์ด ๋‘ ๊ฐ์ฒด๋Š” ์ƒ์† ๊ด€๊ณ„์— ์žˆ์œผ๋ฉฐ, File์€ Blob์˜ ํ™•์žฅ์ž…๋‹ˆ๋‹ค.
    • File์€ Blob์„ ์ƒ์†ํ•˜๋ฏ€๋กœ Blob์˜ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ File์€ ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Blob์€ ์ผ๋ฐ˜์ ์ธ ์ด์ง„ ๋ฐ์ดํ„ฐ ๋˜๋Š” ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉ๋˜๊ณ , File์€ ์ฃผ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ๊ด€๋ จ ์ž‘์—…์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

    | | File | Blob | | ---------- | --------------------------------------------- | ---------------------------------------- | | ์„ค๋ช… | ํŒŒ์ผ ๋ฐ์ดํ„ฐ ์ปจํ…Œ์ด๋„ˆ ๋ฐ ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํฌํ•จ | ์ด์ง„ ๋˜๋Š” ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ปจํ…Œ์ด๋„ˆ | | ์ƒ์† | Blob์„ ์ƒ์†ํ•จ | N/A | | ์‚ฌ์šฉ๋ฒ• | ํŒŒ์ผ ์ฒ˜๋ฆฌ ๋ฐ ์—…๋กœ๋“œ ๋“ฑ ํŒŒ์ผ ๊ด€๋ จ ์ž‘์—…์— ์‚ฌ์šฉ | ๋ฐ์ดํ„ฐ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉ | | ์†Œ์Šค | ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์—์„œ ์–ป์–ด์ง„ ํŒŒ์ผ์˜ ๊ฐ์ฒด | ์ด์ง„ ๋ฐ์ดํ„ฐ ๋˜๋Š” ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ | | ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ | ํŒŒ์ผ ์ด๋ฆ„, ํฌ๊ธฐ, ์œ ํ˜• ๋“ฑ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํฌํ•จ | ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—†์Œ | | ๋ฉ”์„œ๋“œ | Blob์˜ ๋ฉ”์„œ๋“œ ์ƒ์† + ํŒŒ์ผ ๊ด€๋ จ ๋ฉ”์„œ๋“œ | slice(), stream(), text(), arrayBuffer() | | ์‚ฌ์šฉ ์˜ˆ์‹œ | ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ํŒŒ์ผ ์ฒ˜๋ฆฌ, ํŒŒ์ผ ์กฐ์ž‘ ๋“ฑ | ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ, ์ด์ง„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ |

Blob, Binary Large Object

Blob์€ ์ด์ง„ ๋ฐ์ดํ„ฐ(binary data)๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

  • ํŒŒ์ผ์ด๋‚˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ Blob ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Blob ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ ์ „์šฉ์ž…๋‹ˆ๋‹ค.

    • ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ, ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      | ๋ฉ”์„œ๋“œ | ์„ค๋ช… | | ------------------------- | ------------------------------------------------------- | | Blob.slice() | Blob์˜ ์ผ๋ถ€๋ฅผ ์ž˜๋ผ๋‚ด์–ด ์ƒˆ๋กœ์šด Blob์„ ์ƒ์„ฑ | | Blob.arrayBuffer() | Blob์„ ArrayBuffer ํ˜•์‹์œผ๋กœ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ณ€ํ™˜ | | Blob.text() | Blob์„ ํ…์ŠคํŠธ๋กœ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ณ€ํ™˜ | | Blob.stream() | Blob์„ ReadableStream ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ | | Blob.stream().getReader() | ReadableStream์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ Reader ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ |

Blob ๋งŒ๋“ค์–ด๋ณด๊ธฐ

const obj = { hello: "world" };
const blob = new Blob([JSON.stringify(obj, null, 2)], {
  type: "application/json",
});

2. arrayBuffer ์•Œ์•„๋ณด๊ธฐ

arraryBuffer ๋ฉ”์†Œ๋“œ๋ž€?

arrayBuffer๋Š” ArrayBuffer๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋น„๋™๊ธฐ์ ์ธ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

  • Promise, ArraryBuffer

๊ณ ์ •๋œ ๊ธธ์ด์˜ ์ด์ง„ ๋ฐ์ดํ„ฐ ๋ฒ„ํผ

ArrayBuffer๋Š” ๊ณ ์ •๋œ ๊ธธ์ด์˜ ์ด์ง„ ๋ฐ์ดํ„ฐ ๋ฒ„ํผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” JavaScript์˜ ๋‚ด์žฅ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

โ“ ๊ณ ์ •๋œ ๊ธธ์ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”๋ฐ์š”?

ArrayBuffer์˜ ํฌ๊ธฐ(๊ณ ์ •๋œ ๊ธธ์ด)๋Š” ์ƒ์„ฑํ•  ๋•Œ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ง€์ •๋˜๋ฉฐ, 0 ์ด์ƒ์˜ ์ •์ˆ˜๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, new ArrayBuffer(16)์€ 16๋ฐ”์ดํŠธ ํฌ๊ธฐ์˜ ArrayBuffer๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Uint8Array, Int16Array, Float32Array ๋“ฑ์˜ TypedArray๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ArrayBuffer์˜ ๋ฒ„ํผ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ TypedArray๋Š” ArrayBuffer์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ๋ฅผ ํŠน์ • ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ํ•ด์„ํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

๐Ÿ“Œ TypedArray์˜ ์˜ˆ์‹œ

Aย TypedArrayย object describes an array-like view of an underlyingย binary data buffer.

TypedArray - JavaScript | MDN

| TypedArray | Size in bytes | ์‚ฌ์šฉ ์˜ˆ์‹œ | | ----------------- | ------------- | ------------------------------------------------------- | | Int8Array | 1 byte | ๋ถ€ํ˜ธ ์žˆ๋Š” 8๋น„ํŠธ ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ | | Uint8Array | 1 byte | ๋ถ€ํ˜ธ ์—†๋Š” 8๋น„ํŠธ ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ | | Uint8ClampedArray | 1 byte | 0์—์„œ 255 ์‚ฌ์ด์˜ ๋ถ€ํ˜ธ ์—†๋Š” 8๋น„ํŠธ ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ | | Int16Array | 2 bytes | ๋ถ€ํ˜ธ ์žˆ๋Š” 16๋น„ํŠธ ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ | | Uint16Array | 2 bytes | ๋ถ€ํ˜ธ ์—†๋Š” 16๋น„ํŠธ ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ | | Int32Array | 4 bytes | ๋ถ€ํ˜ธ ์žˆ๋Š” 32๋น„ํŠธ ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ | | Uint32Array | 4 bytes | ๋ถ€ํ˜ธ ์—†๋Š” 32๋น„ํŠธ ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ | | Float32Array | 4 bytes | 32๋น„ํŠธ ๋‹จ์ •๋ฐ€๋„ ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ | | Float64Array | 8 bytes | 64๋น„ํŠธ ๋ฐฐ์ •๋ฐ€๋„ ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ | | BigInt64Array | 8 bytes | 64๋น„ํŠธ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ (BigInt ํ˜•์‹) | | BigUint64Array | 8 bytes | 64๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ (BigInt ํ˜•์‹) |

โ“ ์ด์ง„ ๋ฐ์ดํ„ฐ ๋ฒ„ํผ๊ฐ€ ๋ญ”๊ฐ€์š”?

์ด์ง„ ๋ฐ์ดํ„ฐ ๋ฒ„ํผ๋Š” ์ปดํ“จํ„ฐ์—์„œ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด์ง„ ๋ฐ์ดํ„ฐ๋Š” 0๊ณผ 1๋กœ ๊ตฌ์„ฑ๋œ ๋น„ํŠธ(bit)์˜ ๋‚˜์—ด๋กœ ํ‘œํ˜„๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ปดํ“จํ„ฐ์—์„œ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ด์ง„ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋ฉฐ, ์ˆซ์ž, ๋ฌธ์ž, ์ด๋ฏธ์ง€, ์˜ค๋””์˜ค, ๋น„๋””์˜ค ๋“ฑ ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด์ง„ ๋ฐ์ดํ„ฐ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜๋Š” ์ด์œ !

  1. ArrayBuffer๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฏธ์ง€, ์˜ค๋””์˜ค, ๋น„๋””์˜ค, ํŒŒ์ผ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋Š” ArrayBuffer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ ๋ฒ„ํผ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด JavaScript๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฝ์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ FileReader์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ํŒŒ์ผ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฝ์€ ํ›„ ArrayBuffer๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ๊ฐ™์ด ์•Œ์•„๋‘๊ธฐ: ์ด์ง„ ๋ฐ์ดํ„ฐ

binary ํŒŒ์ผ:

  • ์ €์žฅ๊ณผ ์ฒ˜๋ฆฌ ๋ชฉ์ ์„ ์œ„ํ•ด ์ด์ง„ ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ ๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์ˆซ์ž, ๋ฌธ์ž, ์ด๋ฏธ์ง€, ์˜ค๋””์˜ค, ๋น„๋””์˜ค ๋“ฑ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

raw ํŒŒ์ผ:

  • ํŠน์ • ํŒŒ์ผ ํ˜•์‹์˜ ํ—ค๋”๋‚˜ ์••์ถ• ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์ €์žฅํ•œ ์ˆœ์ˆ˜ํ•œ ์ด์ง„ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ ์ด๋ฏธ์ง€, ์˜ค๋””์˜ค, ๋น„๋””์˜ค ๋“ฑ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3. file ์ฃผ์‹œ๊ตฌ์š”, binary data๋กœ ์ฃผ์„ธ์š”.

๐Ÿฅช ์•ˆ ๋“œ์‹œ๋Š” ์•ผ์ฑ„ ์žˆ์œผ์„ธ์š”?

CodeSandBox ์‹คํ—˜!

Unit8Array : raw binary data buffer - CodeSandbox

ํŒŒ์ผ์„ ์ €์žฅํ•˜๋ ค ํ•  ๋•Œ, ๋‹ค์Œ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด File๋Š” name, size, lastModified ๋“ฑ, ์›ํ•˜์ง€ ์•Š๋Š” ๋ฉ”ํƒ€ ์ •๋ณด๊นŒ์ง€ ์ „๋ถ€ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋งŒ์•ฝ์— ์ด ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ raw ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?
const file = e.target.files[0];

Blob.arrayBuffer()

arrayBuffer๋Š” ArrayBuffer ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

const buffer = await file.arrayBuffer();

๋‹ค๋งŒ ๋น„๋™๊ธฐ๋กœ ๋ฐ›์€ ArrayBuffer๋Š” ์ฝ˜์†”์—์„œ๋Š” ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ console์—์„œ arrayBuffer๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†๋Š” ์ด์œ 

์ฝ˜์†”์—์„œ arrayBuffer๋ฅผ ์ง์ ‘ ์ถœ๋ ฅํ•˜๋ฉด ์˜ˆ์ƒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” arrayBuffer๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ํŠน์ˆ˜ํ•œ ํ˜•์‹์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. arrayBuffer๋Š” ์ผ๋ จ์˜ ๋ฐ”์ดํŠธ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฒ„ํผ๋กœ์„œ ํ…์ŠคํŠธ๋กœ ์ง์ ‘ ํ•ด์„ํ•˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • reader๊ฐ€ onload๋œ ํ›„, JSON.stringify๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
console.log("Buffer Stringify: ", JSON.stringify(unit8Buffer, null, 2));

๐Ÿ‘‰ JSON.stringify()

JSON์˜ stringify ๋ฉ”์†Œ๋“œ๋Š” JavaScript ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. JSON.stringify() ๋ฉ”์„œ๋“œ๋Š” ์„ธ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜: ๋ณ€ํ™˜ํ•  JavaScript ๊ฐ์ฒด ๋˜๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜: replacer ํ•จ์ˆ˜๋กœ, ์›ํ•˜๋Š” ์†์„ฑ์„ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ null์„ ์ „๋‹ฌํ•˜์—ฌ ๋ชจ๋“  ์†์„ฑ์„ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜: ๋“ค์—ฌ์“ฐ๊ธฐ(indentation)์— ์‚ฌ์šฉ๋˜๋Š” ๊ณต๋ฐฑ ๋ฌธ์ž number์ž…๋‹ˆ๋‹ค. 2๋ฅผ ์ „๋‹ฌํ•˜๋ฉด 2์นธ์˜ ๊ณต๋ฐฑ ๋ฌธ์ž๋กœ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

Unit8Array

๐Ÿ“Ž Unit8Array๋Š” ๋ถ€ํ˜ธ ์—†๋Š” 8๋น„ํŠธ ์ •์ˆ˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” TypedArray์ž…๋‹ˆ๋‹ค.

  • TypedArray๋Š” buffer ์†์„ฑ์„ ํ†ตํ•ด ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ, TypedArray.from() ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ TypedArray ์‚ฌ์ด์—์„œ ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์›น ๋ธŒ๋ผ์šฐ์ €, Node.js, ์›น ์›Œ์ปค ๋“ฑ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ๊ณผ ํ™˜๊ฒฝ์—์„œ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์—์„œ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ด์‹์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์™œ Unit8Array์ฃ ?

์ด์œ  A. ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ

Uint8Array๋Š” 8๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด 1๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณธ๋ฌธ ์ƒ๋‹จ์—์„œ ์ •๋ฆฌํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด, ๋‹ค๋ฅธ TypedArray๋Š” ๋” ํฐ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, Uint8Array๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์œ  B. ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ํ”ฝ์…€ ๋ฐ์ดํ„ฐ ํ‘œํ˜„

๋Œ€๋ถ€๋ถ„์˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ์€ 8๋น„ํŠธ ํ”ฝ์…€ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Uint8Array๋Š” 8๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜๋ฅผ ๋‹ค๋ฃจ๋Š” TypedArray๋กœ์„œ, ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ํ”ฝ์…€ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€ ํŒŒ์ผ์€ ํ”ฝ์…€ ๊ฐ’๋“ค์˜ ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ํ”ฝ์…€์€ RGB ๊ฐ’(๊ฐ ์ƒ‰์ƒ์ด 0~255) ๋˜๋Š” RGBA ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. Uint8Array๋Š” 0๋ถ€ํ„ฐ 255๊นŒ์ง€์˜ ๊ฐ’์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”ฝ์…€ ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ArrayBuffer๋ฅผ ๋ณ€ํ™˜ํ•˜๊ธฐ

์ด๋ฏธ์ง€๋ฅผ Unit8Array ํ˜•ํƒœ์˜ ๋ฐ”์ดํŠธ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • new Unit8Array()
    const imageByteData = [...new Unit8Array(buffer)];
    // buffer: ์œ„์—์„œ ๋ฐ˜ํ™˜ ๋ฐ›์€ ArrayBuffer
    

Unit8Array๋ฅผ spreadํ•˜๋Š” ์ด์œ !

new Uint8Array(buffer)๋ฅผ [...new Uint8Array(buffer)]๋กœ spreadํ•˜๋Š” ์ด์œ ๋Š” Uint8Array๋ฅผ JavaScript์˜ ์ผ๋ฐ˜ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

  • Uint8Array๋Š” TypedArray๋กœ์„œ, ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Uint8Array๋Š” ์ผ๋ฐ˜ ๋ฐฐ์—ด๊ณผ๋Š” ๋‹ค๋ฅธ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Uint8Array๋Š” map, filter, reduce์™€ ๊ฐ™์€ ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ, Uint8Array์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ผ๋ฐ˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด, spread ์—ฐ์‚ฐ์ž(...)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ Uint8Array binary data๋ฅผ ๋ฐ์ดํ„ฐ ์ €์žฅ, ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<div>
  <h4>์ด์ง„ ๋ฐ์ดํ„ฐ binary data: </h4>
  <div style={{ fontSize: "10px", maxWidth: "320px" }}>
    {arrayBuffer && JSON.stringify(arrayBuffer, null, 2)}
  </div>
</div>

๊ฒฐ๋ก 

์ด๋ฏธ์ง€ ํŒŒ์ผ๊ณผ ๊ด€๋ จํ•˜์—ฌ Binary Data(TypedArray), Blob, ArrayBuffer์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค๐Ÿ˜Ž

๐Ÿฅช ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ Blob, ArrayBuffer, Uint8Array ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ, ์ด์ง„ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ์™€ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ: ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์„ ํƒํ•˜๋ฉด ํ•ด๋‹น ํŒŒ์ผ์€ JavaScript์—์„œ File ๊ฐ์ฒด๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • File ๊ฐ์ฒด๋Š” Blob์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๋ฉฐ, ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
    • ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์ด๋ฏธ์ง€ ํŒŒ์ผ์€ FileReader๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • FileReader์˜ readAsArrayBuffer() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ArrayBuffer๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ํ™œ์šฉ: readAsArrayBuffer() ๋ฉ”์„œ๋“œ์˜ ์™„๋ฃŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ, ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ArrayBuffer ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    • ArrayBuffer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Uint8Array๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Uint8Array๋Š” 8๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด๋กœ, ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜์—ฌ ์ €์žฅํ•˜๊ฑฐ๋‚˜, ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.