[๐งโ๐ป] Secret Messenger ๊ฐ๋ฐ ์ผ์ง #1: Flutter Web + Node (Vibe Coding Test)
โจ GPT์ ์์ฝ ใ
์ค๊ตญ ๋ด ํ๋ถ๋ฏผ์ ์ํ ๋ณด์ ์ค์ฌ ๋ฉ์ ์ ์ ๊ธฐ์ ๊ตฌ์กฐ ๋ฐ ๋ณด์ ์ค๊ณ๋ฅผ ์๋ฃํ๊ณ , Flutter Web + Node ๊ธฐ๋ฐ์ MVP ๊ฐ๋ฐ ํ๋์ ์์ฑํ ํ๋ฃจ.
๐งฎ Secret Messenger
์ค๊ตญ ๋ด์์ ์ ๋ถ์ฆ ์์ด ์ด์๊ฐ๋ ํ๋ถ๋ฏผ ์ฌ์ฉ์๋ค์ ์ํ ๋ฉ์ ์ ์ ๋๋ค.
- ๐ฑ ์ค์น ์์ด ๋ธ๋ผ์ฐ์ ๋ก ์ ์ ๊ฐ๋ฅํ๋ฉฐ
- ๐ฌ ์ ๋ณด ์์ , ๋น๋ฐ ๋ํ, ํ์ผ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ
- ๐ก๏ธ Flutter Web ๊ธฐ๋ฐ ๋ณด์ ์ค์ฌ ์ปค๋ฎค๋์ผ์ด์ ํด์ ๋๋ค.
๋ณธ ํ๋ก์ ํธ๋ ์ ์น์ ๋ชฉ์ ์ด ์๋ ์ธ๊ถ ๋ณดํธ์ ์์กด ์ง์์ ์ํ ๊ธฐ์ ์คํ์ด๋ฉฐ,
๊ณต๊ฐ ๋ฐฐํฌ ๋๋ ์์ ์ ํ์ฉ์ ์ ์ ๋ก ํ์ง ์์ต๋๋ค.
(๐ GitHub Private Repo๋ก๋ง ๊ด๋ฆฌ๋ฉ๋๋ค.)
๐ ํ๋ก์ ํธ ๊ฐ์
ํญ๋ชฉ | ๋ด์ฉ |
---|---|
์ฌ์ฉ์ | ๋์งํธ ๋ฌธํด๋ ฅ์ด ๋งค์ฐ ๋ฎ๊ณ , ํด๋ํฐ์ ๊ณต์์๊ฒ ๊ฐ์๋ฐ๋, ์ค๊ตญ ๋ด ํ๋ถ๋ฏผ |
๋ชฉํ | ์ ๋ณด ๊ณต์ , ๋น๋ฐ ์ฑํ , ์์ ํ ํ์ผ ๊ณต์ |
ํํ | ์ค์น ํ์ ์๋, ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ Flutter Web SPA |
๋๋ฉ์ธ | https://???.net (๊ณ์ฐ๊ธฐ UI ์์ฅ) |
UI ์์ฅ ์ ๋ต | ๊ณ์ฐ๊ธฐ์ฒ๋ผ ๋ณด์ด๋ ์ฒซ ํ๋ฉด โ ํน์ ์ฐ์ฐ ์ ๋ ฅ ์ ์๋ฒ์ ์ง์ ์์ฒญ |
์ง์ ๋ฐฉ์ | Flutter Web์ ์ง์ ํค๋ฅผ ์๋ฒ์ POSTํ๊ณ , ์๋ฒ๊ฐ ํ๋จ ํ ์ ๊ทผ ํ ํฐ ๋ฐ๊ธ |
์ฝ๋ ๋ณด์ ์ ๋ต | ๋ฏผ๊ฐํ ์กฐ๊ฑด/๋ก์ง์ ํด๋ผ์ด์ธํธ์ ํฌํจ๋์ง ์๊ณ , ๋ชจ๋ ์๋ฒ ์ธก์์ ํ๋จ |
๊ธฐ๋ฅ ์ฐ์ ์์ | โ ์ ๋ณด ์์ โ โก ์ฑํ โ โข ํ์ผ ๊ณต์ |
๐งช ๋ฐ์ด๋ธ ์ฝ๋ฉ ์คํ ํ๋ก์ ํธ
์ด ํ๋ก์ ํธ๋ ๋์์ ๋ฐ์ด๋ธ ์ฝ๋ฉ(Vibe Coding)์ด๋ผ๋ ๊ฐ๋ฐ ๋ฐฉ์์
์ค์ ์ ์ฉ ๊ฐ๋ฅ์ฑ๊ณผ ํ๊ณ๋ฅผ ์คํํ๋ MVP์
๋๋ค.
- ์์ฐ์ด๋ก ์ค๊ณ ๋ฐ ๊ตฌํ์ ์งํํ๋ฉฐ, ๋๋ถ๋ถ์ ์ฝ๋ ์์ฑ์ AI์ ๋์์ผ๋ก ์ํ๋ฉ๋๋ค.
- ์ฌ์ฉ์๋ ์ค์ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๋ณด๋จ โ์ค๊ณ์/์กฐ์จ์โ์ ์ญํ ์ ์ํํฉ๋๋ค.
- ๋ชฉํ๋ AI ์ฃผ๋ ๊ฐ๋ฐ์ ํจ์จ์ฑ๊ณผ ์ํ ์์๋ฅผ ํ์ค์์ ํ๊ฐํ๋ ๊ฒ์ ๋๋ค.
์ด ์คํ์ ํตํด ํฅํ AI ๊ธฐ๋ฐ ๊ฐ๋ฐ ๋ฐฉ์์ ๋ฏธ๋๋ฅผ ํ์ํ๊ณ ,
์ค์ ์ธ๊ถ ํ๋ก์ ํธ์ ์ ์ฉ ๊ฐ๋ฅํ ์์ค์ธ์ง ๊ฒ์ฆํฉ๋๋ค.
โ๏ธ ๊ธฐ์ ์คํ
๐ท ํ๋ก ํธ์๋ (Flutter Web)
-
Flutter 3.x
(Web build) -
Material 3
(๊ณ์ฐ๊ธฐ UI ์์ฅ์ ์ต์ ) -
go_router
(ํ์ด์ง ์ ํ ๋ฐ ์จ๊ฒจ์ง ์ง์ ๊ตฌ์ฑ) -
Riverpod
(์ํ ๊ด๋ฆฌ: UUID, ์ธ์ ๋ฑ) -
http
(REST API ํต์ )
๐ UI ์ ๋ต
- ์ด๊ธฐ ํ๋ฉด: ๊ณ์ฐ๊ธฐ ํํ์
TextField + ๋ฒํผ ๊ทธ๋ฆฌ๋
- ํน์ ์ฐ์ฐ ์ ๋ ฅ โ ์๋ฒ๋ก ์ ์ก โ ์ ํจ ์ ๋ด๋ถ ์ง์ ํ์ฉ
- ํด๋ผ์ด์ธํธ์๋ ์ง์ ํธ๋ฆฌ๊ฑฐ๋ ๋ก์ง์ด ํฌํจ๋์ง ์์
๐ท ๋ฐฑ์๋ (Node.js + Express)
Node.js 18+
-
Express.js
(REST API ์๋ฒ) -
SQLite
(ํ์ผ ๊ธฐ๋ฐ ๋ก์ปฌ DB) -
Multer
(ํ์ผ ์ ๋ก๋) -
node-cron
(TTL ๊ธฐ๋ฐ ์ญ์ ์ค์ผ์ค๋ฌ) -
CORS
,helmet
,rate-limit
๋ฑ ๋ณด์ ๋ฏธ๋ค์จ์ด ๊ตฌ์ฑ
๐ ์ฃผ์ API
-
POST /check-trigger
- ์ ๋ ฅ๋ ๋ฌธ์์ด์ ์๋ฒ๊ฐ ํ์ธ
- ์ฌ์ ๋ฑ๋ก๋ ํธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด๊ณผ ์ผ์นํ๋ฉด ์ธ์ ํ ํฐ ๋ฐ๊ธ
-
GET /session/:id
๋๋/inbox/:key
- ์๋ฒ๊ฐ ๋ฐ๊ธํ ์ธ์ ํค๋ฅผ ๊ฐ์ง ์ฌ์ฉ์๋ง ๋ด๋ถ ๊ธฐ๋ฅ ์ ๊ทผ ๊ฐ๋ฅ
-
POST /message
,GET /messages
- TTL ๊ธฐ๋ฐ ๋ฉ์์ง ์ ์ฅ/์กฐํ
-
POST /upload
,GET /file/:id
- ํ์ผ ์ ๋ก๋ ๋ฐ ์๋ ์ญ์ ์ง์
๐ท ์ธํ๋ผ / ๋ฐฐํฌ
-
Docker
(์๋ฒ ํ๊ฒฝ ์ผ๊ดํ ๋ฐ ์ด์์ฑ ํ๋ณด) -
Ubuntu 22.04 LTS
(Vultr VPS) -
Vultr VPS (ํ์ฝฉ ๋ฆฌ์ )
โ ์ค๊ตญ ์ ์ ์์ ์ฑ ํ๋ณด -
Cloudflare
(DNS ํ๋ก์ + SSL + IP ์ํ) - ๋๋ฉ์ธ:
???.net
โ ๊ณ์ฐ๊ธฐ ์์ฅ์ฉ ๋๋ฉ์ธ
๐ ๋ณด์ ์ ๋ต
ํญ๋ชฉ | ์ค๋ช |
---|---|
์ฝ๋ ๋ถ๋ฆฌ | ์ง์ ๋ก์ง, ํธ๋ฆฌ๊ฑฐ ๋ฑ ๋ฏผ๊ฐ ์ฝ๋๋ ์๋ฒ ์ ์ฉ |
Flutter Web ์ญํ ์ ํ | UI ๋ ๋๋ง๊ณผ ์ ๋ ฅ ์ ์ก๋ง ์ํ |
HTTPS ๊ฐ์ | Cloudflare + Letโs Encrypt |
Cloudflare ํ๋ก์ | ์๋ฒ IP ์ํ ๋ฐ DDOS ๋ฐฉ์ด |
CORS ์ ํ | ํ์ฉ๋ ๋๋ฉ์ธ ์ธ ์์ฒญ ์ฐจ๋จ |
no-cache ์ ์ฑ | ๋ชจ๋ ์๋ต์ no-store ํค๋ ์ ์ฉ |
๋ฉ์์ง TTL | ์์ฑ ์๊ฐ ๊ธฐ๋ฐ ์๋ ์ญ์ |
ํ์ผ TTL | ์ ๋ก๋ ํ ์ ํด์ง ์๊ฐ ๋ด ์ญ์ (node-cron ์ฒ๋ฆฌ) |
๋ก์ปฌ ์ ์ฅ ์ ํ | localStorage/cookie ์ต์ํ or ์ฌ์ฉ ๊ธ์ง |
๐๏ธ ๊ธฐ๋ฅ ๋ชฉ๋ก
๊ธฐ๋ฅ | ์ํ | ์ค๋ช |
---|---|---|
๐ง ์์ฅ UI | ๐ข ๊ตฌํ ์ค | ๊ณ์ฐ๊ธฐ UI๋ก ์์ฅ, ์๋ฒ ํตํ ์ง์ ์กฐ๊ฑด ์ ์ฉ |
๐ฅ ์ ๋ณด ์์ | ๐ข ์ค๋น ์ค | ๊ด๋ฆฌ์ ๊ณต์ง (์ฝ๊ธฐ ์ ์ฉ) |
๐ฌ ์ฑํ ๋ฐฉ | ๐ก ๊ฐ๋ฐ ์์ | ์ต๋ช ๊ทธ๋ฃน ์ฑํ (TTL ๊ธฐ๋ฐ) |
๐ ํ์ผ ๊ณต์ | ๐ก ๊ฐ๋ฐ ์์ | ์๋ ์ญ์ ์ค์ ๋ ํ์ผ ๊ณต์ |
๐ฅ ์ญ์ ์์คํ | ๐ก ๊ฐ๋ฐ ์์ | ๋ฉ์์ง/ํ์ผ TTL ์ญ์ ์๋ํ |
๐ ๊ฐ๋ฐ ๋จ๊ณ ๋ก๋๋งต
- โ๏ธ ์์คํ ๊ตฌ์กฐ ์ค๊ณ ๋ฐ ๋ณด์ ๋ชจ๋ธ ์๋ฆฝ
- ๐ ๊ธฐ์ ์คํ ํ์ + ์์ฅ ์ ๋ต ๊ฒฐ์
-
๐ ๋๋ฉ์ธ ๊ตฌ๋งค (
???.net
) - ๐จ Flutter Web ๊ณ์ฐ๊ธฐ scaffold
- ๐จ Express + SQLite API scaffold
- ๐ ์ง์ ํค ์๋ฒ ์ฒ๋ฆฌ ๊ตฌ์กฐ ๊ตฌ์ถ
- ๐ฆ Docker + ๋ฐฐํฌ ์๋ํ
- ๐ VPS ๋ฐฐํฌ + Cloudflare ํตํฉ
- ๐งช MVP ํ ์คํธ
- ๐ฏ ์์ ํ ๋ฐ ๋ด๋ถ ๋ฐฐํฌ
๐ ์ฐธ๊ณ ์ฌํญ
- GitHub์๋ ๋ฏผ๊ฐํ ์ฝ๋๋ ์ ๋ณด๋ฅผ ์ ๋๋ก ์ปค๋ฐํ์ง ์์ต๋๋ค.
- ๋ฐฐํฌ์ฉ Flutter ์ฝ๋๋
build/
๋๋ ํ ๋ฆฌ๋ก, ์๋ฒ ์ฝ๋๋ ์ค์ง Docker ์ปจํ ์ด๋ ๋ด์์๋ง ์คํ๋ฉ๋๋ค. - ๋ชจ๋ API ํต์ ์ HTTPS๋ก ์ํธํ๋๋ฉฐ, ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ TTL ์ค์ ์ดํ ์๋ ํ๊ธฐ๋ฉ๋๋ค.
- ๊ณ์ฐ๊ธฐ ์ง์ ํค, ์ฌ์ฉ์ UUID ๋ฑ ๋ฏผ๊ฐ ์ ๋ณด๋ ํ๋ก ํธ์๋์ ์ ๋ ํฌํจ๋์ง ์์ผ๋ฉฐ, ์๋ฒ ๋ด๋ถ์ ๋น๊ณต๊ฐ ๊ฒ์ฆ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก๋ง ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ์ง์ ์กฐ๊ฑด ํ์ธ ๋ฐ ์ฌ์ฉ์ ์๋ณ์ ์๋ฒ ์ธก์์๋ง ์ํ๋๋ ๋จ๋ฐฉํฅ ๊ฒ์ฆ ๋ก์ง์ผ๋ก ๊ตฌ์ฑ๋์ด, Flutter Web ์ฝ๋๊ฐ ๋ ธ์ถ๋๋๋ผ๋ ๋ณด์ ์ ๋ณด๋ ์ธ๋ถ์ ๋๋ฌ๋์ง ์์ต๋๋ค.
๐ค ๊ฐ๋ฐ์ ๋ฉ๋ชจ
์ด ํ๋ก์ ํธ๋ ๋จ์ํ ์ฑ์ด ์๋๋ผ,
์ด๋ค ์ด๋ค์๊ฒ ์ถ๊ณผ ์ฐ๊ฒฐ๋๋ ์์กด ๋๊ตฌ์ผ ์ ์๋ค๋ ๋ง์์ผ๋ก ์์ํฉ๋๋ค.
๊ธฐ์ ์ด ๊ฐ์์ ๋๊ตฌ๊ฐ ์๋,
์์ ๋ฅผ ์ํ ๋๊ตฌ๊ฐ ๋ ์ ์๋๋ก.
๐ญ ์ผ๊ธฐ
๋๋ ๋ฌด์์ ์ํด ์ฌ๋๊ฐ? ๋ถ์ ๋ช ์? ์๋, ๊ทธ๋ฐ ์ข ๋ฅ์ ๊ฒ๋ค์ ์ ์ด์ ๋ชฉํ๊ฐ ๋ ์ ์๋ ํ์์ด๋ค. ์ค๋ก์ง ์๋จ์ผ ๋ฟ์ด๋ค.
๋ด๊ฐ ์ง์ ์ผ๋ก ์ํ๋ ์ถ์ ๋ฌด์์ธ๊ฐ? โฆ ๊ธ์, ์ ์๋ด๋ฆฌ์ง๋ ๋ชปํ๊ฒ ๋ค. ์ด์จ๋ ํ๋๋ ์ฌ๋ / ์ด์ ์ฌ๋
์ด๋ผ๋ ํฐ ๋ฒ์ฃผ ์์ ํฌํจ๋๋ ์ถ์ด๋ผ๋ ๊ฒ์ ๋ช
ํํ๋ค.
์ด์จ๋ , ์ด ํ๋ก์ ํธ๊ฐ ๋ด ์ฌ์ฅ์ ๋ฐ๊ฒ ํ๊ณ ํฌ์ด์ ๋๋ผ๊ฒ ํ๋ ๊ฒ์ ๋ณด๋ฉด, ์ง๊ธ ๋น์ฅ ๋ด๊ฐ ๊ฐ์ฅ ํ๊ณ ์ถ์๋ ๊ฒ์ ์ด๋ฌํ ์ข ๋ฅ์ ๊ฒ๋ค์ด ๋ง์ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋, ์ผ๋จ ์ด๊ฒ๋ถํฐ ์์ํ์.
๋๊ธ ๋จ๊ธฐ๊ธฐ