Skip to content

Latest commit

ย 

History

15 Commits

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
programs โ”€โ”ฌโ”€ cohorts โ”€ surveys โ”€ questions       cohort: ๊ธฐ์ˆ˜์ œ๋ฉด '1๊ธฐ', ์ƒ์‹œ๋ฉด '2026 ํ•˜๋ฐ˜๊ธฐ'
          โ”‚                 โ””โ”€ responses โ”€ answers
          โ””โ”€ organizers (cohort_id, login)  โ† ์šด์˜์ง„(๋ฆฌ๋”ยท์ฝ”์น˜). ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ , ์šด์˜์ง„ ์„ค๋ฌธ์— ๋‹ตํ•œ๋‹ค

๊ด€๊ณ„์™€ ์„ค๊ณ„ ์ด์œ ๋Š” docs/erd.md, ํ…Œ์ด๋ธ”๋ณ„ ์ปฌ๋Ÿผ๊ณผ ์˜ˆ์‹œ ํ–‰์€ docs/tables.md ์— ์žˆ๋‹ค.

์„ค๋ฌธ์—๋Š” audience ๊ฐ€ ์žˆ๋‹ค. participants(๊ธฐ๋ณธ)๋Š” ๋กœ๊ทธ์ธํ•œ ๋ˆ„๊ตฌ๋‚˜ ๋‹ตํ•˜๊ณ , organizers ๋Š” ๊ทธ ๊ธฐ์ˆ˜์˜ ์šด์˜์ง„๋งŒ ๋‹ตํ•˜๋ฉฐ ๊ฒฐ๊ณผ๋„ ์šด์˜์ง„๋ผ๋ฆฌ ๋ณธ๋‹ค.

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

์ต๋ช… ์„ค๋ฌธ์˜ responses.respondent_key ๋Š” HMAC(HMAC_SECRET, surveyId:userId) ๋‹ค. ๊ฐ™์€ ์‚ฌ๋žŒ์˜ ์ค‘๋ณต ์‘๋‹ต๋งŒ ๋ง‰๊ณ , ๋ˆ„๊ฐ€ ๋‹ตํ–ˆ๋Š”์ง€๋Š” ๋ฆฌ๋”๋„ ์„œ๋ฒ„๋„ ๋ณต์›ํ•  ์ˆ˜ ์—†๋‹ค. ์‹ค๋ช… ์„ค๋ฌธ์ด๋ฉด GitHub login ์„ ๊ทธ๋Œ€๋กœ ์“ด๋‹ค.

๊ฐœ๋ฐœ

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
HMAC_SECRET=...             # openssl rand -hex 32

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

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

๊ด€๋ฆฌ ํ™”๋ฉด์€ ์•„์ง ์—†๋‹ค. seed/ ์— JSON ์„ ์“ฐ๊ณ  ๋„ฃ๋Š”๋‹ค. seed/blog01-final.json ์ด ์‹ค์ œ ์˜ˆ, seed/example.json ์ด ํ˜•์‹ ์„ค๋ช…์ด๋‹ค.

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

ํ”„๋กœ๊ทธ๋žจยท๊ธฐ์ˆ˜ยท์šด์˜์ง„์€ ์ด๋ฏธ ์žˆ์œผ๋ฉด ๊ฑด๋„ˆ๋›ฐ๊ณ , ์„ค๋ฌธ์€ ๊ฐ™์€ id ๊ฐ€ ์žˆ์œผ๋ฉด ์‹คํŒจํ•œ๋‹ค.

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

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

๋‘˜ ๋‹ค 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, HMAC_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% ๋Š” ์กฐ์ง ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹ˆ๋‹ค.

HMAC_SECRET ์€ ๋ฐ”๊พธ๋ฉด ๊ธฐ์กด ์ต๋ช… ์‘๋‹ต์ž์˜ ์ค‘๋ณต ๋ฐฉ์ง€ ํ‚ค๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ๊ต์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค. ์Šคํ‚ค๋งˆ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ฐฐํฌ ์ „์— bun run db:migrate:remote ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•œ๋‹ค.

About

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

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages