Firebase를 대체할 이 무료 Go 솔루션은 단 하나의 파일로 충분합니다
BBetter Stack
Computing/SoftwareSmall Business/StartupsInternet Technology
Transcript
00:00:00PocketBase는 Supabase나 Firebase의 오픈 소스 대안으로, 아마 가장 단순한
00:00:04백엔드일 것입니다. 단 하나의 파일만으로 실시간 데이터베이스, 인증, 그리고
00:00:11파일 스토리지를 제공합니다. 이는 현대 웹 개발의 엄청난 복잡성과 극명하게 대비되죠.
00:00:16그래서 오늘 영상에서는 PocketBase를 테스트해 보고, 그 단순한 아키텍처가
00:00:21간단한 앱을 넘어선 서비스를 구축할 때도 정말 잘 버틸지 확인해 보겠습니다.
00:00:29PocketBase는 SQLite가 내장된 단일 Go 바이너리입니다. 하지만 Go 언어로 직접 코딩하는 것은
00:00:35선택 사항입니다. 백엔드를 JavaScript나 TypeScript로 확장할 수 있기 때문이죠. 또한 Supabase와
00:00:40매우 유사하게 모든 컬렉션을 설정할 수 있는 기본적인 관리자 UI도 제공받게 됩니다.
00:00:46이제 아키텍처와 실제 사용 방법에 대해 알아보죠. PocketBase가 실행되면 JavaScript SDK를 통해
00:00:51프론트엔드에서 연결할 수 있습니다. 이 점 역시 Firebase나
00:00:57Supabase의 설계 방식과 매우 흡사합니다. 프론트엔드에서 데이터베이스에 직접 접근할 수 있으니까요.
00:01:02걱정 마세요. PocketBase에는 API 규칙과 인증 기능이 있어 이 모든 규칙을 안전하게 유지합니다. 바로
00:01:08인증, 데이터베이스, 파일 스토리지를 갖춘 실제 애플리케이션 데모를 살펴보겠습니다. 이 영상이
00:01:13유익하다면 Better Stack을 구독해 주세요. 이 채널에서 다양한 개발자 콘텐츠를 다루고 있습니다.
00:01:18자, 여기 애플리케이션이 있습니다. 백엔드에는 PocketBase가 있고, 웹 프론트엔드는
00:01:22React로 작성되었습니다. 웹 프론트엔드에서 가장 중요한 파일은 여기 있는 pb.ts 파일입니다. 왜냐하면
00:01:30여기서 PocketBase를 불러오기 때문이죠. PocketBase 클래스를 가져와서 새로운 인스턴스를 생성한 다음,
00:01:36백엔드 서비스에 연결하고, 이제 나머지 애플리케이션 전반에서 pb를 사용할 수 있게 됩니다.
00:01:42애플리케이션 자체는 간단한 버그 추적기입니다. 항목을 열 사이로 드래그할 수 있고, 새로운
00:01:48이슈를 생성할 수도 있죠. 로그인한 사용자를 관리하는 훅을 살펴보면,
00:01:53처음에 pb.authStore.record로 상태를 설정하는 것을 볼 수 있습니다. 이렇게 하면 현재 인증된 사용자를
00:01:59PocketBase에서 가져옵니다. 그런 다음 리스너를 설정해서, authStore가
00:02:05onChange 이벤트로 변경될 때마다 새로운 사용자를 상태로 설정하도록 합니다. 정말 간단하죠?
00:02:11상태에 접근하고 구독할 수 있으며, 이슈에 대해서도 똑같이 적용됩니다.
00:02:16useIssues 훅 내부에서 마찬가지로 상태를 초기화하지만, 여기서는 빈 배열로 시작합니다.
00:02:21그 후 useEffect를 사용하여 모든 이슈 목록을 가져와
00:02:27그 목록으로 이슈 상태를 설정합니다. 이렇게 하면 처음에 데이터가 미리 채워지고, 그 후에는
00:02:32이슈를 계속 구독할 수 있습니다. 그래서 이슈를 열 사이로 드래그하거나 생성 또는 삭제하면
00:02:38pb.collection(“issues”).subscribe를 호출하여, 새로운 레코드가 들어올 때마다
00:02:44상태에 추가할 수 있습니다. 즉, PocketBase 데이터베이스와 직접 상호작용할 때,
00:02:49카드를 드래그하면 상태가 자동으로 업데이트됩니다. 새로운 이슈를 생성할 때는
00:02:54스크린샷을 첨부할 수도 있습니다. 애플리케이션 스크린샷을 찍어서
00:02:59이슈 제출을 클릭하면, 새로운 이슈가 프론트엔드 코드에 나타납니다. 이는
00:03:05제출 함수를 통해 처리되며, 모든 폼 데이터를 추가한 후 마지막으로 pb.collection(“issues”).create를
00:03:11호출하여 데이터를 전달합니다. 백엔드에는 이러한 API의 오용을 막기 위한 컬렉션 API
00:03:17규칙이 있습니다. PocketBase는 기본적으로 관리자 인터페이스를 제공하며,
00:03:24여기서 사용자 컬렉션과 이슈 컬렉션을 볼 수 있습니다.
00:03:27모든 이슈가 저장되는 곳이죠. 사용자 컬렉션을 살펴보고 상단의 설정을 누르면
00:03:32API 규칙 탭이 있는데, 이것이 특정 컬렉션에 대한 접근을 제한하는 모든 규칙입니다.
00:03:37예를 들어 사용자 컬렉션에서는 요청의 인증 ID가 빈 문자열이 아니어야 한다고 설정하고,
00:03:43사용자를 수정하거나 삭제할 때는 ID가 인증된 사용자의 ID와 일치해야 합니다. 이 작업은
00:03:50특별한 문자열인 @request.auth.id를 통해 접근할 수 있습니다. 과거에 Supabase를 사용해
00:03:56보셨다면 이 패턴이 매우 익숙할 것입니다. 그럼 백엔드가 원하는 모든 것을
00:04:02하지 못할 때는 어떻게 할까요? 다행히 Go뿐만 아니라 JavaScript와
00:04:08TypeScript로 훅을 사용하여 기능을 확장할 수 있습니다. 앱 시작 시의 onBootstrap이나
00:04:15데이터베이스 레코드가 생성될 때의 onRecordCreate 같은 이벤트에 연결할 수 있죠. 촬영 시점에 82개의 고유한 훅이 있으니,
00:04:21필요한 기능은 거의 다 다룰 수 있습니다. 이제 PocketBase 서비스를 확장하여 어떻게 작동하는지 봅시다.
00:04:27pb 폴더를 보면 PocketBase 바이너리가 있는데, 이 파일이 기본 버전의 PocketBase를
00:04:32실행하는 데 필요한 전부입니다. 하지만 저는 훅을 전부
00:04:38TypeScript로 작성했기 때문에, 컴파일 설정을 통해 해당 훅들을 JavaScript로 컴파일하여 pb_hooks 폴더에 넣었습니다. 왜냐하면
00:04:44PocketBase는 JavaScript만 기본으로 지원하기 때문입니다. 그래서 TypeScript를 사용한다면 컴파일 과정이 필요하죠.
00:04:50메인 훅 파일을 보면, onRecordCreate라는 훅이 있는 것을 볼 수 있습니다.
00:04:55이것은 특히 이슈를 생성할 때를 대상으로 합니다. 여기서 하는 작업은
00:05:00레코드가 생성될 때마다 사용자에게 이메일을 보내는 것입니다. e.app.newMailClient()를 호출하고
00:05:05send()를 사용한 뒤, 여기서 구성한 메시지 객체를 전달하면 됩니다.
00:05:10물론 PocketBase 내의 다양한 기능을 활용할 수 있으므로, 필요한 모든 커스텀 기능은
00:05:15이미 제공되는 82개 이상의 훅으로 지원될 것입니다.
00:05:21이것은 SQLite를 실행하므로 영구 저장소가 필요합니다. 따라서 Heroku, Render,
00:05:28Railway 같은 플랫폼은 휘발성 파일 시스템 때문에 적합하지 않습니다. 앱을 재배포할 때마다 데이터가 사라지기 때문이죠.
00:05:33이를 피하려면 영구 파일 시스템을 연결할 수 있지만, 더 좋고
00:05:39저렴한 옵션은 VPS에서 호스팅하는 것입니다. 데이터는 pb_data 폴더 안에 저장됩니다. 그러니
00:05:45이 안을 살펴보면, storage 폴더가 있는 것을 볼 수 있는데 여기에는
00:05:50이슈에 업로드한 모든 이미지가 저장됩니다. 그냥 storage 폴더에 보관되는 것이죠.
00:05:55예를 들어 이 무작위 ID 폴더 안에는 제가 아까 이슈에 올렸던 이미지가 있습니다.
00:05:59데이터베이스 파일 자체도 이 폴더 안에 영구적으로 저장됩니다. 여기 data.db 파일이
00:06:05우리의 모든 SQLite 코드를 포함하고 있습니다. 따라서 이 파일을 삭제하면 애플리케이션의 모든 데이터를 잃게 됩니다.
00:06:11그러니 단순히 디스크에 단일 파일로 두기보다는 좋은 백업 전략이 필요합니다.
00:06:16기본 티어가 25달러부터 시작하는 Supabase 같은 도구와 비교하면 PocketBase는
00:06:22거의 무료입니다. 단지 4달러 정도의 저렴한 VPS 비용만 내면
00:06:28원하는 만큼 프로젝트를 운영할 수 있습니다. 물론 사용량에 따라 확장해야 하겠지만요.
00:06:33PocketBase는 마이그레이션, 작업 예약, 그리고
00:06:38로깅 등 프로덕션 앱에 필요한 모든 것을 갖추고 있습니다. pg_public 폴더에 파일을 넣어서
00:06:44정적 파일을 직접 제공할 수도 있는데, 이는 React 프론트엔드 등에 유용합니다. 또는
00:06:49템플릿 렌더링으로 동적 경로를 호스팅할 수도 있는데, 이는 이메일 템플릿 등에 완벽합니다.
00:06:54단일 박스 설정을 원하신다면 이렇게 하시면 됩니다. 자, 가장 중요한 질문은 프로덕션용으로 준비되었느냐 하는 것이겠죠.
00:06:59음, 현대적인 SaaS 앱을 만드는 데 필요한 모든 기능을 포함하고 있습니다. 특히
00:07:04마이그레이션이나 로깅 같은 프로덕션 수준의 기능도 있고, 완전히 확장 가능해서
00:07:09기본값에만 얽매이지 않아도 됩니다. 하지만 큰 주의점은 아직 v1 이전 버전이라는 것입니다. 그래서 제작자들은 명시적으로
00:07:15변경 로그를 읽고 때때로 수동 마이그레이션을 실행하는 것이 괜찮은 경우에만 사용하라고 권장합니다. 하지만 그게 괜찮다면
00:07:20한 번 시도해 보세요. 여러분만의 첫 번째 단일 파일 유니콘을 만들 수 있을 겁니다. PocketBase에 대한 더 많은 정보는
00:07:25설명란의 관련 링크를 확인해 보세요. 만약 오픈 소스 대안을 좋아하신다면
00:07:29Claude Code의 오픈 소스 대안인 Open Code에 관한 저희 영상도 확인해 보세요. 저는 Better Stack의 Warren이었고요.
00:07:35시청해 주셔서 감사합니다. 다음 영상에서 뵙겠습니다.