Skip to content

kec08/IceStudy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

30 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🧊 얼곡 (IceStudy) - μ–ΌμŒκ³΅λΆ€λ²• 집쀑 타이머

얼곡

"μ–ΌμŒμ΄ 녹을 λ•ŒκΉŒμ§€, 집쀑."

App Store


μ†Œκ°œ

얼곡은 SNSμ—μ„œ μœ ν–‰ν•˜λŠ” μ–ΌμŒκ³΅λΆ€λ²•μ„ μ•±μœΌλ‘œ κ΅¬ν˜„ν•œ ν•™μŠ΅ 집쀑 νƒ€μ΄λ¨Έμž…λ‹ˆλ‹€.

남은 μ‹œκ°„μ„ 보여주지 μ•Šκ³ , μ–ΌμŒμ΄ λ…ΉλŠ” μ• λ‹ˆλ©”μ΄μ…˜λ§ŒμœΌλ‘œ 집쀑을 μœ λ„ν•©λ‹ˆλ‹€. μ»΅ μ‚¬μ΄μ¦ˆλ₯Ό κ³ λ₯΄λ©΄ 랜덀 μ‹œκ°„μ΄ μ„€μ •λ˜κ³ , μ–ΌμŒμ΄ λ‹€ λ…ΉμœΌλ©΄ 곡뢀 끝!

μ£Όμš” κΈ°λŠ₯

1. 랜덀 타이머

남은 μ‹œκ°„μ€ λΉ„λ°€. μ–ΌμŒμ΄ λ‹€ 녹을 λ•ŒκΉŒμ§€ μ§‘μ€‘ν•˜μ„Έμš”.

  • μ»΅ μ‚¬μ΄μ¦ˆ(Tall/Grande/Venti)에 따라 랜덀 μ‹œκ°„ μ„€μ •
  • 남은 μ‹œκ°„/νΌμ„ΌνŠΈ 일절 λΉ„κ³΅κ°œ
  • μ–ΌμŒμ΄ λ…ΉλŠ” κ²ƒλ§Œ 보고 집쀑

2. μ–ΌμŒ λ…ΉλŠ” μ• λ‹ˆλ©”μ΄μ…˜

μ»΅λ§ˆλ‹€ λ…ΉλŠ” 속도가 λ‹¬λΌμš”. GrandeλŠ” 천천히, VentiλŠ” 더~ 천천히.

  • 43개 μ–ΌμŒ 블둝이 8λ ˆμ΄μ–΄λ‘œ μžμ—°μŠ€λŸ½κ²Œ λ…ΉμŒ
  • μ»΅ μ‚¬μ΄μ¦ˆλ³„ λΉ„μ„ ν˜• 이징 컀브 적용
  • μ•„λž˜λΆ€ν„° 물이 차였λ₯΄λŠ” μ‹œκ°μ  ν”Όλ“œλ°±

3. μ£Όκ°„ λŒ€μ‹œλ³΄λ“œ

이번 주에 녹인 물을 양동이에 λ‹΄μ•„λ³΄μ„Έμš”.

  • 유리 양동이에 μ±„μ›Œμ§€λŠ” λ¬Όμ–‘μœΌλ‘œ κ³΅λΆ€λŸ‰ μ‹œκ°ν™”
  • μ£Όκ°„ μŠ¬λΌμ΄λ“œ μ „ν™˜μœΌλ‘œ κ³Όκ±° 기둝 확인
  • λͺ©ν‘œλŸ‰ 초과 μ‹œ νŠΉλ³„ν•œ λ³€ν™”

4. μΊ˜λ¦°λ”

ν•œ λ‹¬κ°„μ˜ 곡뢀 기둝을 ν•œλˆˆμ—.

  • 월별 일일 κ³΅λΆ€μ‹œκ°„ + λ¬Όμ–‘ 기둝
  • λ†λ„λ‘œ κ³΅λΆ€λŸ‰ μ‹œκ°ν™”

5. ν”„λ‘œν•„ 톡계

녹인 μ–ΌμŒ 수, 총 λ¬Όμ–‘, 총 κ³΅λΆ€μ‹œκ°„μ„ ν•œλˆˆμ—.

  • 전체 톡계 μš”μ•½
  • μ£Όκ°„ λ°” 차트 (μŠ€ν¬λ¦°νƒ€μž„ μŠ€νƒ€μΌ)

6. λΆ€κ°€ κΈ°λŠ₯

집쀑을 λ„μ™€μ£ΌλŠ” μž‘μ€ κΈ°λŠ₯λ“€.

  • λ°±μƒ‰μ†ŒμŒ / λΉ—μ†Œλ¦¬ / μˆ²μ†Œλ¦¬ (AVAudioEngine)
  • 집쀑λͺ¨λ“œ (ν™”λ©΄ 꺼짐 λ°©μ§€)
  • 타이머 κ²°κ³Ό 곡유 (μΈμŠ€νƒ€ μΉ΄λ“œ)
  • μœ„μ ― 지원 (이번 μ£Ό λ¬Όμ–‘ 확인)

ν”„λ‘œμ νŠΈ ꡬ쑰

iOS

IceStudy/
β”œβ”€β”€ App/
β”‚   └── IceStudyApp.swift               # @main μ—”νŠΈλ¦¬
β”‚
β”œβ”€β”€ Models/
β”‚   β”œβ”€β”€ CupSize.swift                   # μ»΅ μ‚¬μ΄μ¦ˆ enum (Tall/Grande/Venti)
β”‚   └── TemperatureZone.swift           # μ˜¨λ„ 기반 λ¬Όμ–‘ 계산
β”‚
β”œβ”€β”€ ViewModels/
β”‚   β”œβ”€β”€ AuthViewModel.swift             # 인증 μƒνƒœ 관리
β”‚   └── TimerViewModel.swift            # 타이머 둜직 + λ°±κ·ΈλΌμš΄λ“œ 보정
β”‚
β”œβ”€β”€ Views/
β”‚   β”œβ”€β”€ Splash/
β”‚   β”‚   └── SplashView.swift            # μŠ€ν”Œλž˜μ‹œ (2초)
β”‚   β”œβ”€β”€ Onboarding/
β”‚   β”‚   └── OnboardingView.swift        # 졜초 1회 μ˜¨λ³΄λ”©
β”‚   β”œβ”€β”€ Auth/
β”‚   β”‚   β”œβ”€β”€ LoginView.swift             # Apple 둜그인 + 이메일
β”‚   β”‚   β”œβ”€β”€ SignUpView.swift            # νšŒμ›κ°€μž…
β”‚   β”‚   └── NicknameSetupView.swift     # λ‹‰λ„€μž„ μ„€μ •
β”‚   β”œβ”€β”€ Home/
β”‚   β”‚   β”œβ”€β”€ HomeView.swift              # μ£Όκ°„ λŒ€μ‹œλ³΄λ“œ + 양동이
β”‚   β”‚   └── CalendarView.swift          # 월별 μΊ˜λ¦°λ”
β”‚   β”œβ”€β”€ Timer/
β”‚   β”‚   β”œβ”€β”€ IceTimerFlowView.swift      # μƒνƒœ 기반 ν™”λ©΄ μ „ν™˜
β”‚   β”‚   β”œβ”€β”€ CupSelectionView.swift      # μ»΅ 선택 (3μΉ΄λ“œ)
β”‚   β”‚   β”œβ”€β”€ TimerRunningView.swift      # 타이머 μ‹€ν–‰ ν™”λ©΄
β”‚   β”‚   β”œβ”€β”€ TimerResultView.swift       # μ™„λ£Œ/포기 κ²°κ³Ό
β”‚   β”‚   └── IceMeltingView.swift        # μ–ΌμŒ λ…ΉλŠ” μ• λ‹ˆλ©”μ΄μ…˜
β”‚   β”œβ”€β”€ Profile/
β”‚   β”‚   β”œβ”€β”€ ProfileView.swift           # ν”„λ‘œν•„ 톡계
β”‚   β”‚   β”œβ”€β”€ WeeklyChartView.swift       # μ£Όκ°„ λ°” 차트
β”‚   β”‚   └── SettingsView.swift          # μ„€μ • (λ‹‰λ„€μž„/λΉ„λ°€λ²ˆν˜Έ/���퇴)
β”‚   └── Components/
β”‚       β”œβ”€β”€ MainTabView.swift           # 3νƒ­ (양동이/μ–ΌμŒ/마이)
β”‚       β”œβ”€β”€ LogoHeaderView.swift        # 둜고 헀더
β”‚       β”œβ”€β”€ PrimaryButton.swift         # 곡톡 λ²„νŠΌ
β”‚       └── GlassCupShape.swift         # 유리컡 μ»€μŠ€ν…€ Shape
β”‚
β”œβ”€β”€ Network/
β”‚   β”œβ”€β”€ TokenStorage.swift              # Keychain 기반 JWT μ €μž₯
β”‚   β”œβ”€β”€ APIError.swift                  # μ—λŸ¬ νƒ€μž…
β”‚   β”œβ”€β”€ DTO/                            # AuthDTO, SessionDTO, StatsDTO
β”‚   β”œβ”€β”€ API/                            # Moya TargetType (Auth/Session/Stats/User)
β”‚   └── Service/                        # API μ„œλΉ„μŠ€ λ ˆμ΄μ–΄
β”‚
β”œβ”€β”€ Services/
β”‚   β”œβ”€β”€ LocationService.swift           # μœ„μΉ˜ μš”μ²­ (CLLocationManager)
β”‚   β”œβ”€β”€ WeatherService.swift            # μ˜¨λ„ 쑰회 (Open-Meteo)
β”‚   └── WhiteNoiseService.swift         # λ°±μƒ‰μ†ŒμŒ/λΉ—μ†Œλ¦¬/μˆ²μ†Œλ¦¬
β”‚
└── Utils/
    β”œβ”€β”€ Constants.swift                 # AppColor, AppFont
    β”œβ”€β”€ NotificationManager.swift       # ν‘Έμ‹œ μ•Œλ¦Ό 관리
    └── WidgetData.swift                # μœ„μ ― 데이터 곡유

IceStudyWidget/                          # μœ„μ ― Extension
β”œβ”€β”€ IceStudyWidget.swift                # μœ„μ ― UI + Timeline
└── IceStudyWidgetBundle.swift          # Widget Bundle

Backend

icestudy-api/
└── src/main/java/com/icestudy/
    β”œβ”€β”€ config/
    β”‚   β”œβ”€β”€ SecurityConfig.java          # Spring Security μ„€μ •
    β”‚   β”œβ”€β”€ JwtProvider.java             # JWT 생성/검증
    β”‚   β”œβ”€β”€ JwtAuthenticationFilter.java # 인증 ν•„ν„°
    β”‚   β”œβ”€β”€ SwaggerConfig.java           # API λ¬Έμ„œ
    β”‚   └── ScheduleConfig.java          # μŠ€μΌ€μ€„λ§
    β”‚
    β”œβ”€β”€ domain/
    β”‚   β”œβ”€β”€ auth/                        # 인증 (이메일 + Apple)
    β”‚   β”‚   β”œβ”€β”€ AuthController.java
    β”‚   β”‚   β”œβ”€β”€ AuthService.java
    β”‚   β”‚   β”œβ”€β”€ AppleTokenVerifier.java
    β”‚   β”‚   └── dto/
    β”‚   β”œβ”€β”€ user/                        # μœ μ € 관리
    β”‚   β”‚   β”œβ”€β”€ UserController.java
    β”‚   β”‚   β”œβ”€β”€ UserService.java
    β”‚   β”‚   └── dto/
    β”‚   β”œβ”€β”€ session/                     # 곡뢀 μ„Έμ…˜
    β”‚   β”‚   β”œβ”€β”€ SessionController.java
    β”‚   β”‚   β”œβ”€β”€ SessionService.java
    β”‚   β”‚   β”œβ”€β”€ WaterCalculator.java     # λ¬Όμ–‘ 계산 둜직
    β”‚   β”‚   └── dto/
    β”‚   └── stats/                       # 톡계
    β”‚       β”œβ”€β”€ StatsController.java
    β”‚       β”œβ”€β”€ StatsService.java
    β”‚       └── dto/
    β”‚
    └── global/
        β”œβ”€β”€ common/ApiResponse.java      # 곡톡 응닡 래퍼
        └── exception/                   # μ˜ˆμ™Έ 처리

기술 μŠ€νƒ

iOS

ν•­λͺ© 기술
UI SwiftUI
μ•„ν‚€ν…μ²˜ MVVM
μ΅œμ†Œ 버전 iOS 17+
λ„€νŠΈμ›Œν¬ Moya + async/await
인증 Sign in with Apple + JWT
μ €μž₯μ†Œ Keychain (토큰) + UserDefaults (μ„€μ •)
μœ„μ ― WidgetKit + App Group
νŒ¨ν‚€μ§€ λ§€λ‹ˆμ € SPM

Backend

ν•­λͺ© 기술
ν”„λ ˆμž„μ›Œν¬ Spring Boot 3.5.0
μ–Έμ–΄ Java 17
DB MySQL 8.x
ORM Spring Data JPA
인증 JWT (Access + Refresh Token)
λ¬Έμ„œ Swagger (springdoc-openapi)
배포 Railway (Docker)

API Endpoints

Method Path μ„€λͺ…
POST /api/auth/signup νšŒμ›κ°€μž…
POST /api/auth/login 이메일 둜그인
POST /api/auth/apple Apple 둜그인
POST /api/auth/refresh 토큰 κ°±μ‹ 
POST /api/sessions μ„Έμ…˜ 생성
PATCH /api/sessions/{id}/complete μ„Έμ…˜ μ™„λ£Œ
PATCH /api/sessions/{id}/abort μ„Έμ…˜ 포기
GET /api/stats/weekly μ£Όκ°„ 톡계
GET /api/stats/calendar μ›”κ°„ μΊ˜λ¦°λ”
GET /api/stats/profile ν”„λ‘œν•„ 톡계
GET /api/users/me λ‚΄ 정보 쑰회
PATCH /api/users/me λ‚΄ 정보 μˆ˜μ •

μ»΅ μ‚¬μ΄μ¦ˆ

μ‚¬μ΄μ¦ˆ μ‹œκ°„ λ²”μœ„ μ΅œλŒ€ λ¬Όμ–‘ μ„€λͺ…
Tall 30λΆ„ ~ 1μ‹œκ°„ 30λΆ„ 355ml κ°€λ²Όμš΄ 곡뢀
Grande 1μ‹œκ°„ 30λΆ„ ~ 3μ‹œκ°„ 473ml 집쀑 곡뢀
Venti 2μ‹œκ°„ ~ 4μ‹œκ°„ 591ml κΉŠμ€ 곡뢀

μ•± λ‹€μš΄λ‘œλ“œ

App Store

개발 정보

  • 1인 개발 ν”„λ‘œμ νŠΈ
  • iOS: SwiftUI + Moya (SPM)
  • Backend: Spring Boot + MySQL (Railway 배포)

λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” 개인 ν”„λ‘œμ νŠΈλ‘œ, 무단 볡제 및 배포λ₯Ό κΈˆν•©λ‹ˆλ‹€.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages