Published on

๐Ÿ› PROJECT | note88::์•ˆ๋“œ๋กœ์ด๋“œ ํ”ผ์•„๋…ธ ์•…๋ณด ๋ทฐ์–ด #1

์•ˆ๋“œ๋กœ์ด๋“œ ํ”ผ์•„๋…ธ ์•…๋ณด ๋ทฐ์–ด

note88 ๊ฐœ๋ฐœ ๋ฐฐ๊ฒฝ

ํ”ผ์•„๋…ธ ํ•™์›์—์„œ ์–ด๋А ๋‚  ๊ฐค๋Ÿญ์‹œ ํƒญ์œผ๋กœ ์•…๋ณด๋ฅผ ๋ณด๋Š” ์ง€์ธ๋ถ„๊ป˜์„œ ์•ˆ๋“œ๋กœ์ด๋“œ์šฉ์œผ๋กœ๋Š” ์•…๋ณด ๋ณด๋Š” ์•ฑ์ด ์žˆ์œผ๋‚˜, imslp์—ฐ๋™์ด ๋œ ์•…๋ณด๊ฐ€ ์—†๋‹ค๊ณ  ๋งํ•œ ๊ฒƒ์ด ์‹œ์ดˆ๊ฐ€ ๋˜์—ˆ๋‹ค.
์ด๋ฏธ iOS์šฉ์œผ๋กœ๋Š” PiaScore๋ผ๋Š” ์•ฑ์ด ์กด์žฌํ•˜๊ณ , ์ด๋ฏธ ์˜ค๋ž˜์ „ ๋ถ€ํ„ฐ๋Š” IMSLP ๊ณต์‹ ์•ฑ์ด ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์กด์žฌ๋Š” ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋‚ด ๊ธฐ์ค€ IMSLP ์•ฑ์ด ๋‹จ์ˆœํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๋งˆ์Œ์—์„œ ์•ˆ๋“œ๋กœ์ด๋“œ์šฉ imslp ์—ฐ๋™์ด ๋˜๋Š” ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ์‹œ์ž‘ํ–ˆ๋‹ค.

๊ฐœ๋ฐœ๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€

2024๋…„ 3์›” 10์ผ๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์•„, ๊ทธ๊ฐ„ ๊ตฌ์งํ™œ๋™๊ณผ ํšŒ์‚ฌํ™œ๋™์œผ๋กœ ์—ฌ๋Ÿฌ๋ชจ๋กœ ๋ฏธ๋ฃจ๋‹ค๊ฐ€ ์˜ฌํ•ด๊ฐ€ ๋˜์–ด์„œ์•ผ ์™„์„ฑ์„ ํ–ˆ๋‹ค.
์ผ๋‹จ flutter์— ๋Œ€ํ•ด์„œ ๋น ์‚ญํ•˜๊ฒŒ ์•„๋Š” ํŽธ์€ ์•„๋‹ˆ๊ณ , 2023๋…„ ํ•˜๋ฐ˜๊ธฐ์— ํ”Œ๋Ÿฌํ„ฐ ๊ด€๋ จ ์ฑ…์„ ์ฝ๊ณ  ๊ฑฐ๊ธฐ์— ๋‚˜์˜ค๋Š” ํ”„๋กœ์ ํŠธ๋งŒ ๋ช‡๊ฐœ ๋”ฐ๋ผ์„œ ํ•ด๋ณธ ์ˆ˜์ค€์ด๋ผ, ๊ฒฝํ—˜๋„ ์žˆ๊ฒ ๋‹ค ์‹ถ์–ด์„œ ๋ฌด๋ชจํ•˜๊ฒŒ ํ”Œ๋Ÿฌํ„ฐ๋กœ ์‹œ์ž‘ํ–ˆ๋‹ค.
์‚ฌ์‹ค ๊ทธ๋ƒฅ react native๋กœ ๊ฐœ๋ฐœํ• ๊นŒ ํ•˜๋‹ค๊ฐ€, react native๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS์—์„œ ๊ฐ๊ฐ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ, ํ”Œ๋Ÿฌํ„ฐ๋Š” ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์–ด์„œ ํ”Œ๋Ÿฌํ„ฐ๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. Cross platform์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋ฐ์Šคํฌํ†ฑ์œผ๋กœ๋„ ์—ฐ๊ณ„ํ•˜๋ ค ํ–ˆ์œผ๋‚˜ ์ค‘๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ.. ์ด๊ฑด ๋ณด๋ฅ˜ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค..ใ… ใ…  ์•„๋ฌดํŠผ ์ด ํฌ์ŠคํŠธ๋ชจํ…œ ์“ฐ๋Š” ์‹œ์ ์—์„œ๋Š” ์ž”์˜ค๋ฅ˜ ํ™•์ธํ•˜๊ณ  ๊ตฌ๊ธ€ ํ”Œ๋ ˆ์ด์Šคํ† ์–ด์— ๋ฐฐํฌํ•  ์˜ˆ์ •์ด๋ผ๊ณ  ๋ณด๋ฉด ๋˜๊ฒ ๋‹ค.

Product Keypoint

  • Bookview like
  • Swipe/Slide to change page
  • IMSLP ์—ฐ๋™
  • PDF Viewer

Development

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Development Stack

  • Flutter
  • Dart
  • Android
  • Claude

Ui/Ux Design

์‚ฌ์‹ค.. ๋””์ž์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์—†๊ณ  ๊ทธ๋ƒฅ ๋ฐ”๋กœ ๋จธ๋ฆฌ์—์„œ ์ƒ๊ฐ๋‚˜๋Š”๋Œ€๋กœ ๋งŒ๋“ค์–ด์„œ ์–ด์ฐŒ๋ณด๋ฉด ์ผ๊ด€์„ฑ์ด ์—†์–ด ๋ณด์ผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์‹ ๊ฒฝ์ด ์“ฐ์—ฌ์„œ ์ปฌ๋ŸฌํŒ”๋ ˆํŠธ๋„ ์˜ฎ๊ธฐ๊ณ  ์›ฌ๋งŒํ•ด์„œ AppTheme์„ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ๋ฐœํ–ˆ๋‹ค.

์ผ๋‹จ Ui๋Š” ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ, ์ƒ‰์ƒ์€ ํ•˜๋‚˜์˜ ์ƒ‰์ƒ์„ ํ‚คํฌ์ธํŠธ๋กœ ๊ฐ€์ ธ๊ฐ€๊ณ  ์ตœ๋Œ€ํ•œ ์•…๋ณด๊ฐ€ ๋ˆˆ์— ๋„๋Š” ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ƒ‰์ƒ์€ Flutter์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์ƒ‰์ƒ์ธ MaterialColor๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

Issues

๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์‚ฌ์‹ค ์ˆœํƒ„ํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.. ใ…‹ใ…‹ ใ… ใ…  ๊ฝค๋‚˜ ๊ณ ์ƒํ•˜๋ฉด์„œ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์ƒ๊ฐ๋‚˜๋Š” ๋ช‡๊ฐ€์ง€๋งŒ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.

Bookview PDF viewer ํŒจํ‚ค์ง€๋Š” ์—†๋‹ค.

์›๋ž˜๋Š” pdfrx ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, ์ด ํŒจํ‚ค์ง€๊ฐ€ bookview ๋ชจ๋“œ๊ฐ€ ์—†์–ด์„œ, ์ตœ๋Œ€ํ•œ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ bookview๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๊ณ , pdfrx๋กœ๋Š” pdf ์ฝ๋Š” ์šฉ๋„๋กœ ๋‚˜๋ˆ„์–ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.
๋‚˜์˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€์ด๋‹ค. ์•„๋ฌดํŠผ ์ตœ๊ทผ ์•„๋ž˜ ๋‚ด๊ฐ€ ๋‚จ๊ธด ๊นƒ์ด์Šˆ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ๊นŒ ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ ๋„ฃ์œผ์‹œ๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์‹œ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

bookview๋Š” orientaton์„ ๊ณ ๋ คํ•˜๋ฉด์„œ snapping event๊ฐ€ ๊ฑธ๋ ค์•ผํ•˜๋Š”๋ฐ, ์ด๊ฒƒ๋„ offset ๊ณ„์‚ฐ์œผ๋กœ ๊ณจ๋จธ๋ฆฌ๋ฅผ ์ข€ ์•“์•˜๋˜ ๊ฒƒ์œผ๋กœ ๊ธฐ์–ตํ•œ๋‹ค.

์•„ ์ฐธ, ๊ทธ๋ฆฌ๊ณ  ๋ชฐ๋ž๋Š”๋ฐ, pdf ์œ„์— ๊ทธ๋ฆฌ๋Š” ๋“ฑ๋“ฑ ๊ณ ๊ธ‰๊ธฐ๋Šฅ์ด ๋“ค์–ด๊ฐ„ ํŒจํ‚ค์ง€๋Š” ์œ ๋ฃŒ๋‹ค..ใ… ใ… 

Dynamic ํŽ˜์ด์ง€๋“ค์„ parsingํ•˜๊ธฐ์—๋Š” flutter๊ฐ€ ๋นˆ์•ฝํ•˜๋‹ค.

webview_flutter ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS์—์„œ๋งŒ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ๋ฐ์Šคํฌํ†ฑ์œผ๋กœ๋„ parsing์„ ์›ํ•˜๋ฉด webview_windows ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์„ค๋ น ์‚ฌ์šฉํ•ด๋„ ํ›„์ž๋Š” offscreen rendering์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ ์ธ ํŽ˜์ด์ง€์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์‹คํŒจํ•˜์˜€๋‹ค.. ใ… ใ…  ์ด๊ฑด ์—ฌ๋Ÿฌ๋ฒˆ ์‹œํ—˜ํ•ด๋ณธ ๋์— ๋‚ด๋ฆฐ ๊ฒฐ๊ณผ๋‹ค..ใ… ใ… 

Google Admob์€ ๋ฐ์Šคํฌํƒ‘์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์‚ฌ์‹ค ๋ฐ์Šคํฌํƒ‘ ๊ฐœ๋ฐœ์˜ ์˜๋ฏธ๊ฐ€ ์—†์–ด์ ธ์„œ ๋ฐ์Šคํฌํƒ‘์„ ๊ตณ์ด ์‚ด๋ผ์ง„ ์•Š์•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  Admob์ด ํ…Œ์ŠคํŠธ ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๋„ˆ๋ฌด ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ 4์ผ ๋‚ด๋‚ด ๊ณ ์ƒํ•œ ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด ๋งํฌ ๋ณด๊ณ  ํ•ด๊ฒฐํ•œ์ ์ด ์žˆ์—ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์„ค์ • ๊ด€๋ จ ๋ง์ด ์—†์–ด์„œ ์ข€ ํ—ˆ๋ฌดํ•˜๊ธด ํ–ˆ๋‹ค..ใ…‹ใ…‹
๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ ํ•˜๊ณ  ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” vscode์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๋งŒ๋“ค๋ฉด ์ž๋™์œผ๋กœ Google play ๊ธฐ๋ฐ˜ ์•ˆ๋“œ๋กœ์ด๋“œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ๋‚˜์˜ค๊ธด ํ•œ๋‹ค.

Wrapup & Conclusion

์š”์•ฝ์„ ํ•˜์ž๋ฉด, ํ”Œ๋Ÿฌํ„ฐ๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•ด๋ณด์•˜๊ณ , ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๋‚˜์˜์ง€ ์•Š์€ ๊ฒฝํ—˜์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ๋กœ ์ •์‹์œผ๋กœ ๊ฐˆ ์ƒ๊ฐ์ด ์ „ํ˜€ ์—†๋Š” ์‚ฌ๋žŒ์ด๋ผ..

๋‹ค๋งŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ˜ผ์ž์„œ ๊ฐœ๋ฐœ์„ ํ•œ ๊ฒƒ์„ ํ† ๋Œ€๋กœ ๊ด‘๊ณ ๋ฅผ ๋‹ฌ๊ณ  ๋ฐฐํฌ๊นŒ์ง€๋Š” ์ฒ˜์Œ์ด๋ผ, ์ด ๊ฒฝํ—˜์„ ํ† ๋Œ€๋กœ ํ›„์† ํ”„๋กœ์ ํŠธ๋“ค์ด ๋” ์ž˜ ๋˜์—ˆ์Œ ํ•˜๋Š” ๋งˆ์Œ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์˜†๋™๋„ค React native๋ณด๋‹ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒํƒœ๊ณ„๊ฐ€ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋А๊ปด์ง€๊ธด ํ–ˆ๋‹ค.

Authors