도서관 가족 계정 5개, 한 화면에서 보는 웹앱을 Claude Code로 하루 만에 만들기 (Antigravity 비교)

한줄 요약

가족 5명의 도서관 대출/예약 현황을 매번 로그인해서 확인하던 불편함을, Claude Code와 함께 모바일 웹앱으로 해결했습니다.

이런 분들께 도움돼요

  • 가족 여러 명의 도서관 계정을 관리하시는 분

  • Vercel 무료 플랜에서 Puppeteer 스크래핑을 시도하시는 분

  • AI와 협업할 때 "방향은 내가, 구현은 AI가"라는 역할 분담이 궁금하신 분


소개: 시도하고자 했던 것과 그 이유

문제 상황

가족 5명이 각자 도서관 앱에 로그인해서 반납일을 확인하는 게 너무 번거로웠습니다. 특히 아이들 책은 부모가 대신 확인해야 하는데, 매번 5개 계정을 왔다갔다 하기가 힘들었어요.

"5명 책을 한눈에 볼 수 있으면 좋겠다"는 생각을 계속 하고 있었습니다.

도서관 앱을 통해 5명 가족 로그인 하나씩 전환해가며 일일이 확인해야 했음

목표

  • 한 화면에서 가족 5명의 대출/예약/책나르샤 현황을 한눈에 보기

  • 반납일 임박한 책은 빨간색으로 강조해서 놓치지 않기

  • 모바일에서 편하게 확인할 수 있는 웹앱


진행 방법: 어떤 도구를 사용했고, 어떻게 활용했나요?

사용한 도구

  • Claude Code (CLI 환경에서 코딩 협업)

  • Next.js 16 + TypeScript + Tailwind CSS

  • Puppeteer (도서관 사이트 스크래핑)

  • Vercel (무료 플랜 배포)

AI와 협업한 과정

1. Vercel 60초 타임아웃 문제

Vercel 무료 플랜은 API 실행 시간이 60초로 제한됩니다. 5명을 한 번에 조회하면 타임아웃이 걸렸어요.

Claude는 계속 "안 된다"는 진단만 했지만, 저는 안티그래비티에서 비슷한 프로젝트를 해본 경험이 있어서 방법이 있다는 걸 알고 있었습니다.

제가 "1명씩 순차 조회하는 API로 분리하자"고 방향을 제안했고, Claude가 빠르게 구현해줬어요.

기존: /api/status (5명 전체 조회) → 타임아웃
변경: /api/member/1, /api/member/2, ... (1명씩 조회) → 성공
한국어 텍스트가 포함된 검은 화면의 스크린샷

배운 점: AI가 모든 걸 해결해주진 않습니다. 결국 방향은 내가 잡고, AI는 빠르게 구현해주는 역할이었어요.

2. 도서관 사이트 봇 차단 문제

로그인이 자꾸 실패했습니다. 아이디/비밀번호는 맞는데 로그인 페이지에서 안 넘어가는 거예요.

Claude가 "User-Agent 문제일 수 있다"고 진단하고, 모바일 Safari로 위장하는 코드를 추가했더니 바로 해결됐습니다.

await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15');

3. 환경변수 느낌표(!) 이스케이프 문제

비밀번호에 !가 포함되어 있었는데, Vercel CLI로 환경변수를 설정할 때 자꾸 \!로 저장되는 문제가 있었어요.

쉘 이스케이프 문제라는 걸 찾아내고, heredoc을 사용해서 해결했습니다.

cat > /tmp/pw.txt << 'EOF'
비밀번호!
EOF
cat /tmp/pw.txt | vercel env add USER_1_PW production

결과와 배운 점

결과물

https://seocho-lib2.vercel.app

  • 가족 5명 현황을 한 화면에서 확인

  • 1명당 약 16~18초에 조회 완료

  • 반납일 임박(3일 이내)은 빨간색으로 강조

  • 연체 도서는 별도 경고 표시

배운 점

  1. AI가 모든 걸 해결해주진 않는다

    • Claude가 "안 된다"고 할 때, 경험을 바탕으로 방향을 잡아줘야 했어요

    • 방향은 사람이, 구현은 AI가 — 이 역할 분담이 중요합니다

  2. Vercel 무료 플랜으로도 Puppeteer 스크래핑이 된다

    • @sparticuz/chromium-min으로 원격 바이너리 다운로드

    • 60초 제한 안에서 1명씩 처리하면 충분히 가능

  3. 제약 조건 안에서 해결책을 찾는 게 재밌다

    • 유료 플랜 쓰면 쉽게 해결되지만, 무료 플랜 안에서 방법을 찾는 과정이 오히려 재밌었어요


재사용 가능한 프롬프트

Vercel + Puppeteer 조합 시작할 때

Vercel 무료 플랜(60초 타임아웃)에서 Puppeteer로 [사이트명] 스크래핑하는
Next.js API를 만들어줘. @sparticuz/chromium-min 사용해서 서버리스 환경에서
동작하도록 해줘.

스크래핑 봇 차단 우회

[사이트명] 로그인이 안 되는데, 봇 차단 때문인 것 같아.
User-Agent를 모바일 브라우저로 설정하고, 필요하면 추가 헤더도 설정해줘.

API 타임아웃 분리

현재 /api/status에서 5명을 한 번에 조회하는데 타임아웃이 걸려.
/api/member/[id]로 1명씩 조회하는 API로 분리하고,
프론트엔드에서 순차적으로 호출하도록 변경해줘.

도움 받은 자료

특별히 참고한 글은 없고, 안티그래비티에서 동일한 프로젝트를 했던 경험이 가장 큰 도움이 됐습니다.

"이건 된다"는 확신이 있었기 때문에, Claude가 안 된다고 해도 방향을 밀어붙일 수 있었어요.

실은 클로드코드 리밋 걸렸을 때, 안티그래비티로 먼저 같은 프로젝트를 만들어봤습니다.
다 만들고 나서, 클로드코드로 다시 한번 만들어본 거에요.

안티그래비티 Gemini 3 Pro (High) Planning 모드로 했는데, 클코보다 좀 더 편하고 컨텍스트도 길고 좀 더 똑똑한 느낌을 받았습니다. 클코는 좀 다루기 까다롭다면 상대적으로 안티그래피티가 좀 쉽게 느껴진달까..

클코에 좀 더 적응을 해야겠습니다..

아래는 안티그래비티로 작업한 결과물 및 내용 요약입니다. (UI는 이게 좀 더 이쁜듯!)

https://seocho-lib.vercel.app/

한국어 버전 앱 스크린샷

부록..

서초구 내곡도서관 현황판 개발 일지 (with Antigravity)

이 문서는 "가족 도서관 현황판" 프로젝트의 개발 과정, 직면했던 기술적 문제들, 그리고 해결 방법을 요약한 기록입니다.

1. 프로젝트 개요

  • 목표: 가족 구성원(5명)의 서초구 내곡도서관 대출 현황, 예약 현황, 책나르샤 신청 내역을 한눈에 볼 수 있는 대시보드 제작.

  • 기술 스택: Next.js (App Router), Puppeteer (Core), Vercel (Deployment).

2. 개발 및 문제 해결 과정

2.1. 크롤링 로직 구현 (Local)

  • Puppeteer를 사용하여 도서관 로그인 및 페이지 이동 자동화.

  • 아이디/비밀번호 입력 후 이벤트 디스패치(dispatchEvent)를 통해 프론트엔드 유효성 검사 우회.

  • 대출 리스트, 예약 리스트, 책나르샤 페이지를 순회하며 데이터 파싱.

2.2. Vercel 배포와 크로미움(Chromium) 이슈

로컬 환경과 달리 Serverless(Lambda) 환경인 Vercel 배포 과정에서 여러 난관이 있었습니다.

  1. 바이너리 경로 문제 (ENOENT):

    • 증상: 배포된 환경에서

      chromium.br 파일을 찾지 못함.

    • 해결:

      findChromium 헬퍼 함수를 작성하여 node_modules, .next/server, /var/task 등 가능한 모든 경로를 탐색하여 동적으로 실행 경로를 주입.

  2. 공유 라이브러리 오류 (libnss3.so):

    • 증상: Chromium 실행 시 시스템 라이브러리 누락 에러 발생.

    • 원인: 사용 중이던 버전(v123)이 Vercel의 최신 런타임(Node 20 / Amazon Linux 2023)과 호환되지 않음.

    • 해결: @sparticuz/chromiumpuppeteer-core를 최신 버전(v131+, v24+)으로 업그레이드.

  3. 브라우저 크래시 (ConnectionClosed):

    • 증상: 브라우저가 실행되자마자 연결이 끊김.

    • 원인: 5명의 유저를 Promise.all로 동시에 처리(병렬 실행)하면서 메모리 및 CPU 리소스 초과. 또한 Serverless 환경에서 createBrowserContext의 불안정성.

    • 해결:

      • 순차 처리(Sequential Processing): 1명씩 차례대로 처리하도록 변경 (for ... of 루프).

      • 단일 컨텍스트: 컨텍스트 분리 기능을 제거하고 browser.newPage()를 직접 사용.

      • 안전 장치: 실행 인자에 --no-sandbox, --disable-dev-shm-usage, dumpio: true 등 안정성 플래그 및 디버깅 옵션 추가.

2.3. UX 고도화 (사용자 경험 개선)

  1. 실시간 스트리밍 UI (Streaming API):

    • 기존: 5명의 데이터가 다 수집될 때까지(약 1분) 사용자는 멈춘 화면만 봐야 했음.

    • 개선: Next.js API가 ReadableStream을 반환하도록 변경(NDJSON 방식).

    • 결과: "강수혁 님의 데이터를 가져오는 중..." 메시지가 실시간으로 뜨고, 데이터가 수집되는 즉시 화면에 카드가 하나씩 "탁, 탁" 나타나는 생동감 있는 경험 제공.

  2. 디테일 & 인터랙션 폴리싱:

    • Pending Card: 로딩 중일 때 단순히 글자만 뜨는 게 아니라, 다음 카드가 나올 위치에 "로딩 카드"를 배치하고 귀여운 아이콘 애니메이션(롤링 북, 점프 도트) 추가.

    • 상세 보기 모드: 상단 요약 카드를 클릭하면 "반납 임박 도서만 모아보기" 또는 "전체 도서 리스트 보기" 모드로 전환되는 기능 추가.

  3. 데이터 무결성 및 보안 강화:

    • D-Day 정확도 향상: 서버의 UTC 시간대와 관계없이, 한국 시간(KST) 자정을 기준으로 정확한 남은 일수를 계산하도록 로직 강제 (new Date() 오차 수정).

    • 봇 탐지 우회(Stealth Mode): User-Agent를 최신 Chrome으로 위장하고, Sec-CH-UA, Referer 등 실제 브라우저와 동일한 헤더를 전송. 또한 navigator.webdriver 속성을 은폐하여 차단 가능성 최소화.

3. 최종 성과

  • 안정성: Vercel Serverless 환경의 제약 사항을 모두 극복하고 안정적으로 크롤링 수행.

  • 사용성: 정적인 대기 시간을 없애고 실시간 피드백을 제공하여 체감 대기 시간 단축.

  • 직관성: 가족 전체의 도서 현황을 요약 및 상세 보기로 제공하여 도서관 이용 편의성 증대.


작성일: 2026-01-24 작성자: Antigravity (Agentic AI)

--

4
3개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요