iOS10-JipJung icon indicating copy to clipboard operation
iOS10-JipJung copied to clipboard

🎧 집쀑에 도움이 λ˜λŠ” μ‚¬μš΄λ“œ 컨텐츠λ₯Ό μ œκ³΅ν•˜λŠ” μ„œλΉ„μŠ€

πŸš€Β ν”„λ‘œμ νŠΈ μ†Œκ°œ

🎧 JipJung은 집쀑에 도움이 λ˜λŠ” μ‚¬μš΄λ“œ μ½˜ν…μΈ λ₯Ό μ œκ³΅ν•˜λŠ” μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.

크게 2κ°€μ§€ μ½˜ν…μΈ  λͺ¨λ“œκ°€ 있으며 μ‚¬μš΄λ“œμ™€ ν•¨κ»˜ μ‹œκ°μ μΈ μ• λ‹ˆλ©”μ΄μ…˜μ„ 즐길 수 μžˆμŠ΅λ‹ˆλ‹€.

기본적인 λ””μžμΈκ³Ό κΈ°λŠ₯은 Tide 앱을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ›€Β μ§‘μ€‘κ³Ό νœ΄μ‹μ€ λ°˜λŒ€κ°€ μ•„λ‹™λ‹ˆλ‹€.

일에 λͺ°λ‘ν•˜λŠ” 것도 집쀑, 였둯이 νœ΄μ‹λ§Œμ„ μ¦κΈ°λŠ” 것도 μ§‘μ€‘μž…λ‹ˆλ‹€.

πŸ§˜Β νœ΄μ‹μ—λ„ μ’…λ₯˜κ°€ μžˆμ§€ μ•Šμ„κΉŒμš”?

νŽΈμ•ˆν•œ μ†Œλ¦¬λ‘œ κΈ΄μž₯을 ν‘ΈλŠ” 것도 νœ΄μ‹μ΄μ§€λ§Œ, μ‹ λ‚˜λŠ” μŒμ•…μœΌλ‘œ 슀트레슀λ₯Ό ν•΄μ†Œν•˜λŠ” 것도 νœ΄μ‹μΌ κ±°μ˜ˆμš”!

πŸŽ§Β μ§μ ‘ λ…ΉμŒν•œ μŒμ›λ“€μ„ λ“€μœΌλ©° ν˜„μž₯감을 λŠκ»΄λ³΄μ„Έμš”!

각 μŒμ›λ³„ μ£Όμ œμ™€ μ½˜μ…‰νŠΈμ— λ§žμΆ”μ–΄ κ³ ν’ˆμ§ˆ 마이크둜 μ‹€μ œ λ…ΉμŒν•œ μŒμ›μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

βœ’οΈΒ κ°€λ”μ€ μœ„λ‘œμ˜ ν•œ λ§ˆλ””, μ‘μ›μ˜ ν•œ λ§ˆλ””κ°€ ν•„μš”ν•˜μ§€ μ•ŠμœΌμ‹ κ°€μš”?

ν•˜λ£¨ ν•œ 쀄, λ‹Ήμ‹ μ˜ λ§ˆμŒμ„ νŽΈμ•ˆν•˜κ²Œ ν•΄ 쀄 글을 μ†Œκ°œν•΄λ“œλ¦΄κ²Œμš”.

πŸ§‘β€πŸ€β€πŸ§‘Β  νŒ€μ› μ†Œκ°œ

ο£Ώ iOS ο£Ώ iOS ο£Ώ iOS ο£Ώ iOS
S031 μ˜€ν˜„μ‹πŸŽ§ S034 μœ€μƒμ§„πŸ’Ώ S039 μ΄μˆ˜ν˜„πŸ“’ S055 μ‘°κΈ°μ™„πŸ”Š

πŸ’‘Β μ£Όμš” κΈ°λŠ₯

ν™ˆν™”λ©΄ 상단 ν™ˆν™”λ©΄ ν•˜λ‹¨ 였늘의 λͺ…μ–Έ 집쀑 톡계 ν™”λ©΄
κΈ°λ³Έ 타이머 λ½€λͺ¨λ„λ‘œ 타이머 λ¬΄ν•œ 타이머 μˆ¨μ‰¬κΈ° 타이머
νƒœκ·Έ 선택 κΈ°λŠ₯ 검색 κΈ°λŠ₯ μŒμ› μž¬μƒ Bright λͺ¨λ“œ Dark λͺ¨λ“œ

πŸ›Β ν”„λ‘œμ νŠΈ ꡬ쑰

MVVM 기반 Clean Architecture

iOS 클린 아킀텍쳐 ꡬ쑰λ₯Ό 기본적으둜 μ±„μš©ν•˜μ˜€κ³  ν”„λ ˆμ  ν…Œμ΄μ…˜ 계측에 MVVM νŒ¨ν„΄μ„ μ μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

ν΄λ¦°μ•„ν‚€ν…μ³μ˜ λ ˆμ΄μ–΄ λ‹¨μœ„λ‘œ 디렉토리 ꡬ쑰λ₯Ό λ‚˜λˆ„μ—ˆμŠ΅λ‹ˆλ‹€.

πŸ› Β μ‚¬μš©ν•œ ν”„λ ˆμž„μ›Œν¬

🍎 Apple First-party Library

AVKit

  • μŒμ›κ³Ό λ™μ˜μƒμ˜ 반볡 μž¬μƒμ„ μœ„ν•΄ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

CoreAnimation

  • 집쀑λͺ¨λ“œ κΈ°λŠ₯μ—μ„œ μ‚¬μš©ν•  μ• λ‹ˆλ©”μ΄μ…˜μ„ μœ„ν•΄ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.
  • Pulse, ν˜œμ„±, λΉ„μ •ν˜• λ„ν˜•, Text μ• λ‹ˆλ©”μ΄μ…˜μ„ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.
  • μ• λ‹ˆλ©”μ΄μ…˜ λͺ©μ  외에도 UI κ°œμ„ μ„ μœ„ν•΄ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€

SpriteKit

  • 클럽 λΆ„μœ„κΈ°λ₯Ό μ—°μΆœν•˜κΈ° μœ„ν•΄ 빛을 닀루기에 μ ν•©ν•œ SpriteKit을 μ±„νƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • SKLightNode, SKSpriteNode, SKAction을 μ΄μš©ν•˜μ—¬ ν•΄λ‹Ή μ• λ‹ˆλ§€μ΄μ…˜μ„ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ”§Β Third-party Library

Firebase/Storage

  • μŒμ› λ‹€μš΄λ‘œλ“œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • λ°±μ—”λ“œ μ„œλ²„μ— λ§Žμ€ 투자λ₯Ό ν•˜μ§€ μ•Šκ³  μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€λŠ” 점이 λ§€λ ₯μ μ΄μ˜€μŠ΅λ‹ˆλ‹€.

RxSwift

  • ViewModelκ³Ό View의 Data Bind와 비동기 λ‘œμ§μ„ λ‹΄λ‹Ήν•˜κΈ° μœ„ν•΄ μΆ”κ°€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • Callbackμ΄λ‚˜ NotificationCenterλ“±μœΌλ‘œλ„ 관리할 수 μžˆμ§€λ§Œ, Callback은 Callback Hellκ³Ό 가독성 λ¬Έμ œκ°€ 있고 NotificationCenterλŠ” μ–΄λ””μ„œ 변경될 μ§€ λͺ¨λ₯΄κ³  μ‚¬μš©ν•˜λŠ” μΈ‘μ—μ„œλ„ Key와 νƒ€μž…μ„ 직접 κ΄€λ¦¬ν•΄μ•Όν•˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
  • Apple의 FirstParty인 Combine은 μΆœμ‹œλœμ§€ μ–Όλ§ˆλ˜μ§€ μ•Šμ•„ μ΅œμ†Œνƒ€κ²Ÿ λ¬Έμ œκ°€ 있고 μ°Έκ³ ν•  μ˜ˆμ œκ°€ 더 λ§Žμ€ RxSwiftλ₯Ό μ±„νƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.

RealmSwift

  • μ„ ν˜Έλͺ©λ‘, 타이머 이용기둝 λ“±μ˜ 정보듀을 μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • Apple의 FirstParty Framework인 CoreData에 λΉ„ν•΄ 속도가 λΉ λ₯΄κ³ , μ½”λ“œλŸ‰λ„ 쀄어 개발 생산성에 더 μ’‹λ‹€κ³  νŒλ‹¨ν•˜μ—¬ λ„μž…ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

SnapKit

  • μ½”λ“œλ‘œλ§Œ λ·°λ₯Ό μž‘μ„±ν•˜κΈ° λ•Œλ¬Έμ— μ˜€ν† λ ˆμ΄μ•„μ›ƒ 섀정을 μ’€ 더 κ°„νŽΈν•˜κ²Œ ν•˜κΈ°μœ„ν•΄ λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€.

SwiftLint

  • ν˜‘μ—…μ‹œ μ½”λ”©μŠ€νƒ€μΌμ— λŒ€ν•œ 기본적인 룰을 μ •ν•˜κ³  μ§€ν‚€κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • μ½”λ“œ 리뷰 λ•Œ 체크해야할 μ»¨λ²€μ…˜ 였λ₯˜μ— λŒ€ν•œ 확인을 μ»΄ν“¨ν„°μ—κ²Œ μœ„μž„ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

기술 특μž₯점

UserInteraction

πŸ€— μ‚¬μš©μž κ²½ν—˜ ν–₯상을 μœ„ν•œ μ• λ‹ˆλ©”μ΄μ…˜

  • μžμ—°μŠ€λŸ½κ²Œ 앱에 λΉ μ Έλ“€ 수 μžˆλ„λ‘ λΆ€λ“œλŸ¬μš΄ ν™”λ©΄μ „ν™˜μ— μ‹ κ²½ μΌμŠ΅λ‹ˆλ‹€.
  • 타이머 각각의 νŠΉμ§•μ„ 보여쀄 수 μžˆλŠ” μ• λ‹ˆλ©”μ΄μ…˜μ„ μ œκ³΅ν•΄μ„œ μ‚¬μš©μžκ°€ μ§κ΄€μ μœΌλ‘œ μ–΄λ–€ 타이머인지 μ•Œ 수 μžˆλ„λ‘ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.
  • SpriteKit을 μ΄μš©ν•˜μ—¬ 닀크λͺ¨λ“œμ˜ 클럽 μ‘°λͺ… μ• λ‹ˆλ©”μ΄μ…˜μ„ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ• μž¬μ‚¬μš©μ„±μ„ μœ„ν•œ μ• λ‹ˆλ©”μ΄μ…˜ κΈ°λŠ₯

  • UIViewAnimate, CAAnimation 등을 μ μ ˆν•˜κ²Œ μ‚¬μš©ν•΄μ„œ μ»€μŠ€ν…€ μ• λ‹ˆλ©”μ΄μ…˜μ„ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • μ»€μŠ€ν…€ μ• λ‹ˆλ©”μ΄μ…˜μ€ ν•„μš”ν•œ κ³³μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ˜μ‘΄μ„±μ„ λΆ„λ¦¬ν•˜μ—¬ μ œμž‘ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

♻️ λ™μ˜μƒμ΄ ν¬ν•¨λœ λ¬΄ν•œ μŠ€ν¬λ‘€μ„ μœ„ν•œ μ»€μŠ€ν…€ λ·°

  • λŠμž„μ—†μ΄ μ΄μ–΄μ§€λŠ” λŠλ‚Œμ„ μ£ΌκΈ° μœ„ν•΄ 직접 κ΅¬ν˜„ν•œ μ»€μŠ€ν…€ λ·°λ₯Ό μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • 쒌우 μŠ€ν¬λ‘€ν•˜λ©΄ λ‹€μŒ ν™”λ©΄μ˜ λΉ„λ””μ˜€/μ˜€λ””μ˜€λ₯Ό λΆ€λ“œλŸ½κ²Œ μžλ™ μž¬μƒν•©λ‹ˆλ‹€.

UI based Code (w/o storyboard)

πŸ§‘β€πŸ’» Storyboardλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ 이유

  • κ°μžκ°€ λ‹€λ₯Έ κΈ°λŠ₯을 λ§‘μ•„μ„œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” 뢄업이 μ•„λ‹Œ μ—¬λŸ¬ μ‚¬λžŒμ΄ κ³΅ν†΅μ˜ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” ν˜‘μ—…μ„ ν•˜λ‹€λ³΄λ©΄ μŠ€ν† λ¦¬λ³΄λ“œλ‘œ μž‘μ—…ν–ˆμ„ λ•Œ μž‘μ—… 좩돌이 많이 생길 거라 μ˜ˆμΈ‘ν•˜μ˜€κ³  μ½”λ“œλ‘œ μž‘μ—…ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€.
  • μ½”λ“œλ‘œ μž‘μ—…μ„ ν•˜λ‹€λ³΄λ‹ˆ git을 톡해 μ„œλ‘œμ˜ μ½”λ“œλ₯Ό μ‰½κ²Œ 리뷰해쀄 수 μžˆμ—ˆκ³  톡일성 μžˆλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

πŸ§‘β€πŸ’» μ½”λ“œλ₯Ό 쀄이기 μœ„ν•΄ ν–ˆλ˜ λ…Έλ ₯λ“€

  • μž¬μ‚¬μš©μ„±μ„ 높이기 μœ„ν•΄ 곡톡 UI μ»΄ν¬λ„ŒνŠΈ(Button, CardView λ“±)을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

  • Autolayout을 μ‰½κ²Œ μž‘μ„±ν•˜κ³  μ½”λ“œλ₯Ό 쀄이기 μœ„ν•΄ 이미 많이 μ‚¬μš©λ˜κ³  μžˆλŠ” Snapkit 라이브러리λ₯Ό ν™œμš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • Extensionκ³Ό Generic을 적절히 ν™œμš©ν•΄μ„œ λ°˜λ³΅λ˜λŠ” μ½”λ“œλ₯Ό 쀄이기 μœ„ν•΄ λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€.

    // EX)
    extension UICollectionViewCell {
        static var identifier: String {
            return String(describing: self)
        }
    }
    
    extension UICollectionView { 
        func dequeueReusableCell<T: UICollectionViewCell>(indexPath: IndexPath) -> T? {
            return self.dequeueReusableCell(withReuseIdentifier: T.identifier, for: indexPath) as? T
        }
    }
    

πŸ‘¨β€πŸ’» νŒ€ 개발 λ¬Έν™”

νŒ€ κ°œλ°œλ¬Έν™”, 기술적인 μ΄μŠˆλ“€μ€ νŒ€ μœ„ν‚€μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.