๐Ÿงพ 72. React Native์—์„œ PDF ๋ฐ ๋ฌธ์„œ ๋ทฐ์–ด ๊ตฌํ˜„ ์ „๋žต โ€” react-native-pdf, ์›น๋ทฐ, ๋‹ค์šด๋กœ๋“œ๊นŒ์ง€

JM_Devยท2025๋…„ 8์›” 7์ผ
0
post-thumbnail

์•ฑ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด PDF ํŒŒ์ผ์ด๋‚˜ ๋ฌธ์„œ๋ฅผ ์•ฑ ์•ˆ์—์„œ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ž์ฃผ ์ƒ๊ธด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€, ์ „์ž๋ช…์„ธ์„œ, ๊ณ„์•ฝ์„œ, ์ •์ฑ… ๋ณ€๊ฒฝ ์•ˆ๋‚ด ๊ฐ™์€ ๊ฒƒ๋“ค์ด๋‹ค.
์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ ๋งํฌ๋กœ ์›น์— ์—ฐ๊ฒฐํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ์—ˆ๋Š”๋ฐ,
๋ง‰์ƒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด UX๋„ ์•ˆ ์ข‹๊ณ , ์™ธ๋ถ€ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋น ์ ธ๋‚˜๊ฐ€์„œ ํ๋ฆ„๋„ ๋Š๊ธฐ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ React Native์—์„œ ์•ฑ ์•ˆ์—์„œ ์ง์ ‘ PDF๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์„ ์ •๋ฆฌํ•ด๋ดค๋‹ค.


โœ… ๋ฌธ์„œ ๋ทฐ์–ด๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

ํ•ญ๋ชฉ์ด์œ 
UX ์œ ์ง€๋ฌธ์„œ๋ฅผ ๋ณด๋”๋ผ๋„ ์•ฑ ์•ˆ์—์„œ ์ „์ฒด ํ๋ฆ„์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค
์˜คํ”„๋ผ์ธ ๋Œ€์‘๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ์„ ๋ถ™์ด๋ฉด ๋„คํŠธ์›Œํฌ ์—†์ด๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค
์‚ฌ์šฉ์ž ์‹ ๋ขฐ์›น ์—ฐ๊ฒฐ๋ณด๋‹ค ์•ฑ ๋‚ด ๋ทฐ์–ด๋Š” ์‹ ๋ขฐ๋„๋ฅผ ๋†’์—ฌ์ค€๋‹ค
๋‹ค์–‘์„ฑ์•ฝ๊ด€, ๊ณต์ง€, ๋ณด๊ณ ์„œ, ๊ณ„์•ฝ์„œ ๋“ฑ ๋ฌธ์„œ ํ˜•ํƒœ๋Š” ๋‹ค์–‘ํ•˜๊ฒŒ ์กด์žฌํ•œ๋‹ค

๐Ÿ“ฆ react-native-pdf๋กœ PDF ๋ทฐ์–ด ๋งŒ๋“ค๊ธฐ

๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” react-native-pdf๋‹ค.
PDF ํŒŒ์ผ์„ ์•ฑ ์•ˆ์—์„œ ๋กœ๋”ฉํ•˜๊ณ , ํ™•๋Œ€/์ถ•์†Œ, ํŽ˜์ด์ง€ ๋„˜๊น€ ๋“ฑ์„ ์ง€์›ํ•œ๋‹ค.

์„ค์น˜

npm install react-native-pdf react-native-webview
npx pod-install

๊ธฐ๋ณธ ์‚ฌ์šฉ ์˜ˆ์‹œ

import Pdf from 'react-native-pdf';

<Pdf
  source={{ uri: 'https://example.com/sample.pdf', cache: true }}
  onLoadComplete={(pages) => console.log(`์ด ${pages} ํŽ˜์ด์ง€ ๋กœ๋“œ๋จ`)}
  onError={(error) => console.log('PDF ์—๋Ÿฌ:', error)}
  style={{ flex: 1 }}
/>
  • uri, base64, file:// ๋“ฑ ๋‹ค์–‘ํ•œ ์†Œ์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค.
  • cache: true ์˜ต์…˜์œผ๋กœ ์บ์‹ฑ ๊ฐ€๋Šฅ

๐ŸŒ WebView๋ฅผ ํ™œ์šฉํ•œ ๋ฌธ์„œ ๋ทฐ์ž‰

PDF ์™ธ์—๋„ HTML, Word, Excel ๊ฐ™์€ ๋ฌธ์„œ๋ฅผ ๋ณด์—ฌ์ฃผ๋ ค๋ฉด WebView๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒŒ ๋‚ซ๋‹ค.
Google Docs ๋ทฐ์–ด๋ฅผ ์ด์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ๋‹ค.

import { WebView } from 'react-native-webview';

<WebView
  source={{ uri: 'https://docs.google.com/gview?embedded=true&url=https://example.com/doc.pdf' }}
  style={{ flex: 1 }}
/>
  • ์ผ๋ถ€ ๋ฌธ์„œ ํฌ๋งท์€ WebView์—์„œ๋งŒ ์ œ๋Œ€๋กœ ๋ณด์—ฌ์ง„๋‹ค.
  • ๋‹ค๋งŒ iOS์—์„œ๋Š” WKWebView ์„ค์ •์„ ๋”ฐ๋กœ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๐Ÿ’พ PDF ๋‹ค์šด๋กœ๋“œ ๋ฐ ์ €์žฅ ๊ธฐ๋Šฅ

PDF๋ฅผ ๋ณด์—ฌ์ค„ ๋ฟ ์•„๋‹ˆ๋ผ ์ €์žฅ ๊ธฐ๋Šฅ๊นŒ์ง€ ์ œ๊ณตํ•˜๋ฉด ๋” ํŽธ๋ฆฌํ•˜๋‹ค.
์‚ฌ์šฉ์ž๋Š” ๋‚˜์ค‘์— ๋‹ค์‹œ ๋ณด๊ธฐ ์œ„ํ•ด ์ €์žฅํ•ด๋‘๊ฑฐ๋‚˜ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

import * as FileSystem from 'expo-file-system';
import * as Sharing from 'expo-sharing';

const downloadAndShare = async (url: string) => {
  const fileUri = FileSystem.documentDirectory + 'sample.pdf';
  const downloaded = await FileSystem.downloadAsync(url, fileUri);
  await Sharing.shareAsync(downloaded.uri);
};
  • expo-file-system, expo-sharing์„ ์“ฐ๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ๊ธฐ๋Šฅ์€ Expo ํ™˜๊ฒฝ์—์„œ ํŠนํžˆ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค.

๐Ÿงฉ UX ๊ฐœ์„  ํฌ์ธํŠธ

๊ธฐ๋Šฅ์ด์œ 
๋กœ๋”ฉ ์Šคํ”ผ๋„ˆPDF๊ฐ€ ํด ๊ฒฝ์šฐ ๋นˆ ํ™”๋ฉด์ด ๋ณด์ผ ์ˆ˜ ์žˆ์–ด์„œ ๋ถˆ์•ˆ๊ฐ์„ ์ค„์—ฌ์•ผ ํ•œ๋‹ค
ํŽ˜์ด์ง€ ์ˆ˜ ํ‘œ์‹œํ˜„์žฌ ํŽ˜์ด์ง€์™€ ์ „์ฒด ํŽ˜์ด์ง€ ์ˆ˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒŒ UX์— ์ข‹๋‹ค
ํ™•๋Œ€/์ถ•์†Œ ์ œํ•œ๋„ˆ๋ฌด ํ™•๋Œ€๋˜๊ฑฐ๋‚˜ ์ถ•์†Œ๋˜๋ฉด ๋ทฐ๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค
์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋กœ๋”ฉ ์‹คํŒจ ์‹œ ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ช…ํ™•ํžˆ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค

๐Ÿง  ์‹ค์ „์—์„œ ๊ฒช์—ˆ๋˜ ์ผ

์ด์šฉ์•ฝ๊ด€์„ PDF๋กœ ๋งŒ๋“ค์–ด์„œ ๋ณด์—ฌ์ค˜์•ผ ํ–ˆ๋˜ ์ผ์ด ์žˆ์—ˆ๋‹ค.
์ฒ˜์Œ์—” ๊ทธ๋ƒฅ ์›นํŽ˜์ด์ง€ ๋งํฌ๋กœ ์—ด์—ˆ๋Š”๋ฐ,

  • ๋กœ๋”ฉ์ด ๋А๋ฆฌ๊ณ 
  • ํ„ฐ์น˜ ํ™•๋Œ€๋„ ์•ˆ ๋˜๊ณ 
  • ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ‘์ž๊ธฐ ์—ด๋ ค์„œ ํ๋ฆ„์ด ์™„์ „ํžˆ ๋Š๊ฒผ๋‹ค.

๊ทธ๋ž˜์„œ react-native-pdf๋ฅผ ๋„์ž…ํ•ด์„œ ๋ทฐ์–ด๋ฅผ ๋งŒ๋“ค๊ณ ,
๋ฌธ์„œ ๋งํฌ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ๋‹ค์šด๋กœ๋“œ ํ›„ ๋ฐ”๋กœ ๋ณด์—ฌ์ฃผ๋Š” ํ๋ฆ„์œผ๋กœ ๋ฐ”๊ฟจ๋‹ค.
์บ์‹ฑ๋„ ์ ์šฉํ–ˆ๊ณ , ์ €์žฅํ•ด์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋ฐ”๊พธ๊ณ  ๋‚˜๋‹ˆ ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„๋„ ์˜ฌ๋ผ๊ฐ€๊ณ ,
UX ํ”ผ๋“œ๋ฐฑ๋„ โ€œ์ž์—ฐ์Šค๋Ÿฝ๋‹คโ€, โ€œ๋ณด๊ธฐ ํŽธํ•˜๋‹คโ€๋ผ๋Š” ๋ง์ด ๋‚˜์™”๋‹ค.


๐Ÿงพ ๋ฌธ์„œ๋Š” ๋‹จ์ˆœํ•œ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž์™€์˜ ์‹ ๋ขฐ๋ฅผ ๋งŒ๋“œ๋Š” ์ˆ˜๋‹จ์ด๊ธฐ๋„ ํ•˜๋‹ค.


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€