SDD 방식 미니 방명록
Translation pending
SocialTypeScript · JavaScriptGitHub @taeha9309-createOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
회원가입 없이 누구나 한 마디를 남기고, 글마다 정한 비밀번호로 내 글만 고치거나 지울 수 있는 미니 방명록입니다. • 배포 주소: https://guestbook-202204202.vercel.app • 개발자: 김태하 (학번 202204202) • 개발 방식: SDD (Spec-Driven Development) + Claude Code + Matt Pocock's Skills 글 작성 (Create) • 작성자 이름, 메시지, 글 비밀번호를 입력해 누구나 글을 남길 수 있습니다. • 입력 규칙: 이름 1~30자, 메시지 1~500자, 글 비밀번호 4~50자. 앞뒤 공백은 정리되고, 공백만 입력하면 거부됩니다. • 입력이 잘못되면 폼 아래에 이유를 안내합니다. 등록에 성공하면 토스트 알림이 뜹니다. 글 조회 (Read) • 모든 글을 작성 시각 최신순으로 한 페이지에 보여 줍니다. • 각 글에는 작성자 이름 첫 글자 아바타(이름마다 고정 색상), 메시지, 작성 시각이 표시됩니다. • 작성 시각은 "3분 전"처럼 상대 시간으로 보이고, 마우스를 올리면 정확한 한국 시간을 보여 줍니다.Read the full README ↗
회원가입 없이 누구나 한 마디를 남기고, 글마다 정한 비밀번호로 내 글만 고치거나 지울 수 있는 미니 방명록입니다.
| 구분 | 사용 기술 |
|---|---|
| 프레임워크 | Next.js 16 (App Router), React 19 |
| 언어 | TypeScript |
| 스타일 | Tailwind CSS 4 |
| 데이터베이스 | Neon Postgres (@neondatabase/serverless) |
| 비밀번호 해시 | bcryptjs |
| 테스트 | Vitest (HTTP API 테스트) |
| 배포 | Vercel (GitHub main 브랜치에 push하면 자동 배포) |
| 개발 도구 | Claude Code + Matt Pocock's Skills |
x-forwarded-for의 첫 값을 씁니다. 클라이언트가 이 헤더를 위조해도 Vercel이 덮어씁니다.entries failed_attempts
───────────────────────── ─────────────────────────────────
id SERIAL PK entry_id FK → entries.id (ON DELETE CASCADE)
name TEXT requester TEXT (IP)
message TEXT count INTEGER
password_hash TEXT (bcrypt) locked_until TIMESTAMPTZ
created_at TIMESTAMPTZ PK (entry_id, requester)
updated_at TIMESTAMPTZ
├── src/
│ ├── app/
│ │ ├── page.tsx # 헤더 (제목, 개발자 이름·학번 배지)
│ │ ├── Guestbook.tsx # 작성 폼, 글 목록, 수정·삭제, 토스트
│ │ └── api/entries/
│ │ ├── route.ts # GET 목록, POST 작성
│ │ └── [id]/route.ts # PATCH 수정, DELETE 삭제 (글 비밀번호 확인)
│ └── lib/
│ ├── db.ts # Neon 연결, 테이블 자동 생성
│ ├── lockout.ts # 실패 시도 기록, 잠금 판정
│ └── developer.ts # 개발자 이름·학번
├── tests/ # HTTP API 테스트 (Vitest)
├── CONTEXT.md # 도메인 용어집
├── docs/adr/ # 설계 결정 기록 (ADR)
├── docs/agents/ # Matt Pocock's Skills 설정
└── .scratch/guestbook/ # 스펙과 티켓 (local markdown 이슈 트래커)
| Method | Path | Body | 응답 |
|---|---|---|---|
| GET | /api/entries | - | 200 글 목록 (최신순) |
| POST | /api/entries | name, message, password | 201 생성된 글 / 400 입력 오류 |
| PATCH | /api/entries/:id | message, password | 200 수정된 글 / 400 / 403 글 비밀번호 불일치 + remainingAttempts / 404 / 429 잠김 + retryAfterMinutes |
| DELETE | /api/entries/:id | password | 200 / 400 / 403 / 404 / 429 |
모든 오류 응답의 error는 화면에 바로 보여 줄 수 있는 한국어 문장입니다.
cp .env.example .env.local # DATABASE_URL에 Neon 연결 문자열 입력
npm install
npm run dev # http://localhost:3000
HTTP API에 실제 요청을 보내 동작을 검증합니다. 작성, 조회, 수정, 삭제, 입력 검증, 남은 시도, 잠금, 동시 요청을 다루는 테스트 24개가 있습니다.
npm run dev:test # 테스트용 개발 서버 (3123 포트)
npm test # 다른 터미널에서 실행
# 배포 환경 확인 (요청자를 흉내 내는 테스트는 자동으로 건너뜀)
API_BASE_URL=https://guestbook-202204202.vercel.app npm test
Matt Pocock's Skills로 명세 → 티켓 → 구현 → 리뷰 순서로 진행했습니다.
| 단계 | 한 일 | 결과물 |
|---|---|---|
/setup-matt-pocock-skills | 이슈 트래커(local markdown), 라벨, 문서 구조 설정 | docs/agents/ |
/grill-with-docs | 질문과 답으로 요구사항과 용어를 확정. 잠금 정책과 UI 방향 결정 | CONTEXT.md, ADR-0001 |
/to-spec | 사용자 스토리 42개, 구현·테스트 결정, 범위 밖 항목 정리 | spec.md |
/to-tickets | 수직 슬라이스 티켓 4개로 분해 | issues/ |
/implement + /tdd | 티켓 01~04를 테스트 먼저 작성(red → green)하며 구현 | src/, tests/ |
/code-review | Standards와 Spec 두 축으로 리뷰. 동시 요청 시 잠금이 풀리는 버그 등을 발견하고 수정 | spec의 Review Follow-ups |