Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

583 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿพ PawMate

CI ์›น ๋ฐฐํฌ

๋™๋„ค ๊ธฐ๋ฐ˜ ๋ฐ˜๋ ค๋™๋ฌผ ์‚ฐ์ฑ…ยท๋Œ๋ด„ ๋งค์นญ & ์ปค๋ฎค๋‹ˆํ‹ฐ โ€” Flutter(iOS ยท Android ยท Web) + Supabase

GPS ๋™๋„ค ์ธ์ฆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด์›ƒ๊ณผ ๋ฐ˜๋ ค๋™๋ฌผ ์‚ฐ์ฑ… ๋ฉ”์ดํŠธ๋ฅผ ์ฐพ๊ณ , ๋Œ๋ด„ยท๋ถ„์–‘ยท์ž…์–‘์„ ๋งค์นญํ•˜๋ฉฐ, ์ฃผ๋ณ€ ๋ฐ˜๋ ค๋™๋ฌผ ์‹œ์„ค์„ ์ง€๋„์—์„œ ์ฐพ์•„ ํ›„๊ธฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ํ•˜์ดํผ๋กœ์ปฌ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

๐ŸŒ ์ง€๊ธˆ ๋ฐ”๋กœ ๋ณด๊ธฐ โ€” https://app.pawmate.kr

์ฒซ ํ™”๋ฉด์˜ "๋กœ๊ทธ์ธ ์—†์ด ๋‘˜๋Ÿฌ๋ณด๊ธฐ" ๋กœ ๊ฐ€์ž… ์—†์ด ํ”ผ๋“œยท์ง€๋„ยท์‹œ์„ค ํ›„๊ธฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ธ€์“ฐ๊ธฐยท์ฑ„ํŒ… ๋“ฑ ์“ฐ๊ธฐ ๋™์ž‘์€ ์ „ํ™” ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ์•ฑ์€ ์Šคํ† ์–ด ์ถœ์‹œ ์ค€๋น„ ์ค‘)

์™œ ๋งŒ๋“ค์—ˆ๋‚˜

๋ฐ˜๋ ค๋™๋ฌผ ๋ถ„์–‘ ๊ฒฝ๋กœ 1์œ„๋Š” ํŽซ์ˆ(28.7%)์ด ์•„๋‹ˆ๋ผ ์ง€์ธ(46.0%) ์ด๋‹ค(๋†๋ฆผ์ถ•์‚ฐ์‹ํ’ˆ๋ถ€, 2025). ์ด ์‹œ์žฅ์˜ ์ฃผ๋ฅ˜ ๊ฑฐ๋ž˜๋Š” ์ด๋ฏธ ์ด์›ƒยท์ง€์ธ ์‚ฌ์ด์—์„œ ์ผ์–ด๋‚˜๋Š”๋ฐ, ๊ทธ๊ฑธ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์—†์–ด์„œ ์‚ฌ๋žŒ๋“ค์€ ๋ง˜์นดํŽ˜ยท์ค‘๊ณ ๊ฑฐ๋ž˜ ๊ฒŒ์‹œํŒ์—์„œ ๊ฑฐ๋ž˜ํ•œ๋‹ค โ€” ์ƒ๋Œ€๋„ ๊ทธ ๋™๋ฌผ๋„ ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ณณ์—์„œ.

๊ธฐ์กด ํŽซ์‹œํ„ฐ ํ”Œ๋žซํผ์€ ํšŒ์‚ฌ๊ฐ€ ๊ณต๊ธ‰์ž๋ฅผ ์‹ฌ์‚ฌํ•ด ์ด ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค(์‹ ์›ยท๋ฉด์ ‘ยท๋ฒ”์ฃ„์ด๋ ฅ). ํ™•์‹คํ•˜์ง€๋งŒ ์ด์›ƒ ๊ฐ„ ๊ฑฐ๋ž˜์—๋Š” ์“ธ ์ˆ˜ ์—†๋‹ค โ€” ์˜†์ง‘ ์‚ฌ๋žŒ์„ ํšŒ์‚ฌ๊ฐ€ ๋ฉด์ ‘ํ•  ์ˆ˜๋Š” ์—†๋‹ค.

ํšŒ์‚ฌ๊ฐ€ ์‚ฌ๋žŒ์„ ์‹ฌ์‚ฌํ•  ์ˆ˜ ์—†๋Š” P2P ์—์„œ, ์‹ ๋ขฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€?

์ด ์งˆ๋ฌธ์ด ์„ค๊ณ„์˜ ์ค‘์‹ฌ์ด๋‹ค. ์‚ฌ๋žŒ์„ ์‹ฌ์‚ฌํ•˜๋Š” ๋Œ€์‹  ํ–‰์œ„์™€ ๋Œ€์ƒ์„ ๊ฒ€์ฆํ•œ๋‹ค โ€” ์ง€์—ญ ์ธ์ฆ, AI ๊ฐœ์ฒด ๋Œ€์กฐ, ์ƒํ˜ธ ํ›„๊ธฐ. ์ „๋ถ€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์„œ๋ฒ„๊ฐ€ ๊ฐ•์ œํ•œ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์‹œ์„ค ์„ ํƒ์—์„œ๋„ ๋ฐ˜๋ณต๋œ๋‹ค. ๋™๋„ค ๋ณ‘์›ยท๋ฏธ์šฉ์‹ค ํ›„๊ธฐ๋Š” ๋ฒ”์šฉ ์ง€๋„ ์„œ๋น„์Šค์— ์žˆ์ง€๋งŒ ์ž‘์„ฑ์ž๊ฐ€ ๊ทธ ๋™๋„ค ์‚ฌ๋žŒ์ธ์ง€, ์‹ค์ œ๋กœ ๊ฐ”๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์‹œ์„ค ์›์žฅ์€ ๊ณต๊ณต๋ฐ์ดํ„ฐ์—์„œ ๊ฐ€์ ธ์˜ค๊ณ , ํ›„๊ธฐ์—๋Š” ์ „ํ™” ์ธ์ฆ์„ ์š”๊ตฌํ•˜๋ฉฐ(๊ฐ€์ž… ์ „ ์‚ฌ์šฉ์ž๋Š” ํ›„๊ธฐ ํ•œ ๊ฑด๋งˆ๋‹ค ์žฌ์ธ์ฆ), ์—…์ฒด๋Š” ๊ตญ์„ธ์ฒญ ๊ณ„์†์‚ฌ์—…์ž ํ™•์ธ์„ ํ†ต๊ณผํ•ด์•ผ ์ž๊ธฐ ์‹œ์„ค์„ ์šด์˜ํ•œ๋‹ค. ๋ฐ˜๋ ค๋™๋ฌผ ๋งค์นญ๊ณผ ์‹œ์„ค ํ›„๊ธฐ๋ฅผ ํ•œ ์•ฑ์—์„œ ๋‹ค๋ฃจ๋Š” ์„œ๋น„์Šค๋Š” ์กฐ์‚ฌํ•œ ๋ฒ”์œ„์— ์—†์—ˆ๋‹ค.

๋ฌธ์ œ ์ •์˜ยท๊ธฐ์กด ์„œ๋น„์Šค ๋น„๊ตยท๊ฒ€์ฆ ๊ณ„ํš: docs/problem-statement.md

์Šคํฌ๋ฆฐ์ƒท

์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ (WYSIWYG) ์•ฝ์† ์บ˜๋ฆฐ๋”
์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ โ€” ๋“ฑ๋ก๋  ์นด๋“œ ๋ชจ์Šต ๊ทธ๋Œ€๋กœ ํŽธ์ง‘ ์•ฝ์† ์บ˜๋ฆฐ๋”
์‹œ์„ค ์ง€๋„ ์‹œ์„ค ์ƒ์„ธ (์ธ์ฆ ์—…์ฒด) ์ฑ„ํŒ…
์‹œ์„ค ์ง€๋„ (๋‹คํฌ) ์‹œ์„ค ์ƒ์„ธ โ€” ์ธ์ฆ ์—…์ฒด ์ •๋ณดยทํ›„๊ธฐ 1:1 ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…
๋‚ด ์ •๋ณด (ํŽซ ํžˆ์–ด๋กœ) ์—…์ฒด ๋ชจ๋“œ (๋‘ ์–ผ๊ตด) AI ์‹ ์› ์ธ์ฆ
๋‚ด ์ •๋ณด โ€” ๋ฐ˜๋ ค๋™๋ฌผ ํžˆ์–ด๋กœ ๊ฐ™์€ ๊ณ„์ •์˜ ์—…์ฒด ์–ผ๊ตด โ€” ์ƒํ˜ธยท์—…์ฒด ํ›„๊ธฐ ๋ฐ˜๋ ค๋™๋ฌผ AI ์˜์ƒ ์‹ ์› ์ธ์ฆ

์—”์ง€๋‹ˆ์–ด๋ง

๊ธฐ๋Šฅ ๋ชฉ๋ก๋ณด๋‹ค ์ด ์ ˆ์ด ์ €์žฅ์†Œ์˜ ์š”์ ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ „๋ถ€ CI ์—์„œ ๊ฐ•์ œ๋˜๋ฉฐ, ๊ฐ๊ฐ ์‹ค์ œ๋กœ ๋‹นํ•œ ์‚ฌ๊ณ ๊ฐ€ ์žˆ์–ด์„œ ๋งŒ๋“  ์žฅ์น˜์ž…๋‹ˆ๋‹ค.

์žฅ์น˜ ๋ฌด์—‡์„ ๋ง‰๋‚˜ ์œ„์น˜
dart:io ๊ธˆ์ง€ ๊ฒŒ์ดํŠธ ์›น์—์„œ ์ปดํŒŒ์ผ์€ ๋˜์ง€๋งŒ Platform.isIOS ๋“ฑ์ด ๋Ÿฐํƒ€์ž„์— UnsupportedError ๋ฅผ ๋˜์ง„๋‹ค โ€” ๋นŒ๋“œ๋กœ๋Š” ์•ˆ ์žกํžˆ๊ณ  ํฐ ํ™”๋ฉด์œผ๋กœ๋งŒ ๋“œ๋Ÿฌ๋‚œ๋‹ค ci.yml
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋นˆ DB ์— ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ 175๊ฑด์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์žฌ์ƒํ•ด ์šด์˜ ์Šค๋ƒ…์ƒท๊ณผ ๋Œ€์กฐ โ€” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์—†์ด ์šด์˜ DB ์— ์ง์ ‘ ์นœ DDL ์ด ์ฆ‰์‹œ ๋นจ๊ฐ„๋ถˆ pmdb/db-tests.yml
pgTAP ๋ถˆ๋ณ€์‹ 16์ข… ์ž๊ธฐ์ดˆ๋Œ€ ์ฐจ๋‹จยทํŒ”๋กœ์šฐ ์–ผ๊ตด ๋ถ„๋ฆฌยท์ฑ„ํŒ… ์‚ญ์ œ ๊ถŒํ•œ ๋“ฑ์„ DB ๋ ˆ๋ฒจ์—์„œ ๊ฒ€์ฆ(ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ) pmdb/tests/
์ปค๋ฒ„๋ฆฌ์ง€ ๋ž˜์นซ (โ‰ฅ17%) ๋‹ฌ์„ฑ ๋ชป ํ•  80% ๋ฅผ ์ ์–ด ๋‘๋Š” ๋Œ€์‹  ํ˜„์žฌ๊ฐ’์„ ํ•˜ํ•œ์œผ๋กœ ๊ณ ์ • โ€” ๋–จ์–ด์ง€๋ฉด ์‹คํŒจ ci.yml
catch (_) ๋ž˜์นซ (โ‰ค122) ์˜ˆ์™ธ๋ฅผ ์‚ผํ‚จ ํŒ๋‹จ์ด ๋Ÿฐํƒ€์ž„์— ํ”์ ์„ ์•ˆ ๋‚จ๊ธฐ๋Š” ๊ฒƒ โ€” ์„ธ ๋“ฑ๊ธ‰ ์ค‘ ํ•˜๋‚˜๋ฅผ ์“ฐ๊ฒŒ ๊ฐ•์ œํ•œ๋‹ค(์ •์ฑ…) ci.yml
์›น ๋นŒ๋“œ ๊ฒŒ์ดํŠธ ์•ฑ ๋ณ€๊ฒฝ์ด ์›น ๋ฒˆ๋“ค์„ ์กฐ์šฉํžˆ ๊นจ๋Š” ๊ฒƒ ci.yml
ํฌ๋งทยท์ •์  ๋ถ„์„ dart format --set-exit-if-changed, flutter analyze ci.yml

๊ทœ๋ชจ โ€” Dart 48,869์ค„(ํ™”๋ฉด 59๊ฐœ) ยท ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ 175๊ฑด ยท Edge Functions 20๊ฐœ ยท ํ…Œ์ด๋ธ” 50 ยท RLS ์ •์ฑ… 76 ยท ํŠธ๋ฆฌ๊ฑฐ 73 ยท DB ํ•จ์ˆ˜ 180

์•Œ๋ ค์ง„ ํ•œ๊ณ„

์ง์ ‘ ์ง„๋‹จํ•ด ํ‹ฐ์ผ“์œผ๋กœ ๋‚จ๊ธด ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ๊ฐ์ถ”์ง€ ์•Š๋Š” ํŽธ์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

๋ถ€์ฑ„ ํ˜„ํ™ฉ
๊ด€์ธก์„ฑ 3๋“ฑ๊ธ‰ ์ •์ฑ… + ์ž์ฒด ์ˆ˜์ง‘(app.client_errors)ยท๊ด€๋ฆฌ์ž ํ™”๋ฉด๊นŒ์ง€ ๋ถ™์˜€๋‹ค(error-policy.md). ๋“ฑ๊ธ‰ํ™”๊ฐ€ ๋‚จ์€ catch (_) 122๊ณณ(162โ†’122)์€ CI ๋ž˜์นซ์œผ๋กœ ์ค„์ด๋Š” ์ค‘ (#157)
God Widget 1,000์ค„ ๋„˜๋Š” ํ™”๋ฉด 8๊ฐœ(์ตœ๋Œ€ 2,065์ค„) (#155)
์ƒํƒœ๊ด€๋ฆฌยทDI ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ChangeNotifier ํ™€๋”๋กœ ์ ์ง„ ์ „ํ™˜ ์ค‘(59๊ฐœ ์ค‘ 6๊ฐœ) (#156 ยท ADR-0008)
์ปค๋ฒ„๋ฆฌ์ง€ 17% ์œ„ ๊ตฌ์กฐ์˜ ๊ฒฐ๊ณผ. ๋ž˜์นซ์œผ๋กœ ํ•˜ํ•œ๋งŒ ์ง€ํ‚ค๋Š” ์ค‘ (#158)
i18n ๋ฏธ๋„์ž… ํ•˜๋“œ์ฝ”๋”ฉ ํ•œ๊ธ€ ๋ฌธ์ž์—ด (#159)

์„ค๊ณ„ ๊ฒฐ์ • ๊ธฐ๋ก (ADR) โ€” docs/adr/

์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์„ ํƒ์˜ ๋Œ€๊ฐ€๋กœ ๋ฌด์—‡์„ ๋ฐŸ์•˜๋Š”์ง€ ๋ฅผ 10๊ฑด์œผ๋กœ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์ฆ์ƒ๊ณผ ์›์ธ์ด ๋ฉ€์–ด์„œ ๊ธฐ๋กํ•ด ๋‘˜ ๊ฐ€์น˜๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

๊ฒฐ์ • ๋ฌด์—‡์„ ๋ฐŸ์•˜๋‚˜
Supabase Auth ๋Œ€์‹  ์ปค์Šคํ…€ ์ธ์ฆ ๋ฌด์ƒํƒœ JWT ๋ผ ์ •์ง€์‹œํ‚จ ์‚ฌ์šฉ์ž๊ฐ€ 30์ผ๊ฐ„ ๊ณ„์† ์ ‘๊ทผ๋๋‹ค
๋ถˆ๋ณ€์‹์€ DB ์—์„œ ๊ฐ•์ œ ํ•จ์ˆ˜๋Š” ๋ง‰๊ณ  ์žˆ์—ˆ์ง€๋งŒ PostgREST ์ง์ ‘ INSERT ๋กœ ๋šซ๋ ธ๋‹ค
DEFINER ๊ฐ์ฒด์— ์“ฐ๊ธฐ ๊ฒฝ๋กœ ๊ธˆ์ง€ ๊ณต๊ฐœ anon ํ‚ค๋งŒ์œผ๋กœ ๋กœ๊ทธ์ธ ์—†์ด ๊ด€๋ฆฌ์ž ์Šน๊ฒฉ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค(์‹ค์ฆ ํ™•์ธ)
RLS ๋น„๊ฐ€์‹œ ํ–‰ ์“ฐ๊ธฐ ์†Œํ”„ํŠธ ์‚ญ์ œ๊ฐ€ 42501. INVOKER RPC ๋Š” ์—๋Ÿฌ ์—†์ด NULL ์„ ๋Œ๋ ค์ค€๋‹ค
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ์ผœ์ž๋งˆ์ž ์žฌ์ •์˜๋กœ ์œ ์‹ค๋œ ์•Œ๋ฆผ ํ•„ํ„ฐ๊ฐ€ ์žกํ˜”๋‹ค
dart:io CI ๊ธˆ์ง€ ์ปดํŒŒ์ผ์€ ๋˜๋Š”๋ฐ ๋Ÿฐํƒ€์ž„์— ํฐ ํ™”๋ฉด

์ „์ฒด 10๊ฑด๊ณผ ํ˜•์‹์€ docs/adr/README.md.


์ฃผ์š” ๊ธฐ๋Šฅ

์˜์—ญ ๋‚ด์šฉ
๐Ÿ˜๏ธ ๋™๋„ค ์ธ์ฆ GPS + ํ–‰์ •๋™ ์—ญ์ง€์˜ค์ฝ”๋”ฉ ๊ธฐ๋ฐ˜ ์ง€์—ญ ์ธ์ฆ(30์ผ ์ฃผ๊ธฐ ์žฌ์ธ์ฆ) โ€” ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€ยทํ”ผ๋“œ๊ฐ€ ์ธ์ฆ ๋™๋„ค ๊ธฐ์ค€
๐Ÿ• ๋งค์นญ ๋™๋ฐ˜์‚ฐ์ฑ… / ๋Œ€๋ฆฌ์‚ฐ์ฑ… / ๋Œ๋ด„ / ๋ถ„์–‘ / ์ž…์–‘ ๊ฒŒ์‹œ๊ธ€ โ†’ ์ง€์› โ†’ ์ˆ˜๋ฝ โ†’ ์•ฝ์† โ†’ ์ƒํ˜ธ ํ›„๊ธฐ
๐Ÿ“ธ AI ์‚ฌ์ง„ ์ธ์ฆ ๋ฐ˜๋ ค๋™๋ฌผ ์‹ ์› ์ธ์ฆ(์˜์ƒ ๋“ฑ๋ก) + ๊ฒŒ์‹œ๊ธ€ ์‚ฌ์ง„ ์‹ค์กด ๊ฒ€์ฆ(AI ๊ฐœ์ฒด ๋Œ€์กฐยท์œ„์น˜ ๊ฒ€์ฆ) โ€” ํ—ˆ์œ„ ๋งค๋ฌผ ์ฐจ๋‹จ
๐Ÿ—บ๏ธ ์‹œ์„ค ์ง€๋„ ๋„ค์ด๋ฒ„ ์ง€๋„ ๊ธฐ๋ฐ˜ ๋ฐ˜๋ ค๋™๋ฌผ ์‹œ์„ค(๋ณ‘์›ยท์นดํŽ˜ ๋“ฑ) ํƒ์ƒ‰, ๋ฐฉ๋ฌธ ํ›„๊ธฐยท๋ณ„์ ยทํ›„๊ธฐ ๋Œ“๊ธ€
๐Ÿช ์—…์ฒด ๊ณ„์ • ์‚ฌ์—…์ž ์ธ์ฆ(๊ตญ์„ธ์ฒญ ์กฐํšŒ + ๊ณต๊ณต๋ฐ์ดํ„ฐ ๋Œ€์กฐ ์ž๋™์Šน์ธ) โ€” ํ•œ ๊ณ„์ •์— ๊ฐœ์ธ/์—…์ฒด ๋‘ ์–ผ๊ตด ๋ถ„๋ฆฌ
๐Ÿ’ฌ ์ฑ„ํŒ… 1:1 ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…(Realtime), ์‚ฌ์ง„ ์ „์†ก, ๋ฉ”์‹œ์ง€ ์‚ญ์ œ(30์ผ ์œ ์˜ˆ ํŒŒ๊ธฐ), ์—…์ฒด ๋ฌธ์˜ ๋ถ„๋ฆฌ
๐Ÿ”” ์•Œ๋ฆผ FCM ํ‘ธ์‹œ + ์ธ์•ฑ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ํƒญ ์‹œ ํ•ด๋‹น ํ™”๋ฉด ์งํ–‰ ๋”ฅ๋งํฌ, ์œ ํ˜•๋ณ„ ์ˆ˜์‹  ์„ค์ •
๐Ÿ‘ฅ ์†Œ์…œ ํŒ”๋กœ์šฐ(Pawing/Pawmate โ€” ๊ฐœ์ธยท์—…์ฒด ์–ผ๊ตด ๋…๋ฆฝ), ์‚ฌ์šฉ์žยท๋ฐ˜๋ ค๋™๋ฌผยท์ƒํ˜ธ ๊ฒ€์ƒ‰

์•„ํ‚คํ…์ฒ˜

flowchart LR
    subgraph App["๐Ÿ“ฑ Flutter (this repo)"]
        UI[Screens / Widgets] --> SVC[Services ยท Repository ๊ณ„์ธต]
        MOTION[motion/ ์Šคํ”„๋ง ๋ชจ์…˜ ์‹œ์Šคํ…œ] --> UI
    end
    subgraph Supabase["โ˜๏ธ Supabase (pmdb repo)"]
        PG[(PostgreSQL<br/>RLS ยท ํŠธ๋ฆฌ๊ฑฐ ยท RPC)]
        EF[Edge Functions<br/>Deno]
        RT[Realtime]
        ST[Storage]
    end
    SVC -- "PostgREST + ์ปค์Šคํ…€ JWT" --> PG
    SVC -- "์ธ์ฆ/SMS/AI ๊ฒ€์ฆ" --> EF
    SVC -- "์ฑ„ํŒ…ยท์•Œ๋ฆผ ๊ตฌ๋…" --> RT
    SVC -- "์ด๋ฏธ์ง€ ์—…๋กœ๋“œ" --> ST
    EF --> EXT["๊ตญ์„ธ์ฒญ ยท Solapi SMS ยท Gemini ยท<br/>juso.go.kr ยท ๋„ค์ด๋ฒ„ ์ง€์—ญ๊ฒ€์ƒ‰"]
    PG -- "pg_cron + pg_net" --> FCM[FCM ํ‘ธ์‹œ]
Loading
  • ์ธ์ฆ: ์ „ํ™”๋ฒˆํ˜ธ OTP ๊ธฐ๋ฐ˜ ์ปค์Šคํ…€ ์ธ์ฆ(HS256 JWT + refresh ํ† ํฐ). Supabase Auth ๋ฏธ์‚ฌ์šฉ โ€” ๋ชจ๋“  RLS ๊ฐ€ app.uid()(JWT sub) ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. โ†’ ADR-0001
  • ๋ณด์•ˆ ์›์น™: ํด๋ผ์ด์–ธํŠธ์—๋Š” publishable ํ‚ค๋งŒ. ์“ฐ๊ธฐ ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ์ž‘์—…์€ SECURITY DEFINER RPC / DB ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์ตœ์ข… ๊ฐ•์ œ(ํด๋ผ์ด์–ธํŠธ ๊ฒ€์ฆ์€ UX ์šฉ). โ†’ ADR-0002 ยท ADR-0003
  • ๋ชจ์…˜: lib/motion/ ์˜ ์Šคํ”„๋ง ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ(PressableยทEntranceยทCollapseRoute ๋“ฑ)๋ฅผ ์ „ ํ™”๋ฉด์ด ๊ณต์œ  โ€” ์นด๋“œ ํ™•์žฅ/์ถ•์†Œ, ์“ธ์–ด๋‚ด๋ ค ๋‹ซ๊ธฐ ๋“ฑ ์ผ๊ด€๋œ ์ „ํ™˜ ์–ธ์–ด.

์ €์žฅ์†Œ ๊ตฌ์กฐ

lib/
  main.dart          # ์•ฑ ์ดˆ๊ธฐํ™” ยท ํ‘ธ์‹œ/๋”ฅ๋งํฌ ๋ผ์šฐํŒ…
  screen/            # ํ™”๋ฉด (tabs/ ๋ฉ”์ธ 5ํƒญ, admin/ ๊ด€๋ฆฌ์ž)
  services/          # Supabase ์ ‘๊ทผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ยท ํ‘ธ์‹œ ยท ์‹ค์‹œ๊ฐ„ ยท ์œ„์น˜
  state/             # ํ™”๋ฉด ์ƒํƒœ ํ™€๋” (ChangeNotifier โ€” docs/architecture-state.md)
  models/            # ๋„๋ฉ”์ธ ๋ชจ๋ธ
  widgets/           # ๊ณต์šฉ ์œ„์ ฏ (ํ”ผ๋“œ ์นด๋“œ ยท ํƒ€์ผ ยท ์‹œํŠธ)
  motion/            # ์Šคํ”„๋ง ๋ชจ์…˜ ์‹œ์Šคํ…œ (์ „ํ™˜ ยท ์ด‰๊ฐ ํ”ผ๋“œ๋ฐฑ)
  theme/             # ๋ผ์ดํŠธ/๋‹คํฌ ํŒ”๋ ˆํŠธ ยท ํ…Œ๋งˆ
  utils/             # platform_info ยท ์กฐ๊ฑด๋ถ€ import ํŒŒ์‚ฌ๋“œ(์›น ๋Œ€์‘)
docs/
  adr/               # ์„ค๊ณ„ ๊ฒฐ์ • ๊ธฐ๋ก
  web-port.md        # ์›น ์ด์‹ ์„ค๊ณ„ยท๋ฐฐํฌยท๊ฒ€์ฆ ํ•จ์ •
  architecture-state.md  # ์ƒํƒœ ํ™€๋” ํŒจํ„ด
test/                # ์œ„์ ฏยท์ƒํƒœ ํ™€๋” ํ…Œ์ŠคํŠธ (34๊ฐœ ํŒŒ์ผ)

๊ด€๋ จ ์ €์žฅ์†Œ

์ €์žฅ์†Œ ๋‚ด์šฉ
pmdb Supabase ๋ฐฑ์—”๋“œ โ€” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ 175๊ฑด ยท Edge Functions 20๊ฐœ ยท pgTAP 16์ข… ยท ๋ฆฌํ”Œ๋ ˆ์ด CI ยท DB ์ „์ฒด ๋ ˆํผ๋Ÿฐ์Šค ๋ฌธ์„œ
pmlegal ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€ ยท ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ ยท ์œ„์น˜๊ธฐ๋ฐ˜์„œ๋น„์Šค ์•ฝ๊ด€ (์ •๋ณธ)

์‹คํ–‰

# Flutter stable ์ฑ„๋„ (Dart SDK ^3.12)
flutter pub get
flutter run          # ์—ฐ๊ฒฐ๋œ ๊ธฐ๊ธฐ/์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ
flutter run -d chrome  # ์›น

# ๊ฒ€์‚ฌ & ํ…Œ์ŠคํŠธ (CI ์™€ ๋™์ผ)
dart format --output=none --set-exit-if-changed lib test
flutter analyze --no-fatal-infos
flutter test --coverage
  • ์ง€๋„ยทSupabase ๋“ฑ ํด๋ผ์ด์–ธํŠธ ๊ณต๊ฐœ ํ‚ค๋Š” lib/env.dart ์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, --dart-define=SUPABASE_URL=... ๋“ฑ์œผ๋กœ ํ™˜๊ฒฝ๋ณ„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์†Œ๊ฒ€์ƒ‰(ํ–‰์•ˆ๋ถ€ juso) ํ‚ค๋Š” ์ฟผํ„ฐ ๋‚จ์šฉ ์—ฌ์ง€๊ฐ€ ์žˆ์–ด ๊ธฐ๋ณธ๊ฐ’ ์—†์ด --dart-define=JUSO_API_KEY=... ๋กœ๋งŒ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค โ€” ๋ฏธ์„ค์ • ์‹œ ์ฃผ์†Œ ๊ฒ€์ƒ‰๋งŒ ๋น„ํ™œ์„ฑํ™”๋˜๊ณ (์ˆ˜๋™ ์ž…๋ ฅ ํด๋ฐฑ) ๋‚˜๋จธ์ง€ ๊ธฐ๋Šฅ์€ ์ •์ƒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ํ‘ธ์‹œ(FCM/APNs)๋Š” ์‹ค๊ธฐ๊ธฐ + ์„œ๋ช… ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

MIT

About

๐Ÿพ PawMate โ€” ๋™๋„ค ๊ธฐ๋ฐ˜ ๋ฐ˜๋ ค๋™๋ฌผ ์‚ฐ์ฑ…ยท๋Œ๋ด„ ๋งค์นญ & ์ปค๋ฎค๋‹ˆํ‹ฐ ์•ฑ (Flutter + Supabase)

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages