wongbingg / ios-wanted-BoxOffice

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

BoxOffice

πŸ™‹πŸ»β€β™‚οΈ ν”„λ‘œμ νŠΈ μ†Œκ°œ

μ›ν‹°λ“œ ν”„λ¦¬μ˜¨ 보딩 BoxOffice μ•± ν”„λ‘œμ νŠΈ μž…λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ κΈ°κ°„: 2023-01-02 ~ 2022-01-06 (5일) νŒ€μ›: Judy, μ›‘λΉ™

πŸ“‘ λͺ©μ°¨


πŸ§‘πŸ»β€πŸ’»πŸ§‘πŸ»β€πŸ’» 개발자 μ†Œκ°œ

Judy μ›‘λΉ™
Firestore,리뷰화면, 상세화면 async-await, API, ν™ˆν™”λ©΄

πŸ”‘ ν•΅μ‹¬κΈ°μˆ 

  • APIKey μ•”ν˜Έν™”

    • API keyκ°€ 곡개 Repository에 λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘ plist둜 κ΄€λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • omdb_API_KEY : 112af520
    • kobis_API_KEY : 6f25ceb4b995518d987d1f003e84fae7
    • μœ„ μ‚¬μ§„μ²˜λŸΌ MovieInfo νŒŒμΌμ— λ‘κ°œμ˜ ν‚€λ₯Ό κΈ°μž… ν•΄μ£Όμ…”μ•Ό APIκ°€ λ™μž‘ν•©λ‹ˆλ‹€
  • MVVM

    • 데이터 κ΄€λ ¨ λ‘œμ§μ€ ViewModel, 뷰의 μƒνƒœ κ΄€λ¦¬λŠ” ViewContoller, 뷰의 λ‘œμ§μ€ View둜 MVVM νŒ¨ν„΄μ„ μ‚¬μš©ν•΄ 이번 ν”„λ‘œμ νŠΈλ₯Ό 진행해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€.
  • λ””μžμΈνŒ¨ν„΄

    • μ˜΅μ €λ²„λΈ” νŒ¨ν„΄
      • MVVM κ΅¬ν˜„μ‹œ 데이터 바인딩을 μœ„ν•΄ μ˜΅μ €λ²„λΈ” νŒ¨ν„΄μœΌλ‘œ κ΅¬ν˜„μ„ ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.
    • 싱글톀 νŒ¨ν„΄
      • λ°μ΄ν„°λ² μ΄μŠ€λ‘œ μ‚¬μš©ν•˜λŠ” FirestoreManager κ΅¬ν˜„ μ‹œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄ 싱글톀 νŒ¨ν„΄μ„ μ μš©ν–ˆμŠ΅λ‹ˆλ‹€.
  • UI κ΅¬ν˜„

    • μ½”λ“œ 베이슀 UI
    • μ˜€ν† λ ˆμ΄μ•„μ›ƒ
    • ν”Όκ·Έλ§ˆ ν”„λ‘œν† νƒ€μž…
    μŠ€ν¬λ¦°μƒ· 2023-01-06 μ˜€ν›„ 10 26 35
  • λ°μ΄ν„°λ² μ΄μŠ€

    • Firestore
  • λΉ„λ™κΈ°μ²˜λ¦¬

    • async - await

πŸ“± μ‹€ν–‰ν™”λ©΄

ν™ˆν™”λ©΄

일별 λ°•μŠ€μ˜€ν”ΌμŠ€ ν™”λ©΄ μ£Όκ°„/주말 λ°•μŠ€μ˜€ν”ΌμŠ€ ν™”λ©΄ λ‚ μ§œ 선택

상세화면 + 리뷰화면

상세화면 + μΆœμ—°μ§„ 더보기 리뷰 μ“°κΈ° 리뷰보기 및 μ‚­μ œ

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

.
β”œβ”€β”€ APIs
β”‚	β”œβ”€β”€ SearchDailyBoxOfficeListAPI.swift
β”‚	β”œβ”€β”€ SearchMovieInfoAPI.swift
β”‚	β”œβ”€β”€ SearchMoviePosterAPI.swift
β”‚	└── SearchWeeklyBoxOfficeListAPI.swift
β”œβ”€β”€ Application
β”‚	β”œβ”€β”€ AppDelegate.swift
β”‚	└── SceneDelegate.swift
β”œβ”€β”€ Domain
β”‚	β”œβ”€β”€ Entities
β”‚	β”‚	β”œβ”€β”€ MovieData.swift
β”‚	β”‚	└── Review.swift
β”‚	└── UseCase
β”‚		β”œβ”€β”€ MovieAPIUseCase.swift
β”‚		└── ReviewFirebaseUseCase.swift
β”œβ”€β”€ GoogleService-Info.plist
β”œβ”€β”€ Info.plist
β”œβ”€β”€ MovieInfo.plist
β”œβ”€β”€ Resource
β”‚	β”œβ”€β”€ Assets.xcassets
β”‚	β”‚	β”œβ”€β”€ AccentColor.colorset
β”‚	β”‚	β”‚	└── Contents.json
β”‚	β”‚	β”œβ”€β”€ AppIcon.appiconset
β”‚	β”‚	β”‚	└── Contents.json
β”‚	β”‚	└── Contents.json
β”‚	└── Base.lproj
β”‚		└── LaunchScreen.storyboard
β”œβ”€β”€ Scene
β”‚	β”œβ”€β”€ HomeScene
β”‚	β”‚	β”œβ”€β”€ CalendarModalView
β”‚	β”‚	β”‚	β”œβ”€β”€ CalendarPresentationController.swift
β”‚	β”‚	β”‚	β”œβ”€β”€ CalendarTransitioningDelegate.swift
β”‚	β”‚	β”‚	└── CalendarViewController.swift
β”‚	β”‚	β”œβ”€β”€ HomeViewController.swift
β”‚	β”‚	β”œβ”€β”€ HomeViewModel.swift
β”‚	β”‚	β”œβ”€β”€ ModeSelectModalView
β”‚	β”‚	β”‚	β”œβ”€β”€ ModeSelectCell.swift
β”‚	β”‚	β”‚	β”œβ”€β”€ ModeSelectPresentationController.swift
β”‚	β”‚	β”‚	β”œβ”€β”€ ModeSelectTransitioningDelegate.swift
β”‚	β”‚	β”‚	└── ModeSelectViewController.swift
β”‚	β”‚	└── SubViews
β”‚	β”‚	 	β”œβ”€β”€ GridCell.swift
β”‚	β”‚	 	β”œβ”€β”€ HeaderView.swift
β”‚	β”‚	 	β”œβ”€β”€ HomeCollectionView.swift
β”‚	β”‚	 	└── ListCell.swift
β”‚	β”œβ”€β”€ MovieDetailScene
β”‚	β”‚	β”œβ”€β”€ ActorListModalView
β”‚	β”‚	β”‚	β”œβ”€β”€ ActorListPresentationController.swift
β”‚	β”‚	β”‚	β”œβ”€β”€ ActorListTransitioningDelegate.swift
β”‚	β”‚	β”‚	└── ActorListViewController.swift
β”‚	β”‚	β”œβ”€β”€ MovieDetailViewController.swift
β”‚	β”‚	β”œβ”€β”€ SubViews
β”‚	β”‚	β”‚	β”œβ”€β”€ MovieButton.swift
β”‚	β”‚	β”‚	β”œβ”€β”€ MovieLabel.swift
β”‚	β”‚	β”‚	β”œβ”€β”€ MovieMainInfoView.swift
β”‚	β”‚	β”‚	β”œβ”€β”€ MovieReviewView.swift
β”‚	β”‚	β”‚	β”œβ”€β”€ MovieSubInfoView.swift
β”‚	β”‚	β”‚	└── ReviewTableViewCell.swift
β”‚	β”‚	└── UIViewController+.swift
β”‚	└── ReviewScene
β”‚	    β”œβ”€β”€ MovieReviewViewModel.swift
β”‚	    β”œβ”€β”€ ReviewListViewController.swift
β”‚	    └── WriteReviewViewController.swift
β”œβ”€β”€ Service
β”‚	β”œβ”€β”€ Firebase
β”‚	β”‚	β”œβ”€β”€ FirebaseError.swift
β”‚	β”‚	β”œβ”€β”€ FirestoreManager.swift
β”‚	β”‚	└── StorageManager.swift
β”‚	└── Network
β”‚	 	β”œβ”€β”€ API.swift
β”‚	 	β”œβ”€β”€ APIClient.swift
β”‚	 	β”œβ”€β”€ APIConfiguration.swift
β”‚	 	β”œβ”€β”€ APIError.swift
β”‚	 	└── Extension
β”‚	 	    β”œβ”€β”€ Bundle+Extension.swift
β”‚	 	    β”œβ”€β”€ Date+Extension.swift
β”‚	 	    └── Dictionary+Extension.swift
└── Utility
	β”œβ”€β”€ ImageCache
	β”‚	└── ImageCacheManager.swift
 	β”œβ”€β”€ Observable
 	β”‚	└── Observable.swift
 	└── StarRating
 	 	β”œβ”€β”€ StarRatingView.swift
 	 	└── SubViews
 			β”œβ”€β”€ StarImageView.swift
 			└── StarRatingUISlider.swift

βš™οΈ μ μš©ν•œ 기술

βœ… CollectionView Compositional Layout

μ„Ήμ…˜λ³„λ‘œ 데이터λ₯Ό μœ μ—°ν•˜κ²Œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ Compositional Layout을 μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 

βœ… Custom Modal View

`보기λͺ¨λ“œ λ³€κ²½ λ²„νŠΌ(상단 λ²„νŠΌ)`, `μΊ˜λ¦°λ” λ²„νŠΌ`, `μΆœμ—°μ§„ 더보기 λ²„νŠΌ` 을 Custom Modal ν˜•μ‹μœΌλ‘œ
κ΅¬ν˜„μ„ ν–ˆμŠ΅λ‹ˆλ‹€.  

βœ… Async - Await

API μš”μ²­μ΄ 3번 μ—°μ†λ˜μ–΄ @escaping ν΄λ‘œμ €λ‘œ μ²˜λ¦¬ν•˜κ²Œ 될 μ‹œ λ³΅μž‘ν•œ μ½”λ“œλ‘œ 인해 가독성이 떨어지고
ν˜‘μ—…ν•˜λŠ” νŒ€μ› λ˜ν•œ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ–΄λ €μš΄ 상황이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. async-await 처리둜 인해 λ“€μ—¬μ“°κΈ° 문법을
μ΅œλŒ€ν•œ λ°°μ œν•˜κ³ , 가독성을 올렀 νŒ€μ›κ³Ό ν˜‘μ—…ν•˜κΈ° 쒋은 μ½”λ“œλ‘œ λ³€κ²½ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 

βœ… Firestore

리뷰λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ Firebase의 Firestoreλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. 리뷰 κ°„μ˜ 독립성을 μœ„ν•΄ μ˜ν™” λ³„λ‘œ
`λ‹‰λ„€μž„+μ•”ν˜Έ`λ₯Ό 파일 μ΄λ¦„μœΌλ‘œ μ €μž₯ν–ˆμŠ΅λ‹ˆλ‹€. Firestore의 μ‚¬μš©μ„ λ•λŠ” `FirestoreManager`객체가 있고, 
ν•΄λ‹Ή 객체λ₯Ό `Review`둜 직접 μ‚¬μš©ν•˜λŠ” `ReviewFiresoterUseCase` 객체둜 계측을 λΆ„λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€

πŸ›  κ°œμ„ ν•  점

리뷰 ν…Œμ΄λΈ” λ·° μ…€ 동적 크기 쑰절

  • ν˜„μž¬ 리뷰에 κΈ΄ 글을 μ μ—ˆμ„ 경우 λ‚˜λ¨Έμ§€ κΈ€μžκ°€ ...둜 잘리고 μžˆμŠ΅λ‹ˆλ‹€. 리뷰 리슀트λ₯Ό λ³΄μ—¬μ£ΌλŠ” ν™”λ©΄μ—μ„œ μ…€μ˜ 크기λ₯Ό λ‹€μ΄λ‚˜λ―Ήν•˜κ²Œ μ‘°μ ˆν•˜λŠ” κΈ°λŠ₯을 아직 넣지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

리뷰 이미지

  • ν˜„μž¬ 리뷰 이미지λ₯Ό 선택할 순 μžˆμ§€λ§Œ μ €μž₯ν•˜μ§€ μ•Šκ³  κΈ°λ³Έ μ΄λ―Έμ§€λ§Œ λ„μš°κ³  μžˆμŠ΅λ‹ˆλ‹€. FireStorageλ₯Ό μ‚¬μš©ν•˜λ € κ΅¬ν˜„κΉŒμ§€ ν•΄λ†¨μ§€λ§Œ, Firestore만 μ‚¬μš©ν•˜λŠ” μš”κ΅¬μ‚¬ν•­μ— 따라 UIImageλ₯Ό base64둜 String으둜 μ „ν™˜ν•œ ν›„ λ°°μ—΄ ν˜•νƒœλ‘œ Firestore에 μ €μž₯ν•˜λ©΄ 될 것 κ°™μŠ΅λ‹ˆλ‹€.

About


Languages

Language:Swift 100.0%