Skip to content

raker1005/love

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

23 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Love Alarm ๐Ÿ’• - ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์›น์•ฑ

์—ฐ์ธ๊ณผ ์•Œ๋žŒ์„ ๊ณต์œ ํ•˜๋Š” PWA (Progressive Web App)

๐Ÿš€ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

Love Alarm์€ ์—ฐ์ธ ๊ฐ„ ์•Œ๋žŒ์Œ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.
์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์›น ๊ธฐ์ˆ (HTML/CSS/JS)๋กœ ์žฌ๊ตฌํ˜„ํ•˜์˜€์œผ๋ฉฐ, PWA๋กœ ๋™์ž‘ํ•˜์—ฌ ํ™ˆ ํ™”๋ฉด์— ์„ค์น˜ ๋ฐ ์•ฑ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ

๐Ÿ”” ์•Œ๋žŒ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ

  • ์•Œ๋žŒ ์ถ”๊ฐ€ (์‹œ๊ฐ„ ์„ ํƒ, ๋ผ๋ฒจ, ๋ฐ˜๋ณต ์š”์ผ, ์Šค๋ˆ„์ฆˆ, ์ง„๋™)
  • ์•Œ๋žŒ ๋ชฉ๋ก ์กฐํšŒ (ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ์„น์…˜ ๋ถ„๋ฆฌ)
  • ์•Œ๋žŒ ํŽธ์ง‘ (์นด๋“œ ํƒญ)
  • ์•Œ๋žŒ ์‚ญ์ œ (์Šค์™€์ดํ”„ or ํŽธ์ง‘ ํ™”๋ฉด ์‚ญ์ œ ๋ฒ„ํŠผ)
  • ์•Œ๋žŒ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ํ† ๊ธ€
  • ๋ฐ˜๋ณต ์š”์ผ ์„ค์ • (๋งค์ผ/์ฃผ์ค‘/์ฃผ๋ง ์ž๋™ ๋ผ๋ฒจ)
  • ์Šค๋ˆ„์ฆˆ ๊ธฐ๋Šฅ (5๋ถ„ ํ›„ ์žฌ์šธ๋ฆผ)
  • ์•Œ๋žŒ ์šธ๋ฆผ ์ „์ฒดํ™”๋ฉด (ํŽ„์Šค ์• ๋‹ˆ๋ฉ”์ด์…˜)
  • Web Audio API ์•Œ๋žŒ์Œ ์žฌ์ƒ (๋กœ์ปฌ beep)
  • ์›๊ฒฉ URL ์Œ์› ์ŠคํŠธ๋ฆฌ๋ฐ ์žฌ์ƒ
  • ์Šค์™€์ดํ”„ ์ œ์Šค์ฒ˜ (์œ„๋กœ: ๋„๊ธฐ, ์•„๋ž˜๋กœ: ์Šค๋ˆ„์ฆˆ)

๐Ÿ”— ์†Œ์…œ ๊ธฐ๋Šฅ (Firebase ํ•„์š”)

  • ์ด๋ฉ”์ผ/๋น„๋ฐ€๋ฒˆํ˜ธ ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ
  • ๊ณ ์œ  6์ž๋ฆฌ ์—ฐ๊ฒฐ ์ฝ”๋“œ ๋ฐœ๊ธ‰
  • ์—ฐ๊ฒฐ ์ฝ”๋“œ๋กœ ํŒŒํŠธ๋„ˆ ์—ฐ๊ฒฐ/ํ•ด์ œ
  • ์—ฐ๊ฒฐ ์ƒํƒœ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ

๐Ÿ’Œ ํŒŒํŠธ๋„ˆ ์•Œ๋žŒ์Œ ๊ธฐ๋Šฅ (Firebase ํ•„์š”)

  • ํŒŒํŠธ๋„ˆ ์•Œ๋žŒ ๋ชฉ๋ก ์‹ค์‹œ๊ฐ„ ์กฐํšŒ
  • ๋งˆ์ดํฌ๋กœ ์ง์ ‘ ๋…น์Œํ•˜์—ฌ ์—…๋กœ๋“œ
  • ์˜ค๋””์˜ค ํŒŒ์ผ ์„ ํƒํ•˜์—ฌ ์—…๋กœ๋“œ
  • Firebase Storage ์—…๋กœ๋“œ (์ง„ํ–‰๋ฅ  ํ‘œ์‹œ)
  • ํŒŒํŠธ๋„ˆ ์•Œ๋žŒ์Œ ์‹ค์‹œ๊ฐ„ ๊ฐ์ง€ ๋ฐ ์ž๋™ ์ ์šฉ
  • "โ™ฅ ํŒŒํŠธ๋„ˆ ์•Œ๋žŒ์Œ" ๋ฐฐ์ง€ ํ‘œ์‹œ

๐Ÿ“ฑ PWA ๊ธฐ๋Šฅ

  • ํ™ˆ ํ™”๋ฉด ์„ค์น˜ ๊ฐ€๋Šฅ (manifest.json)
  • Service Worker (์˜คํ”„๋ผ์ธ ์บ์‹ฑ)
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์•Œ๋ฆผ (Web Notification API)
  • ๋‹คํฌ/๋ผ์ดํŠธ ๋ชจ๋“œ ์ž๋™ ์ „ํ™˜

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

๊ตฌ๋ถ„ ๊ธฐ์ˆ 
UI HTML5 + CSS3 (iOS ์Šคํƒ€์ผ)
JS Vanilla JavaScript (ES2022)
๋ฐฑ์—”๋“œ Firebase v10 (Auth, Firestore, Storage)
์•Œ๋žŒ setTimeout + Web Audio API
์ €์žฅ์†Œ LocalStorage (์•Œ๋žŒ ๋ฐ์ดํ„ฐ)
PWA Service Worker + Web App Manifest
์•„์ด์ฝ˜ Font Awesome 6
ํฐํŠธ Google Fonts (Inter)

โš™๏ธ Firebase ์„ค์ • ๋ฐฉ๋ฒ•

1๋‹จ๊ณ„: Firebase ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

  1. Firebase Console ์ ‘์†
  2. ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
  3. ์•„๋ž˜ ์„œ๋น„์Šค ํ™œ์„ฑํ™”:
    • Authentication โ†’ ์ด๋ฉ”์ผ/๋น„๋ฐ€๋ฒˆํ˜ธ ํ™œ์„ฑํ™”
    • Firestore Database โ†’ ์ƒ์„ฑ (ํ…Œ์ŠคํŠธ ๋ชจ๋“œ๋กœ ์‹œ์ž‘)
    • Storage โ†’ ์ƒ์„ฑ

2๋‹จ๊ณ„: ์›น ์•ฑ ๋“ฑ๋ก

  1. ํ”„๋กœ์ ํŠธ ์„ค์ • โ†’ ์•ฑ ์ถ”๊ฐ€ โ†’ ์›น (</>)
  2. Firebase ์„ค์ • ๊ฐ’ ๋ณต์‚ฌ

3๋‹จ๊ณ„: index.html ์„ค์ • ์ˆ˜์ •

index.html ํ•˜๋‹จ์˜ Firebase ์„ค์ • ๋ถ€๋ถ„์„ ์ˆ˜์ •:

const firebaseConfig = {
  apiKey: "์‹ค์ œ_API_KEY",
  authDomain: "ํ”„๋กœ์ ํŠธID.firebaseapp.com",
  projectId: "์‹ค์ œ_ํ”„๋กœ์ ํŠธ_ID",
  storageBucket: "ํ”„๋กœ์ ํŠธID.appspot.com",
  messagingSenderId: "์‹ค์ œ_SENDER_ID",
  appId: "์‹ค์ œ_APP_ID"
};

4๋‹จ๊ณ„: Firestore ๋ณด์•ˆ ๊ทœ์น™ ์ ์šฉ

Firebase Console โ†’ Firestore โ†’ ๊ทœ์น™ ํƒญ์— ์•„๋ž˜ ๊ทœ์น™ ๋ถ™์—ฌ๋„ฃ๊ธฐ:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read: if request.auth != null;
      allow write: if request.auth.uid == userId;
      
      match /shared_alarms/{alarmId} {
        allow read: if request.auth != null;
        allow write: if request.auth.uid == userId;
      }
      
      match /alarm_sounds/{alarmId} {
        allow read: if request.auth.uid == userId;
        allow write: if request.auth != null
          && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.connectedPartnerUid == userId;
      }
    }
  }
}

๐Ÿ“ฑ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์•ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

๋ฐฉ๋ฒ• 1: PWA ํ™ˆ ํ™”๋ฉด ์ถ”๊ฐ€ (๊ถŒ์žฅ)

  1. Chrome ๋ธŒ๋ผ์šฐ์ €๋กœ ์•ฑ ์ ‘์†
  2. ์ฃผ์†Œ์ฐฝ ์˜ค๋ฅธ์ชฝ ๋ฉ”๋‰ด โ†’ "ํ™ˆ ํ™”๋ฉด์— ์ถ”๊ฐ€"
  3. ์ „์ฒดํ™”๋ฉด ์•ฑ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ

๋ฐฉ๋ฒ• 2: WebView๋กœ APK ํŒจํ‚ค์ง•

Capacitor.js ๋˜๋Š” Cordova๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ APK ์ƒ์„ฑ ๊ฐ€๋Šฅ:

# Capacitor ์‚ฌ์šฉ ์˜ˆ์‹œ
npm install @capacitor/core @capacitor/cli @capacitor/android
npx cap init "Love Alarm" "com.example.lovealarm"
npx cap add android
npx cap copy
npx cap open android  # Android Studio์—์„œ ๋นŒ๋“œ

๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

/
โ”œโ”€โ”€ index.html          # ๋ฉ”์ธ ์•ฑ (๋ชจ๋“  ํ™”๋ฉด ํฌํ•จ)
โ”œโ”€โ”€ manifest.json       # PWA ๋งค๋‹ˆํŽ˜์ŠคํŠธ
โ”œโ”€โ”€ sw.js              # Service Worker
โ”œโ”€โ”€ css/
โ”‚   โ””โ”€โ”€ style.css      # ์ „์ฒด ์Šคํƒ€์ผ (iOS ์Šคํƒ€์ผ)
โ”œโ”€โ”€ js/
โ”‚   โ””โ”€โ”€ app.js         # ์•ฑ ๋กœ์ง (์•Œ๋žŒ, Firebase, UI)
โ””โ”€โ”€ icons/
    โ””โ”€โ”€ icon.svg       # ์•ฑ ์•„์ด์ฝ˜

๐Ÿ—„๏ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

๋กœ์ปฌ ์ €์žฅ์†Œ (LocalStorage)

{
  "love_alarms": [
    {
      "id": "์•Œ๋žŒID",
      "hour": 7,
      "minute": 0,
      "label": "์ผ์–ด๋‚˜!",
      "isEnabled": true,
      "repeatDays": [1, 2, 3, 4, 5],
      "vibrate": true,
      "snoozeEnabled": true,
      "partnerSoundUri": "https://firebase.../sound.webm",
      "soundUri": "default"
    }
  ]
}

Firestore ๊ตฌ์กฐ

users/{uid}
  โ”œโ”€โ”€ uid, email, nickname, connectionCode, connectedPartnerUid
  โ”œโ”€โ”€ shared_alarms/{alarmId}
  โ”‚     โ””โ”€โ”€ alarmId, hour, minute, label, isEnabled
  โ””โ”€โ”€ alarm_sounds/{alarmId}
        โ””โ”€โ”€ soundUrl, uploadedAt, uploadedBy

โš ๏ธ Firebase ๋ฏธ์„ค์ • ์‹œ (๋ฐ๋ชจ ๋ชจ๋“œ)

  • ์•Œ๋žŒ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ Firebase ์—†์ด๋„ ์™„์ „ํžˆ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค
  • ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ์‹œ "๋ฐ๋ชจ ๋ชจ๋“œ"๋กœ ์ž‘๋™ (๋กœ์ปฌ ์ €์žฅ๋งŒ)
  • ํŒŒํŠธ๋„ˆ ์—ฐ๊ฒฐ ๋ฐ ์•Œ๋žŒ์Œ ๊ณต์œ  ๊ธฐ๋Šฅ์€ Firebase ์„ค์ • ํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๐Ÿ”ฎ ํ–ฅํ›„ ๊ฐœ์„  ๊ณ„ํš (v2.0)

  • FCM ํ‘ธ์‹œ ์•Œ๋ฆผ (๋ฐฑ๊ทธ๋ผ์šด๋“œ ์•Œ๋žŒ์Œ ๋ณ€๊ฒฝ ์•Œ๋ฆผ)
  • ์•Œ๋žŒ์Œ ๋ฏธ๋ฆฌ๋“ฃ๊ธฐ ๊ธฐ๋Šฅ
  • AI ์Œ์„ฑ ์•Œ๋žŒ์Œ ์ƒ์„ฑ (TTS)
  • ํ™ˆ ์œ„์ ฏ (๋‹ค์Œ ์•Œ๋žŒ ํ‘œ์‹œ)
  • ์ˆ˜๋ฉด ํ†ต๊ณ„ ๋ถ„์„

Made with โ™ฅ Love Alarm

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors