Skip to content

Latest commit

ย 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“ ๋‹ฌ๋ ˆ ์Šคํ„ฐ๋”” ํ”ผ๋“œ๋ฐฑ

์Šคํ„ฐ๋”” ์ฐธ๊ฐ€์ž ํ”ผ๋“œ๋ฐฑ์„ ํ•œ๊ณณ์— ๋ชจ์œผ๋Š” ์‚ฌ์ดํŠธ. https://feedback.dalestudy.com

์Šคํ„ฐ๋””ยทํ”„๋กœ์ ํŠธ(dalestudy.com/programs ์˜ ํ”„๋กœ๊ทธ๋žจ) ๋ฆฌ๋”๋งˆ๋‹ค ๋‹ค๋ฅธ ๋„๊ตฌ๋กœ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๋‹ค ๋ณด๋‹ˆ ์ง€๋‚œ ๊ธฐ์ˆ˜ ํ”ผ๋“œ๋ฐฑ์„ ์ฐพ๊ธฐ๋„, ๊ธฐ์ˆ˜ ๊ฐ„ ๋น„๊ต๋„ ์–ด๋ ค์› ๋‹ค. GitHub ๋กœ๊ทธ์ธ์œผ๋กœ ์ค‘๋ณต ์‘๋‹ต์„ ๋ง‰๊ณ , ์‘๋‹ต์€ D1 ์— ์Œ“๋Š”๋‹ค.

๊ตฌ์กฐ

  • TanStack Start (React) on Cloudflare Workers
  • D1 (SQLite) + Drizzle
  • daleui ๋””์ž์ธ ์‹œ์Šคํ…œ
  • ๋กœ๊ทธ์ธ: DaleStudy GitHub App ์˜ user-to-server OAuth
surveys โ”€โ”ฌโ”€ questions
         โ”œโ”€ responses โ”€ answers
         โ””โ”€ survey_editors (survey_id, login)  โ† ์„ค๋ฌธ์„ ๊ณ ์น˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋Š” ์‚ฌ๋žŒ
users โ”€ sessions                               โ† users.can_create_surveys: maintainer ํŒ€์ด๋ฉด ์ƒˆ ์„ค๋ฌธ์„ ๋งŒ๋“ ๋‹ค

๊ด€๊ณ„์™€ ์„ค๊ณ„ ์ด์œ ๋Š” docs/erd.md, ํ…Œ์ด๋ธ”๋ณ„ ์ปฌ๋Ÿผ๊ณผ ์˜ˆ์‹œ ํ–‰์€ docs/tables.md ์— ์žˆ๋‹ค. ๋ฌด์—‡์„ ์™œ ๊ทธ๋ ‡๊ฒŒ ์ •ํ–ˆ๊ณ  ๋ฌด์—‡์„ ๊ฐ์ˆ˜ํ–ˆ๋Š”์ง€๋Š” docs/decisions.md ์— ๋‚ ์งœ์ˆœ์œผ๋กœ ์Œ“๋Š”๋‹ค. ๋ฏธ๋ค„๋‘” ์ผ๋„ ๊ทธ ๋ฌธ์„œ ๋์— ์žˆ๋‹ค.

์„ค๋ฌธ์€ ๊ธฐ์ˆ˜๋‚˜ ํ”„๋กœ๊ทธ๋žจ์— ๋งค์ด์ง€ ์•Š๋Š”๋‹ค. ๋งฅ๋ฝ์€ ์ œ๋ชฉ("๋ธ”๋กœ๊ทธ ์Šคํ„ฐ๋”” 1๊ธฐ ์ฐธ์—ฌ ํšŒ๊ณ ")์ด ๋‹ด๋Š”๋‹ค. ๊ณต๊ฐœ ๋ฒ”์œ„(listed)๊ฐ€ "ํ™ˆ์— ๋ณด์ด๊ธฐ" ๋ฉด ๋กœ๊ทธ์ธํ•œ ๋ˆ„๊ตฌ๋‚˜ ํ™ˆ์—์„œ ๋ณด๊ณ , "๋งํฌ๋กœ๋งŒ" ์ด๋ฉด ๋งํฌ๋กœ๋งŒ ๋“ค์–ด์˜จ๋‹ค.

์ฐธ๊ฐ€์ž ๋ช…๋‹จ์€ ๋‘์ง€ ์•Š๋Š”๋‹ค. ์„ค๋ฌธ ๋งํฌ๋Š” ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ ์ฑ„๋„์—๋งŒ ๊ณต์œ ๋˜๊ณ , ๋‹ตํ•˜๋ ค๋ฉด GitHub ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•˜๋ฉฐ, ๊ฐ™์€ ์‚ฌ๋žŒ์˜ ์ค‘๋ณต ์‘๋‹ต์€ ๋ง‰ํžˆ๋ฏ€๋กœ ๋ช…๋‹จ์ด ์ฃผ๋Š” ์ถ”๊ฐ€ ์•ˆ์ „์ด Discordโ†”GitHub ๋งคํ•‘์„ ์œ ์ง€ํ•˜๋Š” ๋น„์šฉ๋ณด๋‹ค ์ž‘๋‹ค.

์‘๋‹ต์€ responses.user_id ๋กœ GitHub ๊ณ„์ •๊ณผ ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค. ๊ฒฐ๊ณผ ํ™”๋ฉด์€ ๋ˆ„๊ฐ€ ๋‹ตํ–ˆ๋Š”์ง€ ๋ณด์—ฌ ์ฃผ์ง€ ์•Š๊ณ  ๋‹ต๋งŒ ๋ชจ์€๋‹ค.

๊ฐœ๋ฐœ

bun install
bun run cf-typegen          # wrangler.jsonc ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค
bun run db:migrate:local
bun run db:seed:local seed/example.json
bun run dev                 # http://localhost:3000

๋กœ์ปฌ ์‹œํฌ๋ฆฟ์€ .dev.vars ์— ๋‘”๋‹ค (git ์— ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š์Œ).

GITHUB_CLIENT_ID=...        # DaleStudy GitHub App ์˜ Client ID
GITHUB_CLIENT_SECRET=...    # ๊ฐ™์€ ์•ฑ์˜ Client secret

GitHub App ์„ค์ •์˜ Callback URL ์— http://localhost:3000/auth/callback ์ด ๋“ฑ๋ก๋ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค. __Host- ์ ‘๋‘์‚ฌ ์ฟ ํ‚ค๋Š” Secure ๊ฐ€ ํ•„์ˆ˜๋ผ ๋กœ์ปฌ ๊ฐœ๋ฐœ์€ localhost ๋ฅผ secure context ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” Chrome/Firefox ์—์„œ ํ•œ๋‹ค.

์„ค๋ฌธ ๋งŒ๋“ค๊ธฐ

DaleStudy ์กฐ์ง์˜ maintainer ํŒ€ ๋ฉค๋ฒ„๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ฉด ํ—ค๋”์— ๊ด€๋ฆฌ ํƒญ(/manage)์ด ์ƒ๊ธฐ๊ณ  ์ƒˆ ์„ค๋ฌธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํŒ€ ๋ฉค๋ฒ„์ธ์ง€๋Š” ๋กœ๊ทธ์ธํ•  ๋•Œ GitHub ์— ๋ฌผ์–ด users.can_create_surveys ์— ์ ๋Š”๋‹ค โ€” ํŒ€์ด ๋ฐ”๋€Œ๋ฉด ๋‹ค์Œ ๋กœ๊ทธ์ธ ๋•Œ ๋ฐ˜์˜๋œ๋‹ค. ์„ค๋ฌธ์˜ ํŽธ์ง‘์ž๋กœ ์ถ”๊ฐ€๋œ ์‚ฌ๋žŒ์—๊ฒŒ๋„ ๊ด€๋ฆฌ ํƒญ์ด ๋ณด์ธ๋‹ค(์ž๊ธฐ ์„ค๋ฌธ๋งŒ).

์ƒˆ ์„ค๋ฌธ์€ ์ œ๋ชฉ๊ณผ ์„ค๋ช…๋งŒ ๋ฐ›๊ณ , id ๋Š” ์ž๋™์œผ๋กœ ๋งŒ๋“ ๋‹ค(/V1StGXR8, nanoid 8์ž). ๋‚˜๋จธ์ง€๋Š” ํŽธ์ง‘ ํ™”๋ฉด์—์„œ ์ •ํ•œ๋‹ค.

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

์‘๋‹ต์ด 1๊ฑด์ด๋ผ๋„ ๋“ค์–ด์˜ค๋ฉด ๋ฌธํ•ญ๊ณผ ๋ณ€์ˆ˜๋Š” ์ž ๊ธฐ๊ณ  ์ œ๋ชฉยท์„ค๋ช…ยท๋งˆ๊ฐ์ผยท๊ณต๊ฐœ ๋ฒ”์œ„๋งŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค. ์„ค๋ฌธ ์‚ญ์ œ๋„ ์‘๋‹ต์ด ์—†์„ ๋•Œ๋งŒ ๋œ๋‹ค.

seed (๋กœ์ปฌ ๊ฐœ๋ฐœ)

๋กœ์ปฌ D1 ์— ์„ค๋ฌธ์„ ๋„ฃ์„ ๋•Œ seed/ ์˜ JSON ์„ ์“ด๋‹ค. seed/example.json ์ด ํ˜•์‹ ์„ค๋ช…์ด๋‹ค. editors ๊ฐ€ ํŽธ์ง‘์ž, survey.id ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋งŒ๋“ ๋‹ค.

bun run db:seed:local seed/blog01-final.json

๊ฐ™์€ id ์˜ ์„ค๋ฌธ์ด ์ด๋ฏธ ์žˆ์œผ๋ฉด ์‹คํŒจํ•œ๋‹ค.

seed ์˜ ๋ฌธํ•ญ์€ ๋‘ ์ข…๋ฅ˜๋‹ค.

  • { "common": "goal_achieved" } โ€” src/questions/common.ts ์˜ ๊ณตํ†ต ๋ฌธํ•ญ. ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ™์€ key ๋กœ ๋ฌป๋Š”๋‹ค. ๋ฌธ๊ตฌ ์† {program}, {activity} ๊ฐ™์€ ์ž๋ฆฌํ‘œ์‹œ์ž๋Š” ์„ค๋ฌธ์˜ vars ๋กœ ์ฑ„์šด๋‹ค. ํ”„๋กœ๊ทธ๋žจ๋ณ„ ๊ฐ’์€ docs/questions.md ์ฐธ๊ณ . ์„ค๋ฌธ๋ผ๋ฆฌ ๋น„๊ต๋Š” ์ด key ๋กœ ํ•œ๋‹ค. ๊ณตํ†ต ๋ฌธํ•ญ ๋ฌธ๊ตฌ๋ฅผ ๊ณ ์น˜๋ฉด ์ด์ „ ์„ค๋ฌธ๊ณผ ๋น„๊ต๊ฐ€ ๊นจ์ง€๋ฏ€๋กœ ์‹ ์ค‘ํžˆ.
  • { "type": "long", "label": "โ€ฆ" } โ€” ์ด ์„ค๋ฌธ๋งŒ์˜ ๋ฌธํ•ญ. key ๋Š” ๋น„์–ด ์žˆ๋‹ค.

๊ณตํ†ต ๋ฌธํ•ญ์€ required ๋งŒ, ์ง์ ‘ ๋ฌธํ•ญ์€ required(๊ธฐ๋ณธ true)์™€ config ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์œ ํ˜•์€ scale, short, long, choice ๋„ค ๊ฐ€์ง€. ๊ฐ ์œ ํ˜•์˜ ์ €์žฅ๊ฐ’ยท๊ฒ€์ฆยทconfigยท๊ณตํ†ต ๋ฌธํ•ญ ๋ชฉ๋กยท์œ ํ˜• ์ถ”๊ฐ€ ์ ˆ์ฐจ๋Š” docs/questions.md ์— ์žˆ๋‹ค.

์Šคํ‚ค๋งˆ ๋ฐ”๊พธ๊ธฐ

# src/db/schema.ts ์ˆ˜์ • ํ›„
bunx drizzle-kit generate --name <์„ค๋ช…>
bun run db:migrate:local

๋ฐฐํฌ

main ์— push ํ•˜๋ฉด Cloudflare Workers Builds ๊ฐ€ bun run build โ†’ npx wrangler deploy ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋ฅผ push ํ•˜๋ฉด ํ”„๋ฆฌ๋ทฐ ๋นŒ๋“œ๊ฐ€ ๋ˆ๋‹ค. bun run deploy ๋Š” ์ž๋™ ๋ฐฐํฌ๊ฐ€ ์•ˆ ๋  ๋•Œ์˜ ์ˆ˜๋™ fallback.

์ด๋ฏธ ์„ค์ •๋œ ๊ฒƒ (๋‹ค์‹œ ๋งŒ๋“ค ํ•„์š” ์—†์Œ):

  • D1 feedback (APAC) โ€” id ๋Š” wrangler.jsonc ์— ์žˆ์Œ
  • ์‹œํฌ๋ฆฟ GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET
  • ์ปค์Šคํ…€ ๋„๋ฉ”์ธ feedback.dalestudy.com (wrangler.jsonc ์˜ routes)
  • Workers Builds โ†” DaleStudy/feedback ์—ฐ๊ฒฐ. ๋นŒ๋“œ ๋ณ€์ˆ˜ BUN_VERSION=1.4.0 (๋นŒ๋“œ ์ด๋ฏธ์ง€ ๊ธฐ๋ณธ bun 1.2.15 ๋Š” lockfile v2 ๋ฅผ ๋ชป ์ฝ๋Š”๋‹ค. ๋กœ์ปฌ bun ์„ ์˜ฌ๋ฆฌ๋ฉด ๊ฐ™์ด ์˜ฌ๋ฆฐ๋‹ค)
  • GitHub App Callback URL: http://localhost:3000/auth/callback, https://feedback.dalestudy.com/auth/callback
  • GitHub App ์€ ๊ณต๊ฐœ(public) ์—ฌ์•ผ ํ•œ๋‹ค. ๋น„๊ณต๊ฐœ ์•ฑ์€ ์†Œ์œ  ์กฐ์ง ๋ฉค๋ฒ„๋งŒ authorize ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์กฐ์ง ๋ฐ– ๊ณ„์ •์€ GitHub ์˜ authorize ํŽ˜์ด์ง€์—์„œ 404 ๋ฅผ ๋ณธ๋‹ค (์šฐ๋ฆฌ ๋กœ๊ทธ์—” ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋‚จ๋Š”๋‹ค). Advanced โ†’ Make public. ์ฐธ๊ฐ€์ž๋ฅผ ์กฐ์ง ๋ฉค๋ฒ„๋กœ ์ œํ•œํ•˜๋ ค๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ฐธ์—ฌ ์ ˆ์ฐจ์— ์กฐ์ง ์ดˆ๋Œ€๊ฐ€ ๋จผ์ € ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค โ€” ๋ธ”๋กœ๊ทธ ์Šคํ„ฐ๋”” 1๊ธฐ ์ฐธ๊ฐ€์ž์˜ 40% ๋Š” ์กฐ์ง ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹ˆ๋‹ค.

์Šคํ‚ค๋งˆ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ฐฐํฌ ์ „์— bun run db:migrate:remote ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•œ๋‹ค.

About

๐Ÿ—ฃ๏ธ ํ”ผ๋“œ๋ฐฑ

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages