PDF를 올리면 AI가 쪽수와 근거를 함께 제시하며 대화하는 앱을 Claude Code로 처음부터 직접 만드는 방법을 단계별로 설명합니다.
완성되면 이런 기능들이 있습니다
PDF를 올리면 pdfjs로 텍스트를 추출하고, Gemini API로 각 페이지 AI 요약을 자동 생성합니다. Vercel Blob에 파일이 저장됩니다.
질문하면 SSE 스트리밍으로 실시간 답변이 흘러오고, 마크다운·수식(KaTeX)·표가 모두 렌더링됩니다.
AI가 답변하면서 출처 쪽수와 근거 카드를 같이 제시합니다. 카드를 클릭하면 PDF 뷰어가 해당 페이지로 이동합니다.
AI가 그림·그래프를 설명할 때  태그를 출력하면, 프론트엔드가 해당 페이지 이미지를 채팅 안에 자동으로 보여줍니다.
PDF 내용만으로 부족할 때 웹 검색을 병행해 더 풍부한 답변을 만들고, 출처 링크도 함께 표시합니다.
NextAuth.js로 구글 OAuth 로그인을 구현하고, NeonDB(PostgreSQL)에 채팅 히스토리를 영구 저장합니다.
시작 전에 설치/가입해야 할 것들
Node.js 설치부터 프로젝트 생성까지
터미널에서 버전을 확인하세요. 20 이상이어야 합니다.
node -v # v20.x.x 이상 npm -v # 10.x.x 이상
없으면 nodejs.org에서 LTS 버전 다운로드 후 설치
AI 코딩 어시스턴트를 전역으로 설치합니다.
npm install -g @anthropic-ai/claude-code
공식 CLI로 Next.js 프로젝트를 생성합니다. TypeScript, App Router를 선택하세요.
npx create-next-app@latest pdf-evidence-ai # ✓ TypeScript → Yes # ✓ ESLint → Yes # ✓ App Router → Yes # ✓ src/ directory → Yes # ✓ Tailwind CSS → No (이 프로젝트는 순수 CSS 사용) cd pdf-evidence-ai
이 프로젝트에 필요한 모든 라이브러리를 한 번에 설치합니다.
npm install @google/genai @napi-rs/canvas @neondatabase/serverless @vercel/blob next-auth pdfjs-dist react-markdown remark-gfm remark-math rehype-katex lucide-react katex
@google/genai — Gemini AI API |
@napi-rs/canvas — 서버사이드 PDF 이미지 렌더링@neondatabase/serverless — NeonDB 연결 |
@vercel/blob — 파일 스토리지next-auth — 구글 OAuth |
pdfjs-dist — PDF 파싱/렌더링react-markdown + remark-gfm + rehype-katex — 마크다운/수식 렌더링
루트에 .env.local 파일을 만들고 API 키를 채워넣습니다. (아래 '외부 서비스 세팅' 참고)
# .env.local DATABASE_URL=postgres://... # NeonDB 연결 문자열 GEMINI_API_KEY=AIza... # Google AI Studio BLOB_READ_WRITE_TOKEN=vercel_blob_... # Vercel Blob GOOGLE_CLIENT_ID=... # Google OAuth GOOGLE_CLIENT_SECRET=... # Google OAuth NEXTAUTH_SECRET=... # openssl rand -base64 32 NEXTAUTH_URL=http://localhost:3000
프로젝트 폴더에서 Claude Code를 열고 아래 프롬프트들을 순서대로 사용하세요.
claude # 또는 VS Code에서 Claude 확장 실행
Claude Code에 순서대로 붙여넣기 하세요 — 각 Phase마다 완성된 코드가 생성됩니다
npm run dev) 잘 동작하는지 확인 후 다음으로 넘어가는 게 훨씬 빠릅니다.
Next.js 프로젝트의 기반 설정을 잡는 단계입니다. next.config.ts에 서버 외부 패키지 설정, TypeScript 타입 파일, 기본 lib 유틸 함수들을 만듭니다.
구글 OAuth 로그인과 NeonDB PostgreSQL 연결을 설정합니다. 먼저 NeonDB에서 아래 SQL 스키마를 직접 실행한 후 이 프롬프트를 사용하세요.
CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, email TEXT UNIQUE NOT NULL, name TEXT, image TEXT ); CREATE TABLE IF NOT EXISTS pdf_sessions ( id TEXT PRIMARY KEY, user_id TEXT REFERENCES users(id) ON DELETE CASCADE, filename TEXT NOT NULL, page_count INTEGER DEFAULT 0, total_characters INTEGER DEFAULT 0, gemini_file_uri TEXT, gemini_file_name TEXT, gemini_file_mime_type TEXT, pdf_url TEXT, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS pdf_pages ( session_id TEXT REFERENCES pdf_sessions(id) ON DELETE CASCADE, page_number INTEGER, text_content TEXT DEFAULT '', preview TEXT DEFAULT '', char_count INTEGER DEFAULT 0, ai_summary TEXT, page_image_url TEXT, PRIMARY KEY (session_id, page_number) ); CREATE TABLE IF NOT EXISTS chat_messages ( id TEXT PRIMARY KEY, session_id TEXT REFERENCES pdf_sessions(id) ON DELETE CASCADE, role TEXT NOT NULL, content JSONB NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW() );
PDF 파일을 업로드하면 텍스트를 추출하고, Gemini로 각 페이지 요약을 생성하고, 서버사이드에서 페이지별 PNG 이미지를 렌더링해서 Vercel Blob에 저장하는 API를 만듭니다.
사용자 질문을 받아 관련 PDF 내용을 검색하고, Gemini API로 스트리밍 답변을 생성합니다. 근거 JSON과 답변이 SSE로 실시간 전달됩니다.
채팅 인터페이스, PDF 뷰어, 사이드바 등 프론트엔드 전체를 만듭니다. SSE 스트리밍을 실시간으로 받아 마크다운으로 렌더링합니다.
사용자가 처음 들어오는 /chat 페이지와 PDF 업로드 UI를 만듭니다.
기능 구현 후 UI를 다듬는 단계입니다. 아래 시스템 프롬프트를 먼저 Claude에게 주고, 그 다음 디자인 요청을 하면 훨씬 퀄리티 높은 UI가 나옵니다.
GitHub에 올린 후 Vercel에 연결하면 자동 배포됩니다
git init git add . git commit -m "initial commit" git remote add origin https://github.com/유저명/pdf-evidence-ai.git git push -u origin main
vercel.com → Add New → Project
GitHub 연동 → 방금 만든 레포 선택
Framework Preset: Next.js 자동 감지됨
Environment Variables에 .env.local 내용 모두 입력
Deploy 클릭 → 2~3분 후 배포 완료
배포 후 실제 URL로 업데이트하세요.
NEXTAUTH_URL=https://your-app.vercel.app
Google Cloud Console → OAuth 클라이언트 → 승인된 리디렉션 URI에 https://your-app.vercel.app/api/auth/callback/google 추가
Vercel 대시보드 → Storage 탭 → Create Blob Store
프로젝트에 연결 → BLOB_READ_WRITE_TOKEN 자동 생성
이후 git push만 하면 Vercel이 자동 재배포
각 서비스에서 API 키를 발급받는 방법입니다
GEMINI_API_KEY에 저장DATABASE_URL에 저장http://localhost:3000/api/auth/callback/googleGOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRETBLOB_READ_WRITE_TOKEN 자동 추가NEXTAUTH_SECRET에 저장openssl rand -base64 32
openssl이 없으면: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
| 변수명 | 설명 | 어디서 얻나요 | |
|---|---|---|---|
| DATABASE_URL | NeonDB PostgreSQL 연결 문자열 | NeonDB 대시보드 → Connection string | 필수 |
| GEMINI_API_KEY | Google Gemini API 키 | aistudio.google.com/apikey | 필수 |
| BLOB_READ_WRITE_TOKEN | Vercel Blob 스토리지 토큰 | Vercel → Storage → Blob | 필수 |
| GOOGLE_CLIENT_ID | Google OAuth 클라이언트 ID | Google Cloud Console → OAuth | 필수 |
| GOOGLE_CLIENT_SECRET | Google OAuth 클라이언트 시크릿 | Google Cloud Console → OAuth | 필수 |
| NEXTAUTH_SECRET | 세션 서명용 랜덤 시크릿 (32바이트) | openssl rand -base64 32 | 필수 |
| NEXTAUTH_URL | 앱 주소 (로컬: localhost:3000) | 직접 입력 | 필수 |
| GOOGLE_CSE_ID | Google Custom Search Engine ID (웹검색) | programmablesearchengine.google.com | 선택 |
| GOOGLE_API_KEY | Google Custom Search API 키 (웹검색) | Google Cloud Console → API Keys | 선택 |