피드로 돌아가기
I Built a Multi-Vendor Appointment Booking App
Dev.toDev.to
Backend

I Built a Multi-Vendor Appointment Booking App

풀스택 개발자가 Next.js + PostgreSQL + Drizzle ORM으로 멀티테넌트 예약 관리 플랫폼 구축해 미용실·클리닉·피트니스 스튜디오 등 서비스 기반 비즈니스 지원

Yogesh Chavan2026년 3월 24일12intermediate

Context

예약 관리는 표면상 단순해 보이지만, 실제 운영 환경에서는 여러 스태프의 다양한 스케줄, 서비스별 버퍼 타임, 충돌 감지, 고객 이력 관리, 매출 분석, 역할 기반 접근 제어 등의 복잡성이 빠르게 누적된다. 이를 해킹 없이 프로덕션 수준으로 구현할 수 있는 멀티테넌트 플랫폼이 필요했다.

Technical Solution

  • 프론트엔드 프레임워크: Next.js App Router + TypeScript + Tailwind CSS + Radix UI 조합으로 클라이언트·스태프·관리자 인터페이스 구현
  • 데이터베이스 및 ORM: PostgreSQL(Neon 서버리스) + Drizzle ORM으로 멀티테넌트 격리된 데이터 구조 설계 및 쿼리 관리
  • 인증 시스템: Better Auth(이메일/비밀번호)로 사용자 인증 및 역할 기반 접근 제어(관리자·스태프·슈퍼관리자 구분) 구현
  • 상태 관리 및 폼: TanStack Query(React Query v5) + React Hook Form + Zod v4로 비동기 데이터 페칭 및 폼 유효성 검증 처리
  • 데이터 시각화: Recharts + 로딩 스켈레톤으로 매출 대시보드, 예약 트렌드, 서비스별 수익 분석 차트 표시
  • 파일 저장소: Cloudinary로 비즈니스 로고 및 커스텀 브랜딩 이미지 저장
  • 이메일 서비스: Resend로 예약 확인 알림 및 자동화된 클라이언트 알림 송신
  • 충돌 감지 로직: 데이터베이스 레벨에서 같은 스태프의 이중 예약 방지 및 서비스 기간·스태프 가용성·기존 예약·버퍼 타임을 기반으로 동적 타임슬롯 생성

Key Takeaway

멀티테넌트 예약 시스템 구축 시 데이터베이스 레벨의 충돌 감지와 역할 기반 접근 제어를 핵심으로 설계하면, 클라이언트·스태프·관리자 각 계층의 요구사항을 안전하게 분리할 수 있다. 또한 Drizzle ORM + PostgreSQL 조합으로 타입 안정성을 보장하고, TanStack Query와 React Hook Form으로 폼 상태와 비동기 데이터 페칭을 체계적으로 관리할 수 있다.


서비스 기반 비즈니스용 예약 시스템을 구축하는 팀에서 Better Auth를 사용해 스태프와 관리자의 권한을 분리하면, 스태프는 자신의 일정만, 관리자는 전사 현황만 볼 수 있도록 최소 권한 원칙을 실현할 수 있다. 또한 데이터베이스 제약 조건(database-level constraint)으로 예약 충돌을 방지하면 경쟁 조건(race condition)을 원천적으로 차단해 예약 시스템의 신뢰성을 확보할 수 있다.

원문 읽기