ππ»ββοΈ νλ‘μ νΈ μκ°
μν°λ νλ¦¬μ¨ λ³΄λ© BoxOffice
μ± νλ‘μ νΈ μ
λλ€.
νλ‘μ νΈ κΈ°κ°: 2023-01-02 ~ 2022-01-06 (5μΌ)
νμ: Judy, μ‘λΉ
π§π»βπ»π§π»βπ» κ°λ°μ μκ°
Judy |
μ‘λΉ |
![](https://camo.githubusercontent.com/56cd7356d5ecdfa44de504fa4748fd2abf231958ab30f8863a629f054ed8a3ea/68747470733a2f2f692e696d6775722e636f6d2f6e33303454514f2e6a7067) |
![](https://camo.githubusercontent.com/01fc41f6ee340d46226958b5e787447c263a6941f53f5607195b95ddcfe483ee/68747470733a2f2f692e696d6775722e636f6d2f6651446f3872562e6a7067) |
Firestore ,리뷰νλ©΄ , μμΈνλ©΄ |
async-await , API , ννλ©΄ |
-
APIKey μνΈν
- API keyκ° κ³΅κ° Repositoryμ λ
ΈμΆλμ§ μλλ‘ plistλ‘ κ΄λ¦¬νμμ΅λλ€.
![](https://camo.githubusercontent.com/8a57d7f7318636761135e47bec566b89a616f3f70a21a8756013d1a199bae635/68747470733a2f2f692e696d6775722e636f6d2f6961464e3267302e706e67)
- omdb_API_KEY : 112af520
- kobis_API_KEY : 6f25ceb4b995518d987d1f003e84fae7
- μ μ¬μ§μ²λΌ MovieInfo νμΌμ λκ°μ ν€λ₯Ό κΈ°μ
ν΄μ£Όμ
μΌ APIκ° λμν©λλ€
-
MVVM
- λ°μ΄ν° κ΄λ ¨ λ‘μ§μ ViewModel, λ·°μ μν κ΄λ¦¬λ ViewContoller, λ·°μ λ‘μ§μ Viewλ‘ MVVM ν¨ν΄μ μ¬μ©ν΄ μ΄λ² νλ‘μ νΈλ₯Ό μ§νν΄ λ³΄μμ΅λλ€.
-
λμμΈν¨ν΄
- μ΅μ λ²λΈ ν¨ν΄
- MVVM ꡬνμ λ°μ΄ν° λ°μΈλ©μ μν΄ μ΅μ λ²λΈ ν¨ν΄μΌλ‘ ꡬνμ ν΄λ³΄μμ΅λλ€.
- μ±κΈν€ ν¨ν΄
- λ°μ΄ν°λ² μ΄μ€λ‘ μ¬μ©νλ FirestoreManager ꡬν μ νλμ μΈμ€ν΄μ€λ₯Ό μ μ§νκΈ° μν΄ μ±κΈν€ ν¨ν΄μ μ μ©νμ΅λλ€.
-
UI ꡬν
- μ½λ λ² μ΄μ€ UI
- μ€ν λ μ΄μμ
- νΌκ·Έλ§ νλ‘ν νμ
-
λ°μ΄ν°λ² μ΄μ€
-
λΉλκΈ°μ²λ¦¬
μΌλ³ λ°μ€μ€νΌμ€ νλ©΄ |
μ£Όκ°/μ£Όλ§ λ°μ€μ€νΌμ€ νλ©΄ |
λ μ§ μ ν |
![](https://user-images.githubusercontent.com/95671495/211020054-eb9e980e-9108-4890-96d8-d030de264c79.gif) |
![](https://user-images.githubusercontent.com/95671495/211020560-63bd6278-68a3-4c70-89af-82eafbdc4f03.gif) |
![](https://user-images.githubusercontent.com/95671495/211021219-698d76f8-bf8f-4d1f-a9fe-2ac5ec3aa919.gif) |
μμΈνλ©΄ + 리뷰νλ©΄
μμΈνλ©΄ + μΆμ°μ§ λ보기 |
리뷰 μ°κΈ° |
리뷰보기 λ° μμ |
![](https://user-images.githubusercontent.com/95671495/211034206-f80b71a3-7ea4-464b-b566-309c251eb7f1.gif) |
![](https://camo.githubusercontent.com/4aadb8cc29c144495c606e265adaca07e8296c63e2cbd26e67463b3e27e0a475/68747470733a2f2f692e696d6775722e636f6d2f314f79387271702e676966) |
![](https://user-images.githubusercontent.com/95671495/211033515-da18ca14-c0d0-4fb5-9aef-220598436619.gif) |
.
βββ 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 νμμΌλ‘
ꡬνμ νμ΅λλ€.
API μμ²μ΄ 3λ² μ°μλμ΄ @escaping ν΄λ‘μ λ‘ μ²λ¦¬νκ² λ μ 볡μ‘ν μ½λλ‘ μΈν΄ κ°λ
μ±μ΄ λ¨μ΄μ§κ³
νμ
νλ νμ λν μ½λλ₯Ό μ΄ν΄νκΈ° μ΄λ €μ΄ μν©μ΄ μμμ΅λλ€. async-await μ²λ¦¬λ‘ μΈν΄ λ€μ¬μ°κΈ° λ¬Έλ²μ
μ΅λν λ°°μ νκ³ , κ°λ
μ±μ μ¬λ € νμκ³Ό νμ
νκΈ° μ’μ μ½λλ‘ λ³κ²½ νμμ΅λλ€.
리뷰λ₯Ό μ μ₯νκΈ° μν΄ Firebaseμ Firestoreλ₯Ό μ¬μ©νμ΅λλ€. 리뷰 κ°μ λ
립μ±μ μν΄ μν λ³λ‘
`λλ€μ+μνΈ`λ₯Ό νμΌ μ΄λ¦μΌλ‘ μ μ₯νμ΅λλ€. Firestoreμ μ¬μ©μ λλ `FirestoreManager`κ°μ²΄κ° μκ³ ,
ν΄λΉ κ°μ²΄λ₯Ό `Review`λ‘ μ§μ μ¬μ©νλ `ReviewFiresoterUseCase` κ°μ²΄λ‘ κ³μΈ΅μ λΆλ¦¬νμ΅λλ€
리뷰 ν
μ΄λΈ λ·° μ
λμ ν¬κΈ° μ‘°μ
- νμ¬ λ¦¬λ·°μ κΈ΄ κΈμ μ μμ κ²½μ° λλ¨Έμ§ κΈμκ°
...
λ‘ μλ¦¬κ³ μμ΅λλ€. 리뷰 리μ€νΈλ₯Ό 보μ¬μ£Όλ νλ©΄μμ μ
μ ν¬κΈ°λ₯Ό λ€μ΄λλ―Ήνκ² μ‘°μ νλ κΈ°λ₯μ μμ§ λ£μ§ λͺ»νμ΅λλ€.
- νμ¬ λ¦¬λ·° μ΄λ―Έμ§λ₯Ό μ νν μ μμ§λ§ μ μ₯νμ§ μκ³ κΈ°λ³Έ μ΄λ―Έμ§λ§ λμ°κ³ μμ΅λλ€. FireStorageλ₯Ό μ¬μ©νλ € ꡬνκΉμ§ ν΄λ¨μ§λ§, Firestoreλ§ μ¬μ©νλ μꡬμ¬νμ λ°λΌ
UIImage
λ₯Ό base64
λ‘ String
μΌλ‘ μ νν ν λ°°μ΄ ννλ‘ Firestoreμ μ μ₯νλ©΄ λ κ² κ°μ΅λλ€.