292 lines
12 KiB
Markdown
292 lines
12 KiB
Markdown
# Google TV Family Dashboard App - Project Plan
|
|
|
|
Google TV용 가족 대시보드 앱 구현 계획입니다. TV 화면에서 일일 정보(달력, 날씨, 할일, 성경 말씀)를 표시하고, Flutter 앱을 통해 데이터를 입력/관리할 수 있는 시스템입니다.
|
|
|
|
---
|
|
|
|
## System Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Google TV │
|
|
│ Flutter TV App (APK) │
|
|
└──────────────────────────┬──────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Backend Server │
|
|
│ Node.js + Express API │
|
|
│ MongoDB │
|
|
└──────────────────────────┬──────────────────────────────────────┘
|
|
│
|
|
┌──────────────┼──────────────┐
|
|
▼ ▼ ▼
|
|
┌───────────┐ ┌───────────┐ ┌───────────┐
|
|
│ Weather │ │ Bible │ │ Flutter │
|
|
│ API │ │ API │ │ Mobile │
|
|
└───────────┘ └───────────┘ └───────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Key Decisions
|
|
|
|
| 항목 | 선택 | 비고 |
|
|
|------|------|------|
|
|
| **TV App** | Flutter for Android TV | 모바일 앱과 코드 공유, APK로 TV 설치 |
|
|
| **DB** | MongoDB | 확장성, 유연한 스키마 |
|
|
| **Weather API** | OpenWeatherMap | 무료 1000 calls/day, 환경변수로 변경 가능 |
|
|
| **Bible API** | bible-api.com | 영어+한글 동시 표시, 환경변수로 변경 가능 |
|
|
| **가족 구성원** | Admin 기능으로 관리 | Flutter 앱 내 설정에서 추가/수정/삭제 |
|
|
| **사진 갤러리** | Admin에서 업로드 | TV 화면에 랜덤 슬라이드쇼로 표시 |
|
|
|
|
---
|
|
|
|
## TV Screen Specifications (43인치 기준)
|
|
|
|
| 항목 | 값 | 설명 |
|
|
|------|-----|------|
|
|
| **해상도** | 1920 x 1080 px | Full HD 기준 (4K TV도 호환) |
|
|
| **화면 비율** | 16:9 | 표준 와이드스크린 |
|
|
| **실제 크기** | 95.3cm x 53.6cm | 43인치 대각선 기준 |
|
|
| **Safe Zone** | 90% 영역 사용 | 가장자리 5% 여백 권장 |
|
|
|
|
### UI 레이아웃 가이드
|
|
|
|
```
|
|
┌────────────────────────────────────────────────────────────────────────┐
|
|
│ 1920px (16:9 @ 1080p) │
|
|
├────────────────────────────────────────────────────────────────────────┤
|
|
│ ┌────────────────────────────────────────────────────────────────┐ │
|
|
│ │ Safe Zone (90%) │ │
|
|
│ │ ┌─────────────────────────────┬──────────────────────────┐ │ │
|
|
│ │ │ │ │ │ │
|
|
│ │ │ 메인 영역 (65%) │ 사이드바 (35%) │ │ │
|
|
│ │ │ 1248px │ 672px │ │ │
|
|
│ │ │ │ │ │ │
|
|
│ │ │ - 날씨 │ - 월간 달력 │ │ │
|
|
│ │ │ - 오늘의 할일 │ - 주간 일정 │ │ │
|
|
│ │ │ - 오늘의 말씀 │ - 공지사항 │ │ │
|
|
│ │ │ │ │ │ │
|
|
│ │ └─────────────────────────────┴──────────────────────────┘ │ │
|
|
│ └────────────────────────────────────────────────────────────────┘ │
|
|
│ │ 1080px
|
|
└────────────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 폰트 크기 권장 (시청 거리 2~3m 기준)
|
|
|
|
| 요소 | 크기 | 용도 |
|
|
|------|------|------|
|
|
| 헤더/시간 | 48-64px | 날짜, 현재 시간 |
|
|
| 제목 | 32-40px | 섹션 제목 |
|
|
| 본문 | 24-28px | 할일, 일정 내용 |
|
|
| 보조 텍스트 | 18-20px | 부가 정보 |
|
|
|
|
---
|
|
|
|
## TV Display Layout (Single Usage Dashboard)
|
|
|
|
모든 정보와 기능을 한 화면에서 볼 수 있는 통합 대시보드 레이아웃입니다.
|
|
|
|
```
|
|
┌────────────────────────────────────────────────────────────────────────┐
|
|
│ 📅 2026.01.24 (금) 15:43:36 🌤️ 서울 12°C 맑음 │
|
|
├──────────────────────┬─────────────────────────┬───────────────────────┤
|
|
│ [📅 월간 달력] │ [🖼️ 가족 사진 앨범] │ [✅ 오늘의 할일] │
|
|
│ │ │ │
|
|
│ 1 2 3 4 5 6 7 │ (랜덤 슬라이드쇼) │ 👨 아빠: 마트, 운동 │
|
|
│ 8 9 10 11 12 13 14 │ (30초 간격 전환) │ 👩 엄마: 회의 │
|
|
│ 15 16 17 18 19 20 21 │ │ 👦 아들: 수학 숙제 │
|
|
│ 22 23 24 25 26 27 28 │ │ 👧 딸: 피아노 가기 │
|
|
│ 29 30 31 │ │ │
|
|
├──────────────────────┤ ├───────────────────────┤
|
|
│ [📋 주간 일정] │ │ [📖 오늘의 말씀] │
|
|
│ │ │ │
|
|
│ 금: 가족 모임 │ │ "The fear of the LORD │
|
|
│ 토: 결혼식 참석 │ │ is the beginning..." │
|
|
│ 일: 교회 예배 │ │ │
|
|
│ │ │ "여호와를 경외하는..." │
|
|
├──────────────────────┤ │ - 잠언 1:7 │
|
|
│ [📢 공지사항] │ │ │
|
|
│ • 다음 주 여행 계획 │ │ │
|
|
└──────────────────────┴─────────────────────────┴───────────────────────┘
|
|
```
|
|
|
|
### 위젯 구성
|
|
1. **Header**: 날짜, 시간, 실시간 날씨 (Top Bar)
|
|
2. **Left Column (Plan)**:
|
|
- 월간 달력 (이번 달 전체 뷰)
|
|
- 주간 주요 일정 (리스트)
|
|
- 공지사항 (텍스트 롤링)
|
|
3. **Center Column (Memory)**:
|
|
- **가족 사진 위젯**: Admin에서 업로드한 사진들을 랜덤하게 표시 (디지털 액자 기능)
|
|
4. **Right Column (Focus)**:
|
|
- 가족별 오늘의 할일 (아바타와 함께 표시)
|
|
- 오늘의 말씀 (한글/영어 병기)
|
|
|
|
---
|
|
|
|
## MongoDB Collections (Updated)
|
|
|
|
### photos
|
|
```javascript
|
|
{
|
|
_id: ObjectId,
|
|
url: "https://.../photo.jpg", // 또는 base64 (저장 용량 고려 필요)
|
|
caption: "2025 여름 휴가",
|
|
active: true,
|
|
createdAt: Date
|
|
}
|
|
```
|
|
|
|
### family_members (기존 동일)
|
|
...
|
|
|
|
---
|
|
|
|
## API Endpoints (Updated)
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET/POST | `/api/photos` | 사진 목록 조회/업로드 |
|
|
| DELETE | `/api/photos/:id` | 사진 삭제 |
|
|
| ... | ... | (기존 API 동일) |
|
|
|
|
|
|
```
|
|
bini-google-tv/
|
|
├── docs/
|
|
│ └── project-plan.md
|
|
├── backend/
|
|
│ ├── server.js
|
|
│ ├── config/
|
|
│ │ ├── db.js
|
|
│ │ └── api.js
|
|
│ ├── models/
|
|
│ │ ├── FamilyMember.js
|
|
│ │ ├── Todo.js
|
|
│ │ ├── Schedule.js
|
|
│ │ ├── Announcement.js
|
|
│ │ └── Setting.js
|
|
│ ├── routes/
|
|
│ │ ├── family.js
|
|
│ │ ├── todos.js
|
|
│ │ ├── schedules.js
|
|
│ │ ├── announcements.js
|
|
│ │ ├── weather.js
|
|
│ │ └── bible.js
|
|
│ ├── .env.example
|
|
│ └── package.json
|
|
└── flutter_app/
|
|
├── lib/
|
|
│ ├── main.dart
|
|
│ ├── config/
|
|
│ ├── models/
|
|
│ ├── services/
|
|
│ ├── screens/
|
|
│ │ ├── tv/
|
|
│ │ ├── mobile/
|
|
│ │ └── admin/
|
|
│ └── widgets/
|
|
└── pubspec.yaml
|
|
```
|
|
|
|
---
|
|
|
|
## MongoDB Collections
|
|
|
|
### family_members
|
|
```javascript
|
|
{
|
|
_id: ObjectId,
|
|
name: "아빠",
|
|
emoji: "👨",
|
|
color: "#3498db",
|
|
order: 1,
|
|
createdAt: Date
|
|
}
|
|
```
|
|
|
|
### todos
|
|
```javascript
|
|
{
|
|
_id: ObjectId,
|
|
familyMemberId: ObjectId,
|
|
title: "마트 장보기",
|
|
completed: false,
|
|
dueDate: Date,
|
|
createdAt: Date
|
|
}
|
|
```
|
|
|
|
### schedules
|
|
```javascript
|
|
{
|
|
_id: ObjectId,
|
|
title: "가족 모임",
|
|
description: "할머니 댁 방문",
|
|
startDate: Date,
|
|
endDate: Date,
|
|
familyMemberId: ObjectId,
|
|
isAllDay: true,
|
|
createdAt: Date
|
|
}
|
|
```
|
|
|
|
### announcements
|
|
```javascript
|
|
{
|
|
_id: ObjectId,
|
|
title: "이번 주 외식",
|
|
content: "금요일 저녁 외식 예정",
|
|
priority: 1,
|
|
active: true,
|
|
createdAt: Date
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## API Endpoints
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET/POST | `/api/family` | 가족 구성원 조회/추가 |
|
|
| GET/PUT/DELETE | `/api/family/:id` | 특정 구성원 조회/수정/삭제 |
|
|
| GET/POST | `/api/todos` | 할일 조회/추가 |
|
|
| GET/PUT/DELETE | `/api/todos/:id` | 특정 할일 조회/수정/삭제 |
|
|
| GET | `/api/todos/today` | 오늘의 할일 조회 |
|
|
| GET/POST | `/api/schedules` | 일정 조회/추가 |
|
|
| GET | `/api/schedules/week` | 주간 일정 조회 |
|
|
| GET | `/api/schedules/month` | 월간 일정 조회 |
|
|
| GET/POST | `/api/announcements` | 공지사항 조회/추가 |
|
|
| GET | `/api/weather` | 현재 날씨 조회 |
|
|
| GET | `/api/bible/today` | 오늘의 말씀 조회 |
|
|
|
|
---
|
|
|
|
## Development Phases
|
|
|
|
| Phase | 내용 | 예상 시간 |
|
|
|-------|------|----------|
|
|
| 1 | Backend + MongoDB 설정 | 2-3시간 |
|
|
| 2 | REST API 구현 | 3-4시간 |
|
|
| 3 | Flutter 공통 구조 + 모델 | 2시간 |
|
|
| 4 | TV Display 화면 | 3-4시간 |
|
|
| 5 | Mobile 입력 화면 | 4-5시간 |
|
|
| 6 | Admin (가족구성원/설정) | 2시간 |
|
|
| 7 | 통합 + TV APK 빌드 | 2-3시간 |
|
|
|
|
**총 예상 시간: 18-23시간**
|
|
|
|
---
|
|
|
|
## TV App Installation
|
|
|
|
1. **Flutter 빌드**: `flutter build apk --release`
|
|
2. **TV에 설치**:
|
|
- USB로 APK 전송 후 파일 관리자에서 설치
|
|
- 또는 ADB 사용: `adb install app-release.apk`
|
|
3. **TV 홈에서 앱 실행**
|