pttbbs
PTT BBS의 소스 코드
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
회원가입 없이 누구나 한 마디를 남기고, 글마다 정한 비밀번호로 내 글만 고치거나 지울 수 있는 미니 방명록입니다. • 배포 주소: 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분 전"처럼 상대 시간으로 보이고, 마우스를 올리면 정확한 한국 시간을 보여 줍니다.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 |