SQLite 어댑터
외부 서비스 없이 — 로컬 .db 파일 하나만으로, ORM도 데이터베이스 서버도 필요 없습니다.
@instafix/adapter-sqlite는 마찰이 가장 적은 영구 저장 백엔드입니다: 설치할 ORM도, 실행할 데이터베이스 서버도, 실행할 마이그레이션 명령도 없습니다. 두 테이블(instafix_feedback, instafix_annotation)은 better-sqlite3를 통해 특정 파일에 대해 SqliteStore가 처음 생성될 때 자동으로 만들어집니다. Node 20 이상이 필요합니다.
npm install github:gnoopy/instafix#adapter-sqlite-dist연결하기
여기서 쓰는 createInstaFixHandler는 모든 InstaFix 어댑터가 공유하는, 스토어에 무관한 인증/CORS/검증/웹훅 로직을 그대로 실행합니다 — Prisma 관련 패키지를 설치하거나 import할 필요가 전혀 없습니다:
// app/api/instafix/route.ts — Next.js App Router
import { createInstaFixHandler, SqliteStore } from "@instafix/adapter-sqlite";
const store = new SqliteStore({ path: "./instafix.db" });
export const { GET, POST, PATCH, DELETE, OPTIONS } = createInstaFixHandler({ store });createInstaFixHandler가 받는 모든 옵션(apiKey, allowedOrigins, webhooks, screenshotStorage 등)은 여기서도 동일하게 동작합니다 — Prisma 어댑터의 옵션 표와 웹훅 섹션을 참고하세요. Prisma 전용인 부분은 하나도 없습니다.
SqliteStore 옵션
| 옵션 | 타입 | 기본값 | 하는 일 |
|---|---|---|---|
path | string | "./instafix.db" | 데이터베이스 파일 위치. ":memory:"를 넘기면 디스크를 쓰지 않는 일회성 데이터베이스가 됩니다(테스트용) |
screenshotStorage | ScreenshotStorage | — | 데이터 URL을 인라인으로 넣는 대신 실제 스토리지에 업로드 — Prisma 어댑터의 동명 옵션과 동일한 계약 |
caseInsensitiveSearch | boolean | true | 아래 검색 대소문자 구분 참고 |
동작 방식
- 스스로 초기화합니다. 테이블과 인덱스는 생성 시
CREATE TABLE IF NOT EXISTS로 만들어져서, 콜드 스타트마다SqliteStore를 새로 생성해도 안전합니다. - WAL 모드 + 외래 키 활성화. 피드백을 삭제하면 데이터베이스 레벨에서 그 주석들도 함께 삭제됩니다(
ON DELETE CASCADE). clientId중복 시 내부에서 처리하지 않고StoreDuplicateError를 던집니다 — 공유 핸들러가 이를 잡아서 기존 레코드를 반환하므로, 위젯 입장에서POST는 여전히 멱등적으로 동작합니다.verifyProjectOwnership이 구현되어 있습니다 — PATCH/DELETE에서의 프로젝트 간 소유권 검사가PrismaStore와 동일하게 적용됩니다.- JSON 필드(
screenshotRegion,diagnostics, 주석의target)는TEXT로 저장되고 읽고 쓸 때마다 직렬화/역직렬화됩니다.
검색 대소문자 구분
SQLite의 LIKE는 기본적으로 ASCII 문자에 한해서만 대소문자를 구분하지 않습니다(ICU 확장이 없는 한). 그래서 기본값 true는 별다른 비용 없이 대부분의 검색창 기대치를 충족하지만, "café"가 "CAFÉ"와 매칭되지는 않습니다. caseInsensitiveSearch: false로 설정하면 항상 대소문자를 구분하는 GLOB으로 전환됩니다.
네이티브 의존성 하나
memory/localStorage 어댑터와 달리, 이 어댑터는 네이티브 모듈인 better-sqlite3를 설치합니다. 대부분의 플랫폼(Linux, macOS, Windows의 x64/arm64)은 컴파일러 없이 설치 시점에 미리 빌드된 바이너리를 받아옵니다. 흔치 않은 플랫폼에서는 소스에서 컴파일하는 방식으로 대체될 수 있습니다.