b77 데이터베이스 사용법: 컬렉션, 필터, 사용자별 데이터
모든 builder77 앱에는 데이터베이스가 기본으로 들어 있어요. 컬렉션, 필터, 정렬, 사용자별 레코드가 어떻게 작동하는지, 개인 데이터를 어떻게 지키는지 알아봐요.
대부분은 데이터베이스를 직접 다룰 일이 없어요. 앱을 설명하면 builder77이 데이터를 저장하고 읽는 코드를 써 주니까요. 그래도 작동 방식을 알면 더 좋은 프롬프트를 쓰고, 문제를 더 빨리 찾고, 개인정보에 관해 좋은 결정을 내릴 수 있어요. b77.db를 한번 둘러볼게요.
컬렉션과 레코드
데이터는 컬렉션에 들어가요. tasks, bookings, posts처럼 이름이 붙은 레코드 묶음이에요. 정의할 스키마는 없어요. 컬렉션은 처음 데이터를 쓸 때 만들어지고, 레코드는 내가 넣은 필드를 그대로 담은 일반 객체예요.
const task = await b77.db.create('tasks', { title: 'Write launch post', done: false });
// -> { id, title, done, createdAt, updatedAt, ownerId }builder77은 id, createdAt, updatedAt, ownerId를 자동으로 추가해요. ownerId에는 로그인한 앱 사용자가 있으면 그 사용자가 들어가고, 아래에서 설명할 권한에서 중요해져요.
데이터 읽기: list, get, count
const open = await b77.db.list('tasks', {
where: { done: false }, // exact-match filter
sort: '-createdAt', // '-' = descending
limit: 50 // up to 500
});
const one = await b77.db.get('tasks', id); // record or null
const doneCount = await b77.db.count('tasks', { where: { done: true } });where는 필드가 정확히 일치하는 레코드를 찾아요. 상태 필터, 카테고리, 관련 레코드의 상위 ID 등 앱에 필요한 대부분은 이걸로 충분해요. 크지 않은 목록에서 입력하는 대로 검색하려면 레코드를 불러온 뒤 브라우저에서 거르는 방식을 많이 써요.
수정과 삭제
await b77.db.update('tasks', id, { done: true }); // shallow merge
await b77.db.remove('tasks', id);update는 넘긴 필드를 기존 레코드에 합치기 때문에 바뀐 부분만 보내면 돼요.
mine: true로 사용자별 데이터 다루기
사람마다 자기 데이터가 있는 앱(일기, 가계부, 습관 기록)이라면 b77.auth와 mine 옵션을 함께 쓰세요. 사용자가 로그인한 상태에서 mine: true를 쓰면 그 사용자가 만든 레코드만 돌려줘요.
await b77.auth.signIn({ email, password });
const myEntries = await b77.db.list('entries', { mine: true, sort: '-createdAt' });보호 장치가 하나 더 있어요. 로그인한 사용자가 만든 레코드는 그 사용자만 수정하거나 삭제할 수 있어요. 누군가 요청을 직접 만들어 보내도 API는 자기 소유가 아닌 레코드의 수정을 거부해요.
공개 데이터와 비공개 데이터: 간단 가이드
- 공개 콘텐츠(메뉴, 블로그 글, 상품 목록): 읽는 데 로그인이 필요 없어요. builder77에게 예시 데이터를 넣어 달라고 하거나 관리 화면을 추가해 달라고 하고, 데이터 탭에서 언제든 수정하세요.
- 제출 데이터(문의 양식, 대기자 명단, 예약): 누구나 만들 수 있고, 데이터 탭에서 내가 읽어요.
- 개인 데이터(메모, 건강 기록, 재정): 로그인을 필수로 하고 항상
mine: true로 조회하세요.
기억해 둘 원칙이 하나 있어요. 앱의 프런트엔드 코드는 방문자에게 다 보이기 때문에, 누가 무엇을 읽을 수 있는지는 서버에서 컬렉션마다 접근 규칙으로 정해요. 카탈로그는 읽기 전용, 양식과 주문은 제출만(나만 볼 수 있음), 개인 데이터는 본인만이에요. builder77이 컬렉션 이름을 보고 안전한 규칙을 고르고, 데이터 탭에서 바꿀 수 있어요. 직접 전체 공개로 지정한 컬렉션만 누구나 읽고 바꿀 수 있어요. 앱 안에서 주문이나 예약을 관리하려면 데이터 → 관리자로 열기에서 앱을 여세요. 앱 전체를 나나 우리 팀만 쓴다면 설정에서 비공개 앱을 켜세요.
데이터 탭
빌더 대시보드 탭의 데이터에서는 모든 컬렉션을 살펴보고, 레코드를 수정하거나 삭제하고, 앱 사용자를 보고, 업로드된 파일을 확인할 수 있어요. 콘텐츠의 오타를 고치거나, 테스트 항목을 정리하거나, 양식이 제대로 저장되는지 확인할 때 가장 빠른 방법이에요.
Flutter와 다른 클라이언트에서도 같은 데이터
웹 SDK는 REST API를 얇게 감싼 것이고, Flutter로 내보낸 앱도 같은 API를 써요. 그래서 어떤 클라이언트든 같은 컬렉션을 읽고 쓸 수 있어요.
GET /api/runtime/<projectId>/db/tasks?where={"done":false}&sort=-createdAt&limit=100
POST /api/runtime/<projectId>/db/tasks { "data": { "title": "Hi" } }
Authorization: Bearer <appUserToken> (optional, from /auth/signin)앱 사용자 토큰은 프로젝트 하나에만 쓸 수 있어서, 한 앱의 토큰으로 다른 앱에 접근할 수 없어요. 데이터베이스 읽기와 쓰기에는 크레딧이 들지 않으니 요금제의 레코드 한도 안에서 데이터를 마음껏 쓰는 앱을 만들 수 있어요.
데이터를 위한 프롬프트
이 모든 것을 평소 말투로 조정할 수 있어요. “지출을 금액, 카테고리, 날짜와 함께 저장하고, 사용자마다 자기 것만 보게 해 줘”나 “예약에 상태 필드를 추가하고 대기 중인 예약만 보는 필터를 넣어 줘”처럼요. AI가 SDK를 알고 있어서 데이터 모델을 설명하는 것만으로 대개 충분해요.