๐ŸŽฏ Design Decisions - CommitBang/Snapfig-Frontend GitHub Wiki

Design Decisions

์ฃผ์š” ์„ค๊ณ„ ์„ ํƒ ๋ฐฐ๊ฒฝ

Why MVVM?

SnapFig์€ Clean Architecture์™€์˜ ํ˜ธํ™˜์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ์œ„ํ•ด MVVM(Model-View-ViewModel) ํŒจํ„ด์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
MVVM์€ UI(View)์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(ViewModel)์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๊ณ , Flutter์˜ ChangeNotifier ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๋™๋ฉ๋‹ˆ๋‹ค.

Why Isar?

๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ Isar๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ: ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ๋งค์šฐ ๋น ๋ฅธ ์ฟผ๋ฆฌ ์†๋„๋ฅผ ์ œ๊ณต
  • ๊ฒฝ๋Ÿ‰ํ™”: ์•ฑ ๋‹ค์šด๋กœ๋“œ ํฌ๊ธฐ ์ฆ๊ฐ€๊ฐ€ ์•ฝ 1โ€“1.5 MB๋กœ ์ตœ์†Œํ™”
  • ์ฝ”๋“œ ์ƒ์„ฑ ์ง€์›: build_runner๋ฅผ ํ†ตํ•œ ๋ชจ๋ธ ํด๋ž˜์Šค ์ž๋™ ์ƒ์„ฑ์œผ๋กœ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ

Why FastAPI?

๋ฐฑ์—”๋“œ API ์„œ๋ฒ„๋กœ FastAPI๋ฅผ ๋„์ž…ํ•œ ์ด์œ ๋Š”:

  • ๋น„๋™๊ธฐ ์ง€์›(ASGI): ๋Œ€๊ทœ๋ชจ ๋™์‹œ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ
  • ์ž๋™ ๋ฌธ์„œํ™”: OpenAPI/Swagger ๊ธฐ๋ฐ˜ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฌธ์„œ ์ œ๊ณต
  • ํƒ€์ž… ํžŒํŠธ ๊ฒ€์ฆ: Pydantic์„ ํ™œ์šฉํ•ด ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ์„ ์ปดํŒŒ์ผ ํƒ€์ž„์ฒ˜๋Ÿผ ๊ฒ€์ฆ
  • ๊ณ ์„ฑ๋Šฅ: Flask/Django ๋Œ€๋น„ ๋” ๋‚˜์€ ์ฒ˜๋ฆฌ ์†๋„

๋Œ€์•ˆ ๊ฒ€ํ†  ๋ฐ Trade-off ์š”์•ฝ

๊ธฐ์ˆ  ๋Œ€์•ˆ ์žฅ์  ๋‹จ์ 
MVVM MVC, BLoC UI/๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ„๋ฆฌ โ†’ ํ…Œ์ŠคํŠธ ์šฉ์ด ๋Ÿฌ๋‹ ์ปค๋ธŒ, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ์ฆ๊ฐ€
Isar Hive, SQflite, ObjectBox ๊ณ ์„ฑ๋Šฅ ์ฟผ๋ฆฌ, Flutter ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›, ์ฝ”๋“œ ์ƒ์„ฑ ๋„๊ตฌ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ทœ๋ชจ ์ž‘์Œ, ๋Œ€์šฉ๋Ÿ‰ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ œ์•ฝ
FastAPI Flask, Django ASGI ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ, ์ž๋™ ๋ฌธ์„œํ™”, ํƒ€์ž… ํžŒํŠธ ๊ฒ€์ฆ ๋น„๊ต์  ์‹ ์ƒ ํ”„๋ ˆ์ž„์›Œํฌ, ์ƒํƒœ๊ณ„ยทํ”Œ๋Ÿฌ๊ทธ์ธ ์ ์Œ