전체 글
개발자·7분 분량

b77 데이터베이스 사용법: 컬렉션, 필터, 사용자별 데이터

모든 builder77 앱에는 데이터베이스가 기본으로 들어 있어요. 컬렉션, 필터, 정렬, 사용자별 레코드가 어떻게 작동하는지, 개인 데이터를 어떻게 지키는지 알아봐요.

77
builder77 팀
builder77.com

대부분은 데이터베이스를 직접 다룰 일이 없어요. 앱을 설명하면 builder77이 데이터를 저장하고 읽는 코드를 써 주니까요. 그래도 작동 방식을 알면 더 좋은 프롬프트를 쓰고, 문제를 더 빨리 찾고, 개인정보에 관해 좋은 결정을 내릴 수 있어요. b77.db를 한번 둘러볼게요.

컬렉션과 레코드

데이터는 컬렉션에 들어가요. tasks, bookings, posts처럼 이름이 붙은 레코드 묶음이에요. 정의할 스키마는 없어요. 컬렉션은 처음 데이터를 쓸 때 만들어지고, 레코드는 내가 넣은 필드를 그대로 담은 일반 객체예요.

js
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

js
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 등 앱에 필요한 대부분은 이걸로 충분해요. 크지 않은 목록에서 입력하는 대로 검색하려면 레코드를 불러온 뒤 브라우저에서 거르는 방식을 많이 써요.

수정과 삭제

js
await b77.db.update('tasks', id, { done: true });   // shallow merge
await b77.db.remove('tasks', id);

update는 넘긴 필드를 기존 레코드에 합치기 때문에 바뀐 부분만 보내면 돼요.

mine: true로 사용자별 데이터 다루기

사람마다 자기 데이터가 있는 앱(일기, 가계부, 습관 기록)이라면 b77.auth와 mine 옵션을 함께 쓰세요. 사용자가 로그인한 상태에서 mine: true를 쓰면 그 사용자가 만든 레코드만 돌려줘요.

js
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를 써요. 그래서 어떤 클라이언트든 같은 컬렉션을 읽고 쓸 수 있어요.

http
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를 알고 있어서 데이터 모델을 설명하는 것만으로 대개 충분해요.

이제 만들어 볼까요?

아이디어를 설명하면 1분 정도면 작동하는 첫 버전이 나와요. 무료로 시작할 수 있고 신용카드는 필요 없어요.