๐Ÿ“‚ OPFS (Origin Private File System)

OPFS๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณ ์„ฑ๋Šฅ, ์ €์ง€์—ฐ ์ „์šฉ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋„๋ฉ”์ธ/Origin)๋ณ„๋กœ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌ๋œ ๊ฐ€์ƒ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ณต๊ฐ„์„ ์ œ๊ณตํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ๊ฐœ๋ณ„ ํŒŒ์ผ ์„ ํƒ ์ฐฝ์ด๋‚˜ ๊ถŒํ•œ ์Šน์ธ ํŒ์—… ์—†์ด๋„ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค.

๊ธฐ์กด์˜ ์›น ์Šคํ† ๋ฆฌ์ง€๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ์— ํ•œ๊ณ„๊ฐ€ ๋ช…ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค. LocalStorage๋Š” ์šฉ๋Ÿ‰์ด ๋„ˆ๋ฌด ์ž‘๊ณ  ๋ฌธ์ž์—ด๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, IndexedDB๋Š” ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ์—” ์ข‹์ง€๋งŒ ๋Œ€์šฉ๋Ÿ‰ ๋ฏธ๋””์–ด ํŽธ์ง‘์ด๋‚˜ WebAssembly(Wasm) ๊ธฐ๋ฐ˜์˜ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ(์˜ˆ: ๋ธŒ๋ผ์šฐ์ €์šฉ SQLite)์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ์ž…์ถœ๋ ฅ(I/O) ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋”ฐ๋ผ ๋””์Šคํฌ I/O ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ ๋ฐ์Šคํฌํ†ฑ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ์ˆ˜์ค€์˜ ํŒŒ์ผ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋œ ์›น ํ‘œ์ค€ ๊ธฐ์ˆ ์ด ๋ฐ”๋กœ OPFS์ž…๋‹ˆ๋‹ค.


๐Ÿ”‘ OPFS์˜ ํ•ต์‹ฌ ํŠน์ง•

OPFS๋Š” ์‚ฌ์šฉ์ž ๋ˆˆ์— ๋ณด์ด๋Š” ์ผ๋ฐ˜์ ์ธ ํŒŒ์ผ ์‹œ์Šคํ…œ(๋ฐ์Šคํฌํ†ฑ, ๋‹ค์šด๋กœ๋“œ ํด๋” ๋“ฑ)๊ณผ ๋ถ„๋ฆฌ๋˜์–ด ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์˜ ์ˆจ๊ฒจ์ง„ ์ตœ์ ํ™” ๊ณต๊ฐ„์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ฅ ํ•ต์‹ฌ ์ฐจ๋ณ„์ 


๐Ÿงฑ ์ „ํ†ต์  ์Šคํ† ๋ฆฌ์ง€์™€์˜ ์ฐจ์ด์ 

๋ฐฉ์‹์ ‘๊ทผ ๊ถŒํ•œ ํŒ์—…์ฃผ ์‚ฌ์šฉ ๋ชฉ์ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ฑ๋Šฅ
LocalStorage์—†์Œ๊ฐ„๋‹จํ•œ ํ‚ค-๊ฐ’(String) ์„ค์ • ์ €์žฅ๋งค์šฐ ๋‚˜์จ (์ง€์› ์•ˆ ๋จ)
IndexedDB์—†์Œ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ, ๊ฐ์ฒด ์ฟผ๋ฆฌ ๊ฒ€์ƒ‰๋ณดํ†ต (์˜ค๋ฒ„ํ—ค๋“œ ์กด์žฌ)
Standard File Systemํ•„์š” (๋งค๋ฒˆ ์Šน์ธ)์œ ์ € ๋””์Šคํฌ์˜ ์‹ค์ œ ํŒŒ์ผ ํŽธ์ง‘๋ณดํ†ต (๋ณด์•ˆ ๋ ˆ์ด์–ด ๊ฑฐ์นจ)
OPFS์—†์Œ (์ตœ์ดˆ 1ํšŒ๋„ ์•ˆ ๋œธ)๊ณ ์„ฑ๋Šฅ ๊ฐ€์ƒ ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ํŽธ์ง‘๋งค์šฐ ๋›ฐ์–ด๋‚จ (์ตœ์ ํ™”)

๐Ÿ’ป ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• (์ฝ”๋“œ ์˜ˆ์ œ)

OPFS๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ง„์ •ํ•œ ๊ณ ์„ฑ๋Šฅ(๊ฐ•๋ ฅํ•œ ํ”Œ๋Ÿฌ์‹œ ๋ฐ ์ž ๊ธˆ ๊ธฐ๋Šฅ)์„ ํ™œ์šฉํ•˜๋ ค๋ฉด ์›น ์›Œ์ปค(Web Worker) ๋‚ด๋ถ€์—์„œ createWritable() ๋Œ€์‹  createSyncAccessHandle()์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •์„์ž…๋‹ˆ๋‹ค.

1. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ํŒŒ์ผ ๋‹ค๋ฃจ๊ธฐ (๊ธฐ๋ณธ ๋น„๋™๊ธฐ)

async function writeToOPFS() {
    // 1. OPFS ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ
    const root = await navigator.storage.getDirectory();
    
    // 2. ํŒŒ์ผ ์ƒ์„ฑ ๋˜๋Š” ์—ด๊ธฐ
    const fileHandle = await root.getFileHandle("example.txt", { create: true });
    
    // 3. ์“ฐ๊ธฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ ๋ฐ ๋ฐ์ดํ„ฐ ๊ธฐ๋ก
    const writable = await fileHandle.createWritable();
    await writable.write("Hello, Origin Private File System!");
    await writable.close();
    
    console.log("ํŒŒ์ผ ์“ฐ๊ธฐ ์™„๋ฃŒ!");
}

2. ์›น ์›Œ์ปค์—์„œ ๋™๊ธฐ์‹ ์ดˆ๊ณ ์† ํŒŒ์ผ ์ ‘๊ทผ (์ถ”์ฒœ)

// Worker.js ๋‚ด๋ถ€ ์ฝ”๋“œ
self.onmessage = async (e) => {
    const root = await navigator.storage.getDirectory();
    const fileHandle = await root.getFileHandle("heavy_data.bin", { create: true });
    
    // ๋™๊ธฐ์‹ ์•ก์„ธ์Šค ํ•ธ๋“ค ํš๋“ (๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ๋Š” ํ˜ธ์ถœ ๋ถˆ๊ฐ€)
    const accessHandle = await fileHandle.createSyncAccessHandle();
    
    // ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ๋ฒ„ํผ ์“ฐ๊ธฐ
    const encoder = new TextEncoder();
    const writeBuffer = encoder.encode("High performance data string");
    
    const bytesWritten = accessHandle.write(writeBuffer, { at: 0 });
    
    // ๋””์Šคํฌ์— ์™„์ „ํžˆ ํ”Œ๋Ÿฌ์‹œ(์ €์žฅ) ํ›„ ๋‹ซ๊ธฐ
    accessHandle.flush();
    accessHandle.close();
    
    self.postMessage(`์„ฑ๊ณต์ ์œผ๋กœ ${bytesWritten} ๋ฐ”์ดํŠธ๋ฅผ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.`);
};

๐Ÿ’ญ ๊ณ ์ฐฐ

OPFS๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹จ์ˆœํ•œ ํŽ˜์ด์ง€ ๋ทฐ์–ด์—์„œ '๊ฐ•๋ ฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”Œ๋žซํผ'์œผ๋กœ ์ง„ํ™”์‹œํ‚จ ํ•ต์‹ฌ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. Figma ๊ฐ™์€ ์›น ๊ธฐ๋ฐ˜ ๊ทธ๋ž˜ํ”ฝ ํˆด, ์˜์ƒ ํŽธ์ง‘๊ธฐ, ์›น๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์—์„œ ๋Œ์•„๊ฐ€๋Š” ๊ฐ€๋ฒผ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(SQLite Wasm) ๋“ฑ์ด ๋ชจ๋‘ ์ด OPFS ๋•๋ถ„์— ๋งค๋„๋Ÿฝ๊ฒŒ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ์œ ์ € ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒฉ๋ฆฌ๋œ ์ €์žฅ์†Œ์ธ ๋งŒํผ ๋””์Šคํฌ ์šฉ๋Ÿ‰ ๊ด€๋ฆฌ(Quota ๊ด€๋ฆฌ)์— ์‹ ๊ฒฝ ์จ์•ผ ํ•˜๋ฉฐ, ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์ •๋ฆฌ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ ์ €๊ฐ€ ์˜๊ตฌ ๋ณด์กดํ•ด์•ผ ํ•˜๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์€ ๋ฐ˜๋“œ์‹œ ์ผ๋ฐ˜ ๋‹ค์šด๋กœ๋“œ API๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ๋””์Šคํฌ๋กœ ๋‚ด๋ณด๋‚ด๋„๋ก ์œ ๋„ํ•˜๋Š” ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.