Skip to content

Retrospective Week2

์ดํ˜„๋ฏผ edited this page Jun 7, 2026 · 1 revision

ํšŒ๊ณ  ยท Week 2

๊ธฐ๊ฐ„: 2026-06-01 ~ 2026-06-08

์ด๋ฒˆ ์ฃผ๋Š” ์ฒ˜์Œ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ๋„๋Š” ์ฃผ์ฐจ์˜€๋‹ค. 1์ฃผ์ฐจ์— ์ •ํ•œ ๊ฒฐ์ •๋“ค์„ ๋ผ์›Œ ๋งž์ถฐ ๋ณด๋‹ˆ ์‚ฌ๋žŒ์ด ๋ณด๋Š” surface ๊ฐ€ ํ•œ ๋ฒˆ ๋‹ค ๊น”๋ ธ๊ณ  โ€” ๋™์‹œ์—, ๋‚ด๊ฐ€ ์ •ํ•œ ์›Œํฌํ”Œ๋กœ์šฐ ๋ฃฐ์ด ์‹ค์ œ๋กœ ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ์•ฝํ–ˆ๋Š”์ง€๊ฐ€ ๋“œ๋Ÿฌ๋‚ฌ๋‹ค.


๋ฌด์—‡์„ ๋งŒ๋“ค์—ˆ๋‚˜

Surface PR
Next.js 15 + Tailwind + shadcn + Docker/Caddy ๋ถ€ํŠธ์ŠคํŠธ๋žฉ #23
Prisma 6 + SQLite + ์ดˆ๊ธฐ migration #24
Auth.js v5 Google OAuth + @snu.ac.kr ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ + /admin/members #25
์„ธ์…˜ ์ƒ์„ฑ + ์ƒ์„ธ + ๋ณธ์ธ ํ–‰ ์ž…๋ ฅ (ํŽ˜์ด์Šค ์ž๋™) #26
๋‹จ์ฒด์‚ฌ์ง„ ์—…๋กœ๋“œ (๋กœ์ปฌ ๋ณผ๋ฅจ, ์›๋ณธ ๋ณด์กด) #27
Hotfix: ๋นˆ ์ž…๋ ฅ noop / encType ์ œ๊ฑฐ / Session.id cuidโ†’Int #28
ํผ inline validation + double-submit ์ฐจ๋‹จ (useActionState + useFormStatus) #29
/sessions ์•„์นด์ด๋ธŒ ๋ฆฌ์ŠคํŠธ + ์›Œํฌํ”Œ๋กœ์šฐ ๋ณด๊ฐ• (SKILL ยง4.5) #30
์‚ฌ์ง„/admin ํผ retrofit + CI + Deploy + ํšŒ๊ณ  #31
Hotfix: Docker image build (public/ ๋ˆ„๋ฝ, GHCR ์ด๋ฆ„ ๋ถˆ์ผ์น˜, deploy secrets ๋ถ„๊ธฐ) #32
Hotfix: Prisma runtime deps + healthcheck /api/health + N100 git sync #33
์ฝ”๋“œ audit: cursor ํŽ˜์ด์ง€๋„ค์ด์…˜ / ์ฃฝ์€ env / server-only ๊ฐ€๋“œ (์ด PR)

11 + 1 PR. ๋ชจ๋‘ dev ์— ๋จธ์ง€. main ์€ Week 2 ๋งˆ์ง€๋ง‰์— v0.1.0 ํƒœ๊ทธ์™€ ํ•จ๊ป˜ ์ฒซ ๋จธ์ง€.


์›Œํฌํ”Œ๋กœ์šฐ์˜ ์•ฝ์ ์ด ๋“œ๋Ÿฌ๋‚œ ๋‘ ๋ฒˆ์˜ ์‚ฌ๊ณ 

1์ฃผ์ฐจ์— 06-Checkpoints 7๊ฐœ๋ฅผ "AI ๊ฐ€ ๋‚ด ์ง€์‹œ๋ฅผ ์ž˜๋ชป ํ•ด์„ํ•œ ๋ถ€๋ถ„์„ ์žก๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ" ์œผ๋กœ ์žฌ์ •์˜ํ–ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ fidelity ์ธก๋ฉด โ€” ์‹œํ‚จ ์ผ์„ ์‹œํ‚จ ๋งŒํผ ํ–ˆ๋Š”์ง€ โ€” ์€ ์ž˜ ์žกํ˜”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๊ฒŒ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊นŒ์ง€ ๋ณด์žฅํ•˜์ง„ ๋ชปํ•œ๋‹ค๋Š” ๊ฒŒ ๋‘ ๋ฒˆ์˜ ์‚ฌ๊ณ ์—์„œ ๋“œ๋Ÿฌ๋‚ฌ๋‹ค.

์‚ฌ๊ณ  1. ๋นˆ ์ž…๋ ฅ / ์ž˜๋ชป๋œ ์ž…๋ ฅ์— ์•Œ๋ฆผ์ด ์—†๋Š” ์ฑ„๋กœ PR ๋‘ ๋ฒˆ์ด ๋จธ์ง€๋๋‹ค (#26, #28). ๋‚ด๊ฐ€ spec ์˜ "Out of scope" ์— "react-hook-form ๋„์ž… ์‹œ" ๋ผ๊ณ  ๋ฐ•์•„๋‘๊ณ  ๋ฏธ๋ค˜๋Š”๋ฐ, ๊ทธ๊ฒŒ ํ•ฉ๋ฆฌ์  ๋ถ„๋ฆฌ์˜ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฏธ๋ฃจ๊ธฐ์˜ ํ•‘๊ณ„๋กœ ์“ฐ์˜€๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋นˆ ํผ [์ถ”๊ฐ€] ๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ’€์Šคํฌ๋ฆฐ ์—๋Ÿฌ ํŽ˜์ด์ง€ โ†’ silent noop ์œผ๋กœ ํ•œ ๋ฒˆ hotfix ํ–ˆ์ง€๋งŒ, ๋‘˜ ๋‹ค ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์€ ๊นจ์ ธ ์žˆ์—ˆ๋‹ค.

์‚ฌ๊ณ  2. [์„ธ์…˜ ๋งŒ๋“ค๊ธฐ] ๋น ๋ฅธ ๋”๋ธ” ํด๋ฆญ์œผ๋กœ row ๊ฐ€ ๋‘ ๋ฒˆ ์ƒ์„ฑ๋๋‹ค. useFormStatus ํ•œ ์ค„์ด๋ฉด ๋ง‰ํžˆ๋Š” ํ”ํ•œ ํŒจํ„ด์ธ๋ฐ, server action ๋งŒ ๋ฐ•๊ณ  React 19 ํ‘œ์ค€ ํŒจํ„ด์„ ๋นผ๋จน์—ˆ๋‹ค. ์ฒ˜์Œ PR #26 ๋ถ€ํ„ฐ ๋ฐ•ํ˜€ ์žˆ์—ˆ์–ด์•ผ ํ–ˆ๋‹ค.

๋‘˜ ๋‹ค build ๊ฐ€ ๊ทธ๋ฆฐ์ด๊ณ , 06-Checkpoints fidelity 7๊ฐœ๋„ ๋‹ค ํ†ต๊ณผํ–ˆ๋‹ค. ํ†ต๊ณผํ•œ ๊ฒŒ ์‚ฌ์‹ค ๊ฑฐ์ง“๋ง์ด์—ˆ๋‹ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, "happy path ์ฝ”๋“œ๊ฐ€ ๋„๋Š”๊ฐ€" ์™€ "์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ํ–‰๋™์„ ํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€" ๊ฐ€ ๊ฐ™์€ ์งˆ๋ฌธ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒŒ ์ •ํ™•ํ•˜๋‹ค.

์ˆ˜์ •: PR #30 ์— ๋‘ ๊ณณ์„ ๋ฐ•์•˜๋‹ค.

  • .gjc/skills/murun-feature/SKILL.md ยง4.5 โ€” ์ƒˆ ํผ/์ž…๋ ฅ ์ถ”๊ฐ€ํ•  ๋•Œ negative case alert / useActionState / useFormStatus / DB unique ์•ˆ์ „๋ง์„ ์ฒดํฌ ์—†์ด ์ง„ํ–‰ ๊ธˆ์ง€ ๋กœ ๋ช…์‹œ.
  • docs/wiki/06-Checkpoints.md #7 โ€” "happy path ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑ, ๋นˆ ์ž…๋ ฅ / ์ž˜๋ชป๋œ ํƒ€์ž… / ๋”๋ธ” ํด๋ฆญ / ๊ถŒํ•œ ์—†๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๋จธ๋ฆฟ์†์—์„œ๋ผ๋„ ํ˜๋ ค๋ณธ๋‹ค."

PR #31 ์—์„œ ๊ทธ ๋ฃฐ์„ ์ด๋ฏธ ์žˆ๋Š” ํผ(์‚ฌ์ง„ ์—…๋กœ๋“œ, admin ์Šน์ธ/๊ฑฐ์ ˆ) ์— ์†Œ๊ธ‰ ์ ์šฉํ–ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐ•ํ˜”์–ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ๋Šฆ๊ฒŒ ๋“ค์–ด๊ฐ„ ๊ฑฐ๋ผ ์ƒˆ๋กœ์šด ๊ฐ€์น˜๋Š” ์—†์ง€๋งŒ, ๋ฃฐ์ด ์‹ค์ œ๋กœ ๋ฌธ์„œ์— ๋จธ๋ฌด๋ฅด์ง€ ์•Š๊ณ  ๋‹ค์Œ PR ์— ์˜ํ–ฅ์„ ์คฌ๋‹ค๋Š” ๊ฒŒ 1์ฃผ์ฐจ์— ์ •ํ•œ ๊ฒƒ๊ณผ์˜ ์ฐจ์ด.


์‚ฌ๊ณ  ์‹œ์ฆŒ 2: ๋ฐฐํฌ ์‚ฌ์ดํด์˜ hotfix 3์—ฐ๋ฐœ

CI/Deploy ํŒŒ์ดํ”„๋ผ์ธ์„ ์˜ฌ๋ฆฌ๊ณ  N100 ์— ์ฒ˜์Œ SSH ๋ฐฐํฌ๋ฅผ ๊ตด๋ฆฌ๋ฉด์„œ ์‚ฌ๊ณ  3๊ฑด์ด ์ถ”๊ฐ€๋กœ ํ„ฐ์กŒ๋‹ค (#32, #33, ์ด๋ฒˆ PR). ์ฝ”๋“œ๋Š” ๋กœ์ปฌ์—์„œ ๊ทธ๋ฆฐ์ด์—ˆ๋Š”๋ฐ, ํ™˜๊ฒฝ์ด ๋ฐ”๋€Œ๋‹ˆ ํ•œ ๋ฒˆ๋„ ๊ฐ™์ด ๋Œ๋ ค๋ณธ ์  ์—†๋Š” ์กฐํ•ฉ์—์„œ ๊นจ์กŒ๋‹ค.

์‚ฌ๊ณ  3. public/ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—†๋Š”๋ฐ Dockerfile ์ด ๋ฌด์กฐ๊ฑด COPY (#32). ์•ฑ ๋นŒ๋“œ๋Š” ํ†ต๊ณผํ•˜๋Š”๋ฐ ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ๋งŒ ๊นจ์กŒ๋‹ค. ๋กœ์ปฌ pnpm build ๋งŒ ๋ณด๋˜ ์•ˆ์ „๋ง์˜ ์‚ฌ๊ฐ.

์‚ฌ๊ณ  4. compose ์˜ image ์ด๋ฆ„์ด GHCR push ์ด๋ฆ„๊ณผ ๋‹ฌ๋ž๋‹ค (#32). build ๋Š” ํ†ต๊ณผ, push ๋„ ํ†ต๊ณผ โ€” N100 ์—์„œ pull ๋งŒ ๋ชป ํ–ˆ์„ ์ผ€์ด์Šค. ์ง์ ‘ N100 ๋ฐฐํฌ๊นŒ์ง€ ๊ฐ€์ง€ ์•Š์•˜์œผ๋ฉด ํ•œ์ฐธ ๋ฌปํ˜€์žˆ์—ˆ๋‹ค.

์‚ฌ๊ณ  5. Prisma migrate deploy runtime ์˜์กด (#33). Dockerfile ์ด node_modules/prisma, node_modules/@prisma ๋งŒ ๋ณต์‚ฌํ•ด์„œ effect ๊ฐ™์€ transitive deps ๊ฐ€ ๋ˆ„๋ฝ โ†’ entrypoint ๊ฐ€ ๋ถ€ํŒ… ๋‹จ๊ณ„์—์„œ ์ฃฝ์Œ. Healthcheck ๋„ / ๋ฅผ ๋ณด๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๊ฒŒ ๋กœ๊ทธ์ธ redirect ๋ผ healthy ๊ฐ€ ์˜์˜ ์•ˆ ๋๋‹ค. ์ธ์ฆ๊ณผ ๋ฌด๊ด€ํ•œ /api/health ๋กœ ๋”ฐ๋กœ ๋บ๋‹ค.

์‚ฌ๊ณ  6. ์ด๋ฒˆ audit ์—์„œ ์žกํžŒ cursor ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ˆ„๋ฝ. orderBy: (date desc, id desc) ์ธ๋ฐ cursor ๋Š” id < cursorId ๋งŒ ๋ดค๋‹ค. ์˜ค๋ž˜๋œ ๋‚ ์งœ์ธ๋ฐ ๋Šฆ๊ฒŒ ๋งŒ๋“ค์–ด์ง„(=id ๊ฐ€ ํฐ) ์„ธ์…˜์ด ํŽ˜์ด์ง€ ์‚ฌ์ด์—์„œ ๋ˆ„๋ฝ. ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ์ž๋ฆฌ์ˆ˜์ผ ๋• ์•ˆ ๋ณด์ด๋Š” ๋ฒ„๊ทธ. ์ด๊ฑด ์‚ฌ์šฉ์ž๊ฐ€ ๋ชป ๋ฐœ๊ฒฌํ–ˆ์–ด๋„ ์‹œ๊ฐ„ ๋ฌธ์ œ์˜€๋‹ค.

๊ฐ™์ด ์žก์€ audit ํ•ญ๋ชฉ:

  • ์ฃฝ์€ NEXT_PUBLIC_APP_URL ๋ณ€์ˆ˜ โ†’ layout.tsx ์˜ metadataBase ๋กœ ์‹ค์ œ ์‚ฌ์šฉ.
  • lib/uploads.ts ๊ฐ€ client ์ปดํฌ๋„ŒํŠธ์˜ transitive import ๋กœ ๋Œ๋ ค๊ฐˆ ์œ„ํ—˜ โ†’ import "server-only" ๊ฐ€๋“œ + URL helper ๋ถ„๋ฆฌ.
  • [์„ธ์…˜ ์ˆ˜์ • โ€” ๋‹ค์Œ PR์—์„œ ์ถ”๊ฐ€] placeholder ๋…ธ์ถœ โ†’ ์ œ๊ฑฐ.

์ด ์‹œ์ฆŒ์˜ ๊ณตํ†ต ํŒจํ„ด. ๋ชจ๋‘ "๋กœ์ปฌ์—์„œ ํ•œ ๊ฐ€์ง€ ๊ฒฝ๋กœ๋งŒ ๊ตด๋ ค๋ณด๊ณ  ๊ทธ๋ฆฐ์ด๋ฉด ํ†ต๊ณผ ๋ณด๊ณ " ์˜€๋‹ค. ์ฝ”๋“œ๋Š” ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ๊ฐ™์€ ์ž…๋ ฅ์œผ๋กœ๋งŒ ๊ตด๋ ธ๊ณ , ๋‹ค๋ฅธ ํ™˜๊ฒฝ (Docker, GHCR, N100, edge case ๋ฐ์ดํ„ฐ) ์€ ํ•œ ๋ฒˆ๋„ ๊ฐ™์ด ๊ตด๋ ค๋ณธ ์  ์—†์—ˆ๋‹ค. Hotfix ๊ฐ€ 3๋ฒˆ ์—ฐ๋‹ฌ์•„ ํ„ฐ์ง€๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๊ฒƒ:

  • ๋กœ์ปฌ build ๊ทธ๋ฆฐ โ‰  ์ปจํ…Œ์ด๋„ˆ build ๊ทธ๋ฆฐ. Docker ๋‹จ๊ณ„๋Š” ๋‹ค๋ฅธ ์•ˆ์ „๋ง์ด ํ•„์š”.
  • ์ปจํ…Œ์ด๋„ˆ ๋ถ€ํŒ… โ‰  ์•ฑ healthy. healthcheck ๊ฐ€ ์ง„์งœ ready ์‹ ํ˜ธ๋ฅผ ๋ด์•ผ ํ•จ.
  • ์•ฑ์ด healthy โ‰  ์ƒˆ ์ฝ”๋“œ๊ฐ€ N100 ์— ๋„๋‹ฌ. deploy pipeline ์˜ git sync ๊ฐ€ ๋น ์ง€๋ฉด image ๋งŒ ์ƒˆ๊ฑฐ๊ณ  compose ํŒŒ์ผ์€ ์˜›๊ฒƒ.

์ˆ˜์ •: .gjc/skills/murun-feature/SKILL.md ์™€ 06-Checkpoints.md ์— "ํ™˜๊ฒฝ๋ณ„ ๊ฒ€์ฆ ๋ถ„๋ฆฌ" ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค (3์ฃผ์ฐจ์—์„œ ๋ณด๊ฐ•).


AI ๊ฐ€ ์Šค์Šค๋กœ ๋ชป ์žก์€ ๊ฒƒ

์ง์ „ ์‚ฌ๊ณ ๋ฅผ ์ž๊ธฐ ์ ๊ฒ€ํ•ด๋ณด๋ฉด ์ผ๊ด€๋œ ํŒจํ„ด์ด ์žˆ๋‹ค.

  • AI ๋Š” ์ฝ”๋“œ ์ธก ๊ฒ€์ฆ(typecheck/lint/build) ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  "ํ†ต๊ณผ" ๋ผ๊ณ  ๋ณด๊ณ ํ–ˆ๋‹ค. ๊ทธ๊ฑด ์ •ํ™•ํ–ˆ๋‹ค.
  • AI ๋Š” PR ๋ณธ๋ฌธ์— "์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ E2E ๊ฒ€์ฆ" ์ด๋ผ๊ณ  ๋ฐ•์•˜๋‹ค. ๊ทธ๊ฒƒ๋„ ์ •ํ™•ํ–ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ๊ทธ ์‚ฌ์ด์— โ€” "์‚ฌ์šฉ์ž์—๊ฒŒ ์‹œํ‚ค๊ธฐ ์ „์— ๋จธ๋ฆฟ์† ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ํ•œ ๋ฒˆ ํ˜๋ ค๋ณด๋Š” ๋‹จ๊ณ„" โ€” ๊ฐ€ ์•„์˜ˆ ๋น ์กŒ๋‹ค.

AI ๊ฐ€ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ชป ํด๋ฆญํ•˜๋Š” ๊ฑด ์‚ฌ์‹ค์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ๋จธ๋ฆฟ์† ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊นŒ์ง€ ๋ชป ํ•  ์ด์œ ๋Š” ์—†๋‹ค. "์ด ํผ์ด ๋นˆ ์ž…๋ ฅ์ด๋ฉด ์–ด๋–ป๊ฒŒ ๋˜์ง€?" ๊ฐ™์€ ์งˆ๋ฌธ์€ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ฝ์œผ๋ฉด ๋‹ต์ด ๋‚˜์˜จ๋‹ค. ๊ทธ๊ฑธ ์•ˆ ํ–ˆ์„ ๋ฟ์ด๋‹ค.

3์ฃผ์ฐจ์— ์ ์šฉํ•  ๋ณ€ํ™”๋Š” ์„ธ ๊ฐœ:

  1. spec ์˜ "Out of scope" ๊ฐ€ ์ •๋ง ๋ถ„๋ฆฌ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€, ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๋ฏธ๋ฃจ๋Š” ๊ฑด์ง€ ๊ตฌ๋ถ„ํ•œ๋‹ค. ๋ฏธ๋ฃจ๋Š” ๊ฒƒ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋ณด์ด๋ฉด OOS ์—์„œ ๋นผ๊ณ  ๊ฐ™์€ PR ์— ํ•ฉ์นœ๋‹ค.
  2. PR ๋ณธ๋ฌธ์˜ Fidelity check #7 ์— negative case ๋จธ๋ฆฟ์† ์‹œ๋‚˜๋ฆฌ์˜ค 1~2์ค„์„ ๊ฐ•์ œ๋กœ ์ ๋Š”๋‹ค โ€” "๋นˆ ์ž…๋ ฅ โ†’ ...", "๊ถŒํ•œ ์—†๋Š” ์‚ฌ์šฉ์ž โ†’ ..." ๊ฐ™์€ ํ•œ ์ค„.
  3. ์ธํ”„๋ผ/๋ฐฐํฌ PR ์€ ๋กœ์ปฌ build ๊ทธ๋ฆฐ + ์ปจํ…Œ์ด๋„ˆ build ๊ทธ๋ฆฐ + healthcheck ๊ฐ€ ์ง„์งœ ready ๋ฅผ ๋ณด๋Š”๊ฐ€ ์„ธ ์ค„์„ PR ๋ณธ๋ฌธ์— ๋ช…์‹œ. ์ฝ”๋“œ๋งŒ ๋ณด๋ฉด ์‚ฌ๊ณ  ์‹œ์ฆŒ 2๊ฐ€ ๋˜ ๋ฐ˜๋ณต๋œ๋‹ค.

๋„๋ฉ”์ธ ๊ฒฐ์ • ์ธก๋ฉด

1์ฃผ์ฐจ์— ์ •ํ•œ "ํ˜ธ์ŠคํŠธ = ์„ธ์…˜ ์ž‘์„ฑ์ž, ์ฐธ์—ฌ์ž = ๋ณธ์ธ ํ–‰์„ ์ ๋Š”" ๋ชจ๋ธ์€ ์–ด์ƒ‰ํ•จ ์—†์ด ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ–ˆ๋‹ค. ์นดํ†ก ๋‹จํ†ก๋ฐฉ์— ๋˜์ง€๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค(์•„์ง OG ์ด๋ฏธ์ง€ ์—†์–ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋Š” ๋น ์ง) ๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  ์ง  ํ๋ฆ„์ด ์‹ค์ œ๋กœ ์šด์˜์ง„/์ฐธ์—ฌ์ž ๋ชจ๋‘์—๊ฒŒ ์ž์—ฐ์Šค๋Ÿฌ์šด์ง€๋Š” โ€” Week 3 ์˜ ์‹ค์ œ ์šด๋™ 1ํšŒ dogfooding ์—์„œ ๊ฒ€์ฆ๋œ๋‹ค.

์ž‘๊ฒŒ ๋’ค์ง‘์€ ๊ฒฐ์ •:

  • Session.id cuid โ†’ autoincrement Int (#28). enumeration ์ฐจ๋‹จ ๊ฐ€์น˜ < ๊ฐ€๋…์„ฑ. ๋™์•„๋ฆฌ 30๋ช… ๋‚ด๋ถ€์šฉ์— ๋” ๋งž์Œ.
  • ๊ฒ€์ฆ ๊ฐ•ํ™”์—์„œ "์ดˆ๋Š” 0~59" ๋กœ ๊ฐ•์ œ (#29). ์‚ฌ์šฉ์ž๊ฐ€ 5๋ถ„ 0์ดˆ๋ฅผ 4'60" ๋กœ ์ ๋Š” ํ”ํ•œ ์‹ค์ˆ˜๋ฅผ ๋ง‰์Œ.

์ธํ”„๋ผ ์ธก๋ฉด

์ž์ฒด N100 + Docker + Caddy + SQLite ๊ฒฐ์ •์ด ์šด์˜ ์ธก์—์„œ ๊น”๋”ํ•˜๊ฒŒ ์•ˆ์ •๋๋‹ค.

  • ์ด๋ฒˆ PR ์˜ CI ์›Œํฌํ”Œ๋กœ์šฐ โ€” PR ๋งˆ๋‹ค typecheck/lint/build ์ž๋™. ์†”๋กœ ํ”„๋กœ์ ํŠธ์ง€๋งŒ, "๋‚ด๊ฐ€ ๋งค๋ฒˆ ๋กœ์ปฌ์—์„œ ๋Œ๋ฆฌ๋Š” ๋‹จ๊ณ„" ๋ฅผ GH ๊ฐ€ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฒŒ ์•ˆ์ „๋ง.
  • ์ด๋ฒˆ PR ์˜ Deploy ์›Œํฌํ”Œ๋กœ์šฐ โ€” dev push โ†’ ghcr.io build โ†’ SSH โ†’ N100 staging ์ž๋™. main ์€ environment ๋ณดํ˜ธ ํ›„ ์ˆ˜๋™ ์Šน์ธ.
  • SSH key + N100_HOST ๋“ฑ secrets ๋“ฑ๋ก์€ ํ˜ธ์ŠคํŠธ(๋‚˜) ์˜ ์ฑ…์ž„. README ์— ์ ˆ์ฐจ๊ฐ€ ์žˆ๊ณ , ๋“ฑ๋ก ์ „์—๋Š” ์ด๋ฏธ์ง€ build/push ๊นŒ์ง€๋งŒ ์„ฑ๊ณต์‹œํ‚ค๊ณ  SSH deploy ๋Š” skip ํ•˜๋„๋ก ํ–ˆ๋‹ค.

๋‚จ์€ ํ˜ธ์ŠคํŠธ ์ž‘์—… (Week 2 ์•ˆ์— ๋๋‚จ):

  • N100 ์—์„œ docker compose up -d ๋กœ staging ๊ธฐ๋™ โ€” ์ž๋™ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ํ†ต๊ณผ ํ™•์ธ
  • dev โ†’ main ์ฒซ ๋จธ์ง€ + v0.1.0 ํƒœ๊ทธ

Week 3 ๋กœ ๋ฏธ๋ฃจ๋Š” ํ˜ธ์ŠคํŠธ ์ž‘์—…:

  • duckdns ๋„๋ฉ”์ธ + HTTPS
  • prod environment ๋ณดํ˜ธ + main โ†’ prod ๋ผ์ธ ์ฒซ ๋ฐœ์‚ฌ

๋‹ค๋ฅด๊ฒŒ ํ•œ๋‹ค๋ฉด (3์ฃผ์ฐจ์—์„œ ๋ฐ”๊พธ๋Š” ๊ฒƒ)

  1. spec ์ž‘์„ฑ ์‹œ OOS ํ•ญ๋ชฉ์„ "์ •๋ง ๋ฏธ๋ฃจ๋Š”๊ฐ€" ํ•œ ๋ฒˆ ์ž๋ฌธ. PR #26/#28 ์˜ inline validation ์ฒ˜๋Ÿผ, OOS ๊ฐ€ ์‚ฌ์‹ค ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ง์ ‘ ๋ง์น˜๋Š” ๊ฑฐ๋ฉด ๊ฐ™์€ PR ์— ํ•ฉ์นœ๋‹ค.
  2. PR ๋ณธ๋ฌธ Fidelity #7 ์— negative case ํ•œ ์ค„ ๋ช…์‹œ ๊ฐ•์ œ. "๋นˆ ์ž…๋ ฅ โ†’ alert", "๋”๋ธ” ํด๋ฆญ โ†’ dedupe ๋™์ž‘" ๊ฐ™์ด ๋จธ๋ฆฟ์† ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธ€๋กœ.
  3. AI ๊ฐ€ ๋งŒ๋“  PR ์„ ๋จธ์ง€ํ•˜๊ธฐ ์ „ ์ฝ”๋“œ ์ธก ๊ฒ€์ฆ + ๋จธ๋ฆฟ์† ์‹œ๋‚˜๋ฆฌ์˜ค ๋‘˜ ๋‹ค ํ†ต๊ณผํ•œ ๋‹ค์Œ์—๋งŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒ€์ฆ ์š”์ฒญ. ๋นŒ๋“œ ๊ทธ๋ฆฐ๋งŒ ๋ณด๊ณ  "๊ฒ€์ฆ ๊ฐ€๋Šฅ" ์ด๋ผ๊ณ  ๋ณด๊ณ ํ•˜๋Š” ํŒจํ„ด ํ๊ธฐ.
  4. PR scope ๋ฌถ๊ธฐ/์ชผ๊ฐœ๊ธฐ ๊ฒฐ์ •์„ ํ•œ ์ค„ ๋ฉ”๋ชจ๋กœ. 4 commit 1 PR ๋„ ํ•ฉ๋ฆฌ์ , ์ž‘์€ PR ์—ฌ๋Ÿฌ ๊ฐœ๋„ ํ•ฉ๋ฆฌ์ . ๊ฒฐ์ • ๊ธฐ์ค€์€ "์‚ฌ์šฉ์ž ๋จธ์ง€ ๋ถ€๋‹ด" ๊ณผ "๋„๋ฉ”์ธ ์‘์ง‘๋„".
  5. dev โ†’ main ๋จธ์ง€ ์ฃผ๊ธฐ๋ฅผ ์ •ํ•ด๋‘ . ๋งค PR ๋งˆ๋‹ค ํ•˜์ง€ ์•Š๋”๋ผ๋„, Week ๋๋งˆ๋‹ค v0.x.0 ํƒœ๊ทธ์™€ ํ•จ๊ป˜ ์ผ๊ด„. main ์ด ๋น„์–ด์žˆ๋Š” ์ฑ„๋กœ ๊ฐ€๋Š” ๊ธฐ๊ฐ„์ด ๋„ˆ๋ฌด ๊ธธ์ง€ ์•Š๊ฒŒ.
  6. ๋ฐฐํฌ PR ์€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ๊นŒ์ง€ ํ•œ ์‚ฌ์ดํด ๊ตด๋ ค๋ณธ ๋‹ค์Œ ๋จธ์ง€. local pnpm check ๊ทธ๋ฆฐ๋งŒ ๋ณด๊ณ  ๋ฐฐํฌ PR ๋จธ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค. workflow_dispatch ๋กœ ํ•œ ๋ฒˆ ๊ตด๋ ค๋ณธ ๋‹ค์Œ ๊ทธ๋ฆฐ์ด๋ฉด ๋จธ์ง€.

3์ฃผ์ฐจ ๊ณ„ํš

ํ•ต์‹ฌ์€ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์‹ค์ œ๋กœ ํ•œ ๋ฒˆ ๊ตด๋ ค๋ณด๋Š” ์ฃผ. ์ฝ”๋“œ๋Š” ๊ฑฐ์˜ ๋‹ค ๋๊ณ , ์ง„์งœ ๋ชจ์ž„ 1ํšŒ์˜ ๊ธฐ๋ก์„ ๋๊นŒ์ง€ ํ˜๋ ค๋ณธ ๋‹ค์Œ์— ๋ฐœ๊ฒฌ๋˜๋Š” ์–ด์ƒ‰ํ•จ ๋“ค์„ ์žก๋Š”๋‹ค.

  • N100 ์— ์‹ค์ œ ๋ฐฐํฌ (CI/CD secret ๋“ฑ๋ก ํ›„ dev push โ†’ staging ๋™์ž‘ ํ™•์ธ)
  • duckdns ๋„๋ฉ”์ธ + Caddy HTTPS
  • Google OAuth redirect URI ์— prod ๋„๋ฉ”์ธ ์ถ”๊ฐ€
  • dev โ†’ main ์ฒซ ๋จธ์ง€ + v0.1.0
  • OG ์ด๋ฏธ์ง€ (#15) โ€” ์นดํ†ก ๊ณต์œ  ๋ฏธ๋ฆฌ๋ณด๊ธฐ. ์ด๊ฒŒ ๋น ์ง€๋ฉด ๋™์•„๋ฆฌ ๊ณต์œ  UX ๊ฐ€ ๋ฌด๋ฏธ๊ฑด์กฐํ•จ.
  • (์‹œ๊ฐ„ ๋˜๋ฉด) ๊ฒ€์ƒ‰ยทํ•„ํ„ฐ (#14) โ€” ์ฐธ์—ฌ ์ธ์› ์ˆ˜, ์žฅ์†Œ, ๊ธฐ๊ฐ„
  • (์‹œ๊ฐ„ ๋˜๋ฉด) ๋ฉค๋ฒ„ ํŽ˜์ด์ง€ + ๋ˆ„์ /ํŽ˜์ด์Šค ์ถ”์ด ์ฐจํŠธ (#13)
  • ์‹ค์ œ ๋™์•„๋ฆฌ ์šด๋™ 1ํšŒ dogfooding โ€” ํ˜ธ์ŠคํŠธ ์‹œ์  + ์ฐธ์—ฌ์ž ์‹œ์  ์–‘์ชฝ์œผ๋กœ ํ˜๋ ค๋ณด๊ธฐ
  • 3์ฃผ์ฐจ ํšŒ๊ณ 

3์ฃผ์ฐจ์— ๋ฐœ๊ฒฌ๋˜๋Š” ์‚ฌ๊ณ ๋“ค์€ ์ด๋ฒˆ ์ฃผ์ฒ˜๋Ÿผ spec/OOS ๋ˆ„๋ฝ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๋„๋ฉ”์ธ์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์“ฐ๋Š”๊ฐ€ ์—์„œ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค. ๊ทธ๊ฒŒ ๊ฐ€์žฅ ์˜๋ฏธ์žˆ๋Š” ํ•™์Šต์ผ ๊ฒƒ์ด๋ผ ๋ณธ๋‹ค.

Clone this wiki locally