ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
Building a 100% Client-Side PDF & Image Studio (Zero Server Uploads) ๐Ÿš€
Dev.toDev.to
Frontend

๋ธŒ๋ผ์šฐ์ € ๋‚ด 100% ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ฒ˜๋ฆฌ๋กœ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ์›น ํˆดํ‚ท ๊ฐœ๋ฐœํ•จ

Building a 100% Client-Side PDF & Image Studio (Zero Server Uploads) ๐Ÿš€

Shawn Goyena2026๋…„ 4์›” 2์ผ1๋ถ„beginner

Context

CS ํ•™์ƒ์œผ๋กœ์„œ PDF ๋ณ‘ํ•ฉ, ์ด๋ฏธ์ง€ ์••์ถ•, ๋ชจ๋“ˆ ํ…์ŠคํŠธ ์ถ”์ถœ์ด ์ •๊ธฐ์ ์œผ๋กœ ํ•„์š”ํ•จ. ๊ธฐ์กด ์˜จ๋ผ์ธ ๋„๊ตฌ ์‚ฌ์šฉ ์‹œ ๊ด‘๊ณ ๊ฐ€ ๋งŽ๊ณ  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ๋ถˆํˆฌ๋ช…ํ•˜์—ฌ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์กด์žฌํ•จ.

Technical Solution

  • pdf-lib: ์„œ๋ฒ„ ์—…๋กœ๋“œ ์—†์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ PDF ํŒŒ์ผ ์ง์ ‘ ์กฐ์ž‘ํ•จ
  • WebAssembly: ๋กœ์ปฌ ๋ธŒ๋ผ์šฐ์ € API์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•จ
  • Tailwind CSS: ๋‹คํฌ ๋ชจ๋“œ ์ง€์›ํ•˜๋Š” ๋ฐ˜์‘ํ˜• UI ์Šคํƒ€์ผ๋ง ์ ์šฉํ•จ
  • local browser APIs: OCR ๊ธฐ๋Šฅ ๋“ฑ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์‹คํ–‰ํ•จ
  • Vercel: ๋ฐฑ์—”๋“œ ์—†๋Š” ์™„์ „ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์ „์šฉ ํ˜ธ์ŠคํŒ… ๊ตฌ์„ฑํ•จ

Impact

30๊ฐœ ์ด์ƒ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ œ๊ณตํ•จ. ํŒŒ์ผ์ด ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ๋ฅผ ์ ˆ๋Œ€ ๋– ๋‚˜์ง€ ์•Š๋Š” ์™„์ „ํ•œ ๋กœ์ปฌ ์ฒ˜๋ฆฌ ๋ณด์žฅํ•จ.

Key Takeaway

ํ”„๋ผ์ด๋ฒ„์‹œ ์šฐ์„  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณต์žกํ•œ ๋ฐฑ์—”๋“œ ์ธํ”„๋ผ ์—†์ด๋„ ๋ธŒ๋ผ์šฐ์ € ๋‚ด ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๊ธฐ์ˆ ๋งŒ์œผ๋กœ ์™„์ „ํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•จ.


๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๊ฐ€ ์ค‘์š”ํ•œ ๋ฌธ์„œ ์ฒ˜๋ฆฌ ๋„๊ตฌ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ pdf-lib์™€ WebAssembly๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์„œ๋ฒ„ ์—†์ด๋„ PDF ์กฐ์ž‘๊ณผ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ. Vercel๊ณผ ๊ฐ™์€ Serverless ํ”Œ๋žซํผ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ๋งŒ ๋ฐฐํฌํ•˜์—ฌ ์šด์˜ ๋ณต์žก๋„๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Œ.

์›๋ฌธ ์ฝ๊ธฐ