--- name: database description: WatermelonDB 이중 DB 시스템 - 앱 DB와 서버별 DB type: supporting --- # Database Domain ## 목적 / 책임 WatermelonDB 기반 이중 데이터베이스를 관리한다. DatabaseManager 싱글톤, operator, 스키마, 모델을 담당한다. ## 포함 경로 - `app/database/` (전체) - `app/database/manager/` - DatabaseManager 싱글톤 - `app/database/models/app/` - 앱 전역 모델 (서버 목록 등) - `app/database/models/server/` - 서버별 모델 (채널, 유저, 포스트 등) - `app/database/operator/` - 데이터 쓰기 operator - `app/database/schema/` - DB 스키마 정의 - `docs/database/` - DB 스키마 문서 ## 제외 경로 - `app/queries/` (Query Layer는 별도 - 여기서 DB를 읽는다) ## 주요 구성 요소 - **DatabaseManager**: 모든 DB 인스턴스 관리 싱글톤 (`app/database/manager/index.ts`) - **App Database**: 서버 목록 등 전역 앱 상태 (하나만 존재) - **Server Database**: 서버별 채널/유저/포스트 데이터 (서버당 하나) - **Operators**: transformer/handler/comparator 패턴으로 데이터 쓰기 - **Schema**: 테이블 정의 및 마이그레이션 ## 유지할 패턴 - DB 경로: iOS는 App Group, Android는 `${documentDirectory}/databases/` - Operator를 통해 batch 작업으로 데이터 쓰기 - Sync handler는 create/update/delete 전체 라이프사이클 처리 필수 - 스키마 변경 시 반드시 버전 번호 증가 + 문서(`docs/database/`) 업데이트 - Query Layer(`app/queries/`)는 `query*`, `observe*`, `get*`, `prepare*` 패턴 ## 다른 도메인과의 경계 - **모든 도메인**: DB 직접 접근보다 Query Layer(`app/queries/`) 사용 권장 - **network 도메인**: remote action이 API 응답을 operator에 전달 ## 금지 사항 - 스키마 변경 후 `docs/database/` 문서 미업데이트 - Sync handler에서 stale 레코드 삭제 누락 (`prepareDestroyPermanently()` 필수) - 테스트에서 `extraLokiOptions: {autosave: false}` 누락 (메모리 누수) - 테스트 후 `DatabaseManager.destroyServerDatabase()` cleanup 누락