
데이터베이스
PocketBasePocketBase
PocketBase는 단일 실행 파일로 배포 가능한 오픈소스 백엔드로, SQLite 위에 구축된 실시간 데이터베이스, 파일 스토리지, 인증, REST/GraphQL API를 단일 바이너리로 제공한다.
특징 및 아키텍처
단일 바이너리 (pocketbase):
├─ SQLite (데이터 저장)
├─ REST API (자동 생성)
├─ Realtime SSE (실시간 구독)
├─ 인증 (이메일, OAuth2)
├─ 파일 업로드 (S3 호환)
└─ Admin UI (웹 대시보드)
배포: ./pocketbase serve
접속: http://localhost:8090
Admin: http://localhost:8090/_/JavaScript SDK 사용
javascript
import PocketBase from 'pocketbase';
const pb = new PocketBase('http://localhost:8090');
// 인증
const authData = await pb.collection('users').authWithPassword(
'user@example.com', 'password123'
);
console.log(pb.authStore.isValid); // true
console.log(pb.authStore.token);
// CRUD
// 생성
const record = await pb.collection('posts').create({
title: '첫 번째 포스트',
content: '내용입니다.',
author: pb.authStore.model.id
});
// 조회 (필터, 정렬, 확장)
const posts = await pb.collection('posts').getList(1, 20, {
filter: 'published = true && created >= "2024-01-01"',
sort: '-created',
expand: 'author' // 관계 필드 확장
});
// 실시간 구독
pb.collection('posts').subscribe('*', (e) => {
if (e.action === 'create') console.log('새 게시물:', e.record);
if (e.action === 'update') console.log('수정됨:', e.record);
if (e.action === 'delete') console.log('삭제됨:', e.record);
});
// 구독 해제
pb.collection('posts').unsubscribe();Go 훅 (서버 확장)
go
package main
import (
"log"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/apis"
)
func main() {
app := pocketbase.New()
// 레코드 생성 전 훅
app.OnRecordBeforeCreateRequest("posts").Add(func(e *core.RecordCreateEvent) error {
e.Record.Set("slug", generateSlug(e.Record.GetString("title")))
return nil
})
// 커스텀 API 엔드포인트
app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
e.Router.GET("/api/stats", func(c echo.Context) error {
return c.JSON(200, map[string]int{"total": 42})
}, apis.ActivityLogger(app))
return nil
})
if err := app.Start(); err != nil {
log.Fatal(err)
}
}관련 문서
- •[[couchdb|CouchDB]]
- •[[firebase-rtdb|Firebase Realtime Database]]
- •[[nosql-patterns|NoSQL 패턴]]