금주 작업은 테스트와 오류 수정, UX 개선 작업을 주로 진행했다.
모든 작업은 Antigravity 에이전트로 진행했으며, 주로 사용한 모델은 Claude Opus 4.5이다.
에이전트를 활용해 진행하는 프로젝트이기 때문에 모든 작업과정을 Antigravity가 진행하게 두었다. 테스트 및 오류 수정 작업이 완료되면 작업과정을 문서화해 별도 폴더에 저장하도록 지시했다.
아래 문서는 관리자 페이지 테스트 결과 및 오류 수정 과정을 담았다.
Troubleshooting Log: 2026-01-05
개요
이 문서는 2026년 1월 5일에 수행된 관리자 페이지 트러블슈팅 과정을 기록합니다.
발견된 문제
문제 1: 프로젝트 생성 실패 (400 Bad Request)
증상:
POST /api/projects 400
Error: "Missing required fields"
원인:
- API(
src/app/api/projects/route.ts)에서thumbnail을 필수 필드로 요구 - UI(
src/app/admin/projects/new/page.tsx)에서는 "(optional)"로 표시 - 사용자가 thumbnail 없이 프로젝트 생성 시도 시 실패
해결:
// 수정 전
if (!title || !slug || !category || !year || !thumbnail || !description) {
return NextResponse.json(
{ error: "Missing required fields" },
{ status: 400 }
);
}
// 수정 후
const missingFields: string[] = [];
if (!title) missingFields.push("title");
if (!slug) missingFields.push("slug");
if (!category) missingFields.push("category");
if (!year) missingFields.push("year");
if (!description) missingFields.push("description");
if (missingFields.length > 0) {
return NextResponse.json(
{ error: Missing required fields: ${missingFields.join(", ")} },
{ status: 400 }
);
}
// thumbnail이 없으면 첫 번째 이미지 사용
const finalThumbnail = thumbnail || images?.[0]?.url || "";
문제 2: 프로젝트 생성/수정 실패 (500 Internal Server Error)
증상:
POST /api/projects 500
PUT /api/projects/[id] 500
prisma:error Connection terminated unexpectedly
TypeError: The "string" argument must be of type string or an instance of Buffer or ArrayBuffer. Received an instance of Object
원인:
@neondatabase/serverless 패키지의 호환성 문제디버깅 과정:
- fetch 모드 시도 (
poolQueryViaFetch = true) - WebSocket 모드 시도 (
ws패키지 설치) - Prisma 설정 변경 시도
- 입력: Title: "Prisma 6 Test", Category: "Final Test"
- 결과: ✅ 성공 - 프로젝트 목록으로 리다이렉트
- 작업: Category를 "Successfully Fixed"로 변경
- 결과: ✅ 성공 - 변경사항 저장 및 리다이렉트
- 결과: ✅ 성공 - 4개 프로젝트 표시 (새로 생성한 1개 포함)
- Vercel 배포 시: Prisma 6.x는 Neon과 직접 연결 가능하므로 동일 설정 유지
- Prisma 7 마이그레이션: Edge Runtime 필요 시에만 Neon adapter 사용 고려
- 환경 분리: 로컬 개발용 PostgreSQL 인스턴스 사용 고려
- Prisma with Neon
- Neon Serverless Driver
- Prisma 6.x Migration Guide
- 결과: 동일한 Buffer 타입 에러 발생
- 결과: "Connection terminated unexpectedly" 에러 발생
- prisma.config.ts에서 directUrl 설정
- 결과: Prisma 7.x에서 adapter 필수 요구
최종 해결:
Prisma 7.2.0 → 6.19.1 다운그레이드
# 1. Neon 관련 패키지 제거
npm uninstall @prisma/adapter-neon @neondatabase/serverless ws @types/ws
2. Prisma 6.x 설치
npm install prisma@6 @prisma/client@6
3. prisma.config.ts 삭제 (Prisma 7 전용 파일)
del prisma.config.ts
4. Prisma 클라이언트 재생성
npx prisma generate
수정된 파일:
src/lib/prisma.ts:
import { PrismaClient } from "@prisma/client";
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined;
};
function createPrismaClient(): PrismaClient {
return new PrismaClient({
log: process.env.NODE_ENV === "development" ? ["warn", "error"] : ["error"],
});
}
export const prisma = globalForPrisma.prisma ?? createPrismaClient();
if (process.env.NODE_ENV !== "production") {
globalForPrisma.prisma = prisma;
}
prisma/schema.prisma:
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DATABASE_URL_UNPOOLED")
}
패키지 변경 내역
제거된 패키지
| 패키지 | 버전 | 이유 |
|--------|------|------|
| @prisma/adapter-neon | 7.2.0 | Prisma 6.x에서 불필요 |
| @neondatabase/serverless | 1.0.2 | Node.js 호환성 문제 |
| ws | 8.18.3 | Neon adapter 의존성 |
| @types/ws | 8.18.1 | ws 타입 정의 |
변경된 패키지
| 패키지 | 이전 | 이후 |
|--------|------|------|
| prisma | 7.2.0 | 6.19.1 |
| @prisma/client | 7.2.0 | 6.19.1 |
검증 결과
테스트 1: 프로젝트 생성
테스트 2: 프로젝트 수정
테스트 3: 프로젝트 목록
향후 권장 사항
참고 자료
*작성일: 2026-01-05*
Antigravity가 잡아낸 오류는 아래와 같다.
- 프로젝트 생성 API에서는 썸네일이 필수값으로 처리되어 있었으나, UI에서는 선택 항목으로 안내되고 있어 400 에러가 발생하는 문제
- Prisma 7.x와 Neon serverless 드라이버 간의 호환성 문제로 인해 발생한 커넥션 에러
처리 과정에서 다양한 문제를 맞닥뜨리고 차근차근 해결하는 과정도 함께 볼 수 있었다.
트러블슈팅 이후에는 UX 점검 및 수정 작업을 진행했다. 트러블슈팅때와 마찬가지로 Antigravity가 모두 진행하게 두고, 작업이 끝나면 모든 과정을 문서화하도록 지시했다.
아래 문서는 UX 점검 결과 및 개선 과정을 담았다.
프로젝트 목록 기능 개선 (2026-01-06)
개요
관리자 프로젝트 목록 페이지에 삭제 버튼과 드래그 앤 드롭 순서 변경 기능 추가
추가된 기능
1. 삭제 버튼
- 각 프로젝트 행에 "Delete" 버튼 추가
- 클릭 시 확인 모달 표시 ("정말 삭제하시겠습니까?")
- 취소/삭제 버튼으로 안전한 삭제 프로세스
- ☰ 드래그 핸들로 프로젝트 순서 변경
- 드롭 즉시 서버에 순서 저장
- 페이지 새로고침 후에도 순서 유지
2. 드래그 앤 드롭 순서 변경
변경된 파일
| 파일 | 변경 내용 |
|------|----------|
| package.json | @dnd-kit/core, @dnd-kit/sortable, @dnd-kit/utilities 추가 |
| src/app/api/projects/route.ts | PUT 메서드 추가 (순서 일괄 변경 API) |
| src/components/admin/ProjectList.tsx | 신규 클라이언트 컴포넌트 |
| src/app/admin/projects/page.tsx | ProjectList 컴포넌트 사용으로 리팩토링 |
API 변경사항
PUT /api/projects (신규)
프로젝트 순서 일괄 변경
Request Body:
{
"orders": [
{ "id": "project-id-1", "order": 0 },
{ "id": "project-id-2", "order": 1 }
]
}
Response:
{ "success": true }
사용된 라이브러리
Antigravity는 직접 크롬 브라우저를 통해 웹페이지를 직접 테스트할 수 있는 점이 있다보니 드래그 앤 드롭 기능 추가, 피드백 애니메이션 개선 등 인터렉션 관련 개선사항도 함께 제안해주었다. 제안한 개선사항은 아래와 같다.
- 프로젝트 목록에 삭제 버튼 직접 추가
- 폼 validation 시 실시간 피드백 (빨간 테두리 등)
- 이미지 업로드 드래그 앤 드롭 개선
- 프로젝트 순서 변경 드래그 기능
이 중에 프로젝트 목록에 삭제 버튼 추가, 프로젝트 순서 변경 드래그 기능 개선을 요청해 수정했다.
수정사항 모두 정상적으로 잘 추가된 것까지 확인하고 금주 작업을 마무리했다.