AI를 활용한 웹 애플리케이션 구축
- 7.1 프로젝트 설정
- 7.2 데이터베이스 설계
- 7.3 풀스택 통합
- 7.4 테스트와 검증
- 7.5 배포와 운영
AI를 활용해서 실제로 동작하는 웹 앱을 처음부터 끝까지 만드는 실전 가이드야. 프로토타이핑에서 한 단계 더 나간 거지.
AI로 웹앱을 만들 때 첫 번째로 할 일은 프로젝트 구조를 잡는 것이야. 접근법은 명확해 — AI에게 코드를 바로 생성시키지 말고, 먼저 프로젝트 계획을 세우게 해.
"Next.js 14, TypeScript, Tailwind CSS, Prisma, PostgreSQL로 할 일 관리 앱을 만들 건데, 먼저 폴더 구조와 기술 스택 결정 이유를 설명해줘. 코드는 아직 쓰지 마."
이렇게 시작하면 AI가 프로젝트 구조를 제안하고, 각 기술 선택의 이유를 설명해. 여기서 개발자는 AI의 제안을 검토하고 조정할 수 있지. "Prisma 대신 Drizzle ORM을 쓰고 싶은데, 폴더 구조를 그에 맞게 수정해줘" 같은 식으로.
중요한 건 — 설정 파일(tsconfig.json, eslint.config, tailwind.config 등)은 AI가 잘 생성해줘. 하지만 프로젝트 간에 일관성을 유지하려면 본인만의 템플릿을 갖고 있는 게 좋아. AI에게 매번 처음부터 만들게 하면 프로젝트마다 설정이 미묘하게 달라지거든.
패키지 의존성도 주의가 필요해. AI가 추천하는 라이브러리가 더 이상 유지보수되지 않는 경우가 있고, 최신 버전과 호환되지 않는 버전을 지정하는 경우도 있지. package.json은 반드시 직접 확인해야 해.
AI에게 데이터베이스 스키마를 설계시키면 합리적인 결과가 나오는 경우가 많아. 기본적인 정규화, 외래 키 관계, 인덱스 설정 같은 건 잘 하거든.
하지만 주의점들이 있어:
- 비즈니스 요구사항을 충분히 전달해 — "사용자 테이블 만들어줘"가 아니라 "사용자는 이메일 또는 소셜 로그인으로 가입할 수 있고, 한 사용자가 여러 조직에 속할 수 있고, 각 조직 내에서 역할(admin, member, viewer)이 다를 수 있어"처럼
- 마이그레이션을 고려해 — AI가 최초 스키마는 잘 만들지만, 이후 스키마 변경(마이그레이션)에서 데이터 유실이 생길 수 있어. 마이그레이션 스크립트는 반드시 검토해야 해
- 성능을 위한 인덱스 — AI가 기본 인덱스는 잡아주지만, 실제 쿼리 패턴에 맞는 복합 인덱스나 부분 인덱스는 직접 고려해야 하지
- 시드 데이터 — 테스트용 더미 데이터 생성은 AI가 아주 잘하는 영역이야. "각 테이블에 대해 현실적인 테스트 데이터 20건씩 만들어줘"
ORM 설정도 AI가 잘 해주는 부분이야. Prisma 스키마나 Drizzle 스키마를 자연어 설명에서 바로 생성해주지. 하지만 관계 설정(1:N, N:M)과 캐스케이드 삭제 정책은 꼭 직접 확인해야 해.
프론트엔드와 백엔드를 각각 AI로 만드는 건 비교적 수월해. 문제는 둘을 연결하는 부분이야.
풀스택 통합에서의 흔한 문제를 보면:
- API 계약 불일치 — 프론트엔드에서 기대하는 응답 형식과 백엔드가 보내는 형식이 다른 경우. AI에게 프론트와 백을 따로 요청하면 이런 일이 생기지
- 타입 불일치 — TypeScript를 쓰더라도 프론트와 백의 타입 정의가 따로 놀 수 있어
- 인증 흐름 — 로그인, 토큰 갱신, 로그아웃의 전체 흐름을 AI가 부분적으로만 구현하는 경우
- 상태 관리 — 서버 상태와 클라이언트 상태의 동기화. AI가 각각은 잘 하는데 둘 사이의 일관성은 놓치기 쉬워
해결책은 — API 계약을 먼저 정의하고, 프론트와 백 모두 그 계약을 따르게 하는 거야. OpenAPI 스펙이나 tRPC 같은 도구를 쓰면 타입 안전한 API 계약이 보장돼. AI에게 "이 OpenAPI 스펙에 맞는 백엔드 핸들러를 구현해줘"라고 하면 계약 불일치 문제를 줄일 수 있지.
서버 컴포넌트(React Server Components)나 서버 액션 같은 최신 패턴도 AI가 잘 생성해주지만, **데이터 페칭 전략(언제 서버에서 가져오고, 언제 클라이언트에서 가져올지)**은 개발자가 판단해야 해.
웹앱의 테스트를 AI에 활용하는 전략을 계층별로 보면:
유닛 테스트 — AI가 가장 잘하는 영역이야. 개별 함수, 유틸리티, 헬퍼에 대한 테스트를 빠르게 생성하지. "이 함수에 대해 경계값 테스트를 포함한 유닛 테스트를 Jest로 작성해줘"
통합 테스트 — API 엔드포인트, 데이터베이스 연동 테스트. AI가 합리적인 테스트를 만들어주지만, **테스트 환경 설정(테스트 DB, 목 서버 등)**은 직접 잡아야 하는 경우가 많아
E2E 테스트 — Playwright나 Cypress를 활용한 전체 흐름 테스트. AI에게 "사용자가 로그인하고, 할 일을 추가하고, 완료 처리하는 E2E 테스트를 Playwright로 작성해줘"라고 하면 합리적인 테스트가 나와
수동 검증 체크리스트 — 자동화가 어려운 부분(UI/UX, 크로스 브라우저, 접근성)은 체크리스트를 AI에게 만들게 하고 직접 확인하는 거지
테스트는 AI가 생성한 코드에 대한 안전망이야. 테스트 없이 AI 생성 코드를 프로덕션에 배포하는 건 안전벨트 없이 운전하는 거라고 보면 돼.
프로토타입이 아니라 실제 서비스로 배포할 때 고려할 점들도 있어.
- CI/CD 파이프라인 — GitHub Actions 같은 CI/CD 설정도 AI가 잘 생성해줘. 하지만 시크릿 관리, 환경변수 설정은 직접 해야 하지
- 인프라 코드 — Docker 설정, 쿠버네티스 매니페스트 같은 것도 AI가 생성 가능해. 하지만 리소스 제한, 헬스 체크, 로깅 설정 같은 운영 디테일은 경험이 필요하거든
- 모니터링 — 에러 추적(Sentry), 로깅(Datadog), 성능 모니터링(Vercel Analytics) 설정. AI에게 기본 설정을 시키고 세부 조정은 직접
마지막으로 강조할 건 — AI로 앱을 빠르게 만들 수 있게 됐지만, 운영의 복잡도는 줄어들지 않았다는 거야. 코드 작성은 소프트웨어 생명주기의 일부일 뿐이고, 배포, 모니터링, 장애 대응, 스케일링은 여전히 인간의 영역이지.
정리
7장에서 기억할 거 세 가지:
- 프로젝트 설정부터 AI에게 시키되, 계획을 먼저 세우고 코드를 나중에 생성해. 바로 코드부터 뽑으면 구조가 엉망이 되거든
- 풀스택 통합에서 가장 많은 문제가 생겨. API 계약을 먼저 정의하고, 프론트와 백이 같은 계약을 따르게 해야 해
- 코드 작성은 소프트웨어 생명주기의 일부일 뿐이야. 배포, 모니터링, 운영의 복잡도는 AI가 줄여주지 않거든