Skip to content

nbcamp-letswork/clock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“˜ clock

iOS κΈ°λ³Έ μ•± μ‹œκ³„μ˜ μ•ŒλžŒ, μŠ€ν†±μ›ŒμΉ˜, 타이머 탭을 ν΄λ‘ ν•œ μ•±

πŸ—‚ 기술 μŠ€νƒ 및 ν‚€μ›Œλ“œ

πŸ“± iOS

  • Swift
  • UIKit
  • RxSwift
  • SnapKit

πŸ’‘ ν‚€μ›Œλ“œ

  • CoreData
  • MVVM (Input-Output)
  • Clean Architecture
  • DIContainer

βš™οΈ ν˜‘μ—… & 기타

  • Git / GitHub
  • Figma
  • Notion
  • Slack

🧩 μΆ”κ°€ κΈ°λŠ₯

  • βœ… μ•ŒλžŒ κ·Έλ£Ήν™”
  • βœ… μ•ŒλžŒ μœ„μ ―

πŸ§ͺ ν”„λ‘œμ νŠΈ ꡬ쑰

πŸ“¦clock
β”œβ”€β”€ App                          # μ•± μ§„μž…μ  (AppDelegate, SceneDelegate λ“±)
β”‚
β”œβ”€β”€ Data                         # 데이터 μ†ŒμŠ€μ™€μ˜ 톡신 λ‹΄λ‹Ή (CoreData λ“±)
β”‚   β”œβ”€β”€ Interface                # CoreData Storage ν”„λ‘œν† μ½œ μ •μ˜
β”‚   β”‚   └── Persistence
β”‚   β”œβ”€β”€ Persistence              # CoreData κ΄€λ ¨ λͺ¨λΈ 및 μ‹€μ œ κ΅¬ν˜„
β”‚   β”‚   β”œβ”€β”€ Model
β”‚   β”‚   └── Persistence          # CoreData Storage κ΅¬ν˜„μ²΄
β”‚   β”œβ”€β”€ Repository               # Repository κ΅¬ν˜„μ²΄
β”‚   └── Error                    # Data κ³„μΈ΅μ—μ„œ μ‚¬μš©ν•˜λŠ” μ—λŸ¬ μ •μ˜
β”‚
β”œβ”€β”€ Domain                       # μ•±μ˜ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ‹΄λ‹Ή
β”‚   β”œβ”€β”€ Interface
β”‚   β”‚   β”œβ”€β”€ Repository           # Repository ν”„λ‘œν† μ½œ μ •μ˜
β”‚   β”‚   └── UseCase              # UseCase μΈν„°νŽ˜μ΄μŠ€ μ •μ˜
β”‚   β”œβ”€β”€ UseCase                  # ꡬ체적인 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ΅¬ν˜„
β”‚   β”œβ”€β”€ Model                    # 도메인 λͺ¨λΈ μ •μ˜
β”‚   └── Error                    # 도메인 κ³„μΈ΅μ—μ„œ μ‚¬μš©ν•˜λŠ” μ—λŸ¬ μ •μ˜
β”‚
β”œβ”€β”€ Presentation                 # UI와 μ‚¬μš©μž μƒν˜Έμž‘μš©μ„ λ‹΄λ‹Ή (View, ViewModel λ“±)
β”‚   β”œβ”€β”€ Model                    # ViewModelμ—μ„œ μ‚¬μš©ν•˜λŠ” UI μ „μš© λͺ¨λΈ
β”‚   β”‚   └── TimerDisplay.swift
β”‚   β”œβ”€β”€ Scene                    # ν™”λ©΄ λ‹¨μœ„λ‘œ λΆ„λ¦¬λœ κΈ°λŠ₯λ“€
β”‚   β”‚   β”œβ”€β”€ Stopwatch            # μŠ€ν†±μ›ŒμΉ˜ ν™”λ©΄
β”‚   β”‚       β”œβ”€β”€ ViewController
β”‚   β”‚       β”‚   └── Subview      # μ„œλΈŒ μ»΄ν¬λ„ŒνŠΈ λ·°
β”‚   β”‚       └── ViewModel
β”‚   β”œβ”€β”€ Component                # μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ Factory                  # UI μ»΄ν¬λ„ŒνŠΈ κ΄€λ ¨ λ©”μ„œλ“œ νŒ©ν† λ¦¬
β”‚   └── Extension                # UIKit, Foundation λ“±μ˜ ν™•μž₯ λ©”μ„œλ“œ
β”‚
β”œβ”€β”€ Resource                     # 에셋, 폰트, 둜컬라이즈 λ¦¬μ†ŒμŠ€ λ“±

CoreData ꡬ쑰

image

πŸ”₯ 기술적 도전 및 문제 ν•΄κ²°

1. 타이머 μ—…λ°μ΄νŠΈ μ‹œ UI λ°˜μ˜λ˜μ§€ μ•Šμ€ 문제

  • Actorλ₯Ό μ‚¬μš©ν•œ Data Race ν•΄κ²°

2. μŠ€ν†±μ›ŒμΉ˜ λ™μž‘ 쀑 슀크둀 λ²„λ²…μž„ 문제

방법 μ„€λͺ… ν™”λ©΄
1️⃣ UITableViewDataSource 전체 reload 방식 슀크둀이 μ•ˆ 됨 (Bad)
2️⃣ UITableViewDiffableDataSource μ—¬μ „νžˆ 슀크둀이 λΆˆμ•ˆμ •ν•¨ (Still Bad)
3️⃣ μ΅œμƒλ‹¨ 랩만 update ν•„μš”ν•œ μ…€λ§Œ μ—…λ°μ΄νŠΈ (Good)

3. CoreData 비동기 κ΅¬ν˜„

  • viewContextκ°€ μ•„λ‹Œ backgroundContext μ‚¬μš©
  • async/await + withCheckedContinuation으둜 Swift Concurrency κ΅¬ν˜„
image

4. 클린 μ•„ν‚€ν…μ²˜ 원칙에 따라 관심사 뢄리

  • CoreDataEntity와 DomainEntity κ°„ λ§€ν•‘ μ±…μž„μ„ Repositoryκ°€ λ‹΄λ‹Ή
  • StorageλŠ” DomainEntity νƒ€μž… λͺ¨λ₯΄κ²Œ ν•˜κΈ°
  • RepositoryλŠ” CoreData λ‘œμ§μ— 직접 μ ‘κ·Όν•˜μ§€ μ•ŠκΈ°
Before (κΈ°μ‘΄ κ΅¬ν˜„) After (κ°œμ„ λœ κ΅¬ν˜„)
κΈ°μ‘΄ μ½”λ“œ κ°œμ„  μ½”λ“œ

5. Widget κ΅¬ν˜„

  • AppGroup μ‚¬μš©
  • Sandbox 외뢀에 데이터 μ €μž₯
image

πŸ˜‚ μ•„μ‰¬μš΄ 점

  • μŠ€ν†±μ›ŒμΉ˜ 타이머 μ‹œμž‘ 쀑 μ•± μ’…λ£Œ μ‹œμ—λ„ 타이머가 흐λ₯΄λ„둝 μœ μ§€μ‹œν‚€κΈ°
  • μŠ€ν†±μ›ŒμΉ˜ 랩 UITableView Invert ν•˜κΈ°
  • CoreData의 UndoManagerλ₯Ό ν™œμš©ν•΄ Undo κΈ°λŠ₯ κ΅¬ν˜„ν•˜κΈ°
  • LiveActivityλ₯Ό μ΄μš©ν•΄ LockScreenμ—μ„œ μŠ€ν†±μ›ŒμΉ˜ μ œμ–΄ν•˜κΈ°

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages