# ๐ฅ ๋น๋์ค๋ ์ฝ๋ > ์์์ ์ดฌ์ํ๊ณ ์ฌ์ํ๋ ์ฑ์ ๋๋ค. > > ํ๋ก์ ํธ ๊ธฐ๊ฐ: 2023-06-05 ~ 2023-06-11 > > [์์ค ์ฝ๋: master branch](https://github.com/kokkilE/ios-wanted-VideoRecorder/tree/master) </br> ## โญ๏ธ ํ์ | kokkilE | | :---: | | <Img src = "https://hackmd.io/_uploads/SJL_ZRGw2.jpg" height=300> | | [Github Profile](https://github.com/kokkilE) | </br> ## ๐ป ๊ฐ๋ฐํ๊ฒฝ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ <img src = "https://img.shields.io/badge/swift-5.8-orange"> <img src = "https://img.shields.io/badge/Xcode-14.3-orange"> <img src = "https://img.shields.io/badge/Minimum%20Deployments-14.0-orange"> <img src = "https://img.shields.io/badge/Firebase-10.10.0-green"> ### ์ ์ฉ ํ๋ ์์ํฌ <img src = "https://img.shields.io/badge/UIKit--green"> <img src = "https://img.shields.io/badge/Combine--green"> <img src = "https://img.shields.io/badge/AVFoundation--green"> <img src = "https://img.shields.io/badge/CoreData--green"> <img src = "https://img.shields.io/badge/Foundation--green"> </br> ## ๐ ๋ชฉ์ฐจ 1. [ํ์ ๋ผ์ธ](#-ํ์-๋ผ์ธ) 2. [ํ๋ก์ ํธ ๊ตฌ์กฐ](#-ํ๋ก์ ํธ-๊ตฌ์กฐ) 3. [๊ตฌํ ๊ธฐ๋ฅ](#-๊ตฌํ-๊ธฐ๋ฅ) 4. [์์ฌ์ด ์ ](#-์์ฌ์ด-์ ) 5. [์ฐธ๊ณ ๋งํฌ](#-์ฐธ๊ณ -๋งํฌ) </br> # ๐ ํ์๋ผ์ธ | ์ผ์ | <center>๊ตฌํ ๋ด์ฉ | | :---: | --- | | 23.06.05(์) | - ์๊ตฌ์ฌํญ ๋ถ์ </br> - ๋ชฉ๋ก ํ๋ฉด์ ์ปฌ๋ ์ ๋ทฐ ๋ ์ด์์ ๊ตฌ์ฑ | | 23.06.06(ํ) | - ์ปฌ๋ ์ ๋ทฐ ์ ๊ตฌํ </br> - ๋ฐ์ดํฐ ๋ชจ๋ธ ๋ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๊ฐ์ฒด ๊ตฌํ | | 23.06.07(์) | - ์์ ๋ นํ ํ๋ฉด ๊ตฌํ </br> | | 23.06.08(๋ชฉ) | - ์์ ๋ นํ ๊ธฐ๋ฅ ๋ฐ UI ๊ฐ์ </br> - ์ฝ์ด๋ฐ์ดํฐ ๋ชจ๋ธ ๊ตฌํ| | 23.06.09(๊ธ) | - ์ฝ์ด๋ฐ์ดํฐ CRUD ๊ธฐ๋ฅ ๊ตฌํ </br> - ์์ ์ฌ์ ๊ธฐ๋ฅ ๊ตฌํ | | 23.06.10(ํ ) | - ์์ ์๊ฐ ํ์ ๋ ์ด๋ธ ๊ตฌํ </br> - ๋ชฉ๋ก ํ๋ฉด์ ์ธ๋ค์ผ ๊ตฌํ </br> - pagination ๊ตฌํ | | 23.06.11(์ผ) | - ์์ ์์ธ ์ ๋ณด ํ๋ฉด ๊ตฌํ | </br> # โ๏ธ ํ๋ก์ ํธ ๊ตฌ์กฐ ## Fire Tree <details> <summary><big>๐ ํผ์น๊ธฐ / ์ ๊ธฐ </big></summary> ``` VideoRecorder โโโ Application โย ย โโโ AppDelegate.swift โย ย โโโ SceneDelegate.swift โ โโโ Resources โย ย โโโ Assets.xcassets โ โโโ Source โ โโโ Common โ โย ย โโโ Utilitiy โ โย ย โ โโโ Extension โ โย ย โ โย ย โโโ Array+Subscript.swift โ โย ย โ โย ย โโโ CMTime+formattedTime.swift โ โย ย โ โย ย โโโ DateFormatter+dateToText.swift โ โย ย โ โย ย โโโ UICollectionViewCell+ReuseIdentifying.swift โ โย ย โ โย ย โโโ URL+createURL.swift โ โย ย โ โโโ AlertManager.swift โ โย ย โ โโโ ThumbnailManager.swift โ โย ย โโโ Protocol โ โย ย โย ย โโโ DataTransferObject.swift โ โย ย โย ย โโโ DataAccessObject.swift โ โย ย โโโ Model โ โย ย ย ย โโโ Video.swift โ โโโ Database โ โย ย โโโ Local โ โย ย โย ย โโโ CoreDataManager.swift โ โย ย โย ย โโโ VideoEntity+CoreDataClass.swift โ โย ย โโโ Remote โ โย ย โ โโโ FirebaseManager.swift โ โย ย โ โโโ CodeManager.swift โ โย ย โโโ Manager โ โย ย ย ย โโโ VideoManager.swift โ โย ย ย ย โโโ VideoRecorderService.swift โ โโโ VideoList โ โ โโโ Components โ โ โย ย โโโ LoadingView.swift โ โ โย ย โโโ VideoListCell.swift โ โ โโโ VideoListViewController.swift โ โ โโโ VideoListViewModel.swift โ โโโ PlayVideo โ โย ย โโโ Components โ โย ย โย ย โโโ PlayControlView.swift โ โย ย โโโ PlayVideoViewController.swift โ โย ย โโโ PlayVideoViewModel.swift โ โโโ RecordVideo โ ย ย โโโ Components โ ย ย โย ย โโโ RecordControlView.swift โ ย ย โโโ Manager โ ย ย โย ย โโโ Recorder.swift โ ย ย โย ย โโโ TimerManager.swift โ ย ย โโโ RecordVideoViewController.swift โ ย ย โโโ RecordVideoViewModel.swift โ โโโ GoogleService-Info.plist โโโ Info.plist ``` </details> ## Class Diagram  </br> <details> <summary><big>๐ ๊ณ์ธต ๋ณ ํ๋ ํผ์น๊ธฐ / ์ ๊ธฐ </big></summary>     </details> # ๐ ๊ตฌํ ๊ธฐ๋ฅ ## ์์ ๋ชฉ๋ก ํ๋ฉด |**10๊ฐ ๋จ์์ pagination** | **์ค์์ดํ๋ก ์ญ์ ** | |:---: | :---: | | <img src="https://hackmd.io/_uploads/BkwsOkXDn.gif" width=200> | <img src="https://hackmd.io/_uploads/rk2rFkQvh.gif" width=200> | - 10๊ฐ ๋จ์๋ก pagination๋ฉ๋๋ค. ๋์ด์ ์ฝ์ด์ฌ ๋ฐ์ดํฐ๊ฐ ์์ ๊ฒฝ์ฐ ์ฝ์ด์ค๊ธฐ๋ฅผ ์๋ํ์ง ์์ต๋๋ค. - ์ค์์ดํ๋ก ์์์ ์ญ์ ํฉ๋๋ค. ์์์ ์ญ์ ํ๋ฉด ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ชจ๋ ์ญ์ ๋ฉ๋๋ค. ## ์์ ๋ นํ ํ๋ฉด | **์นด๋ฉ๋ผ ํ์ ** | **๋ นํ๋ ์์ ๋ฐ ์ ์ฅ/์ทจ์** | | :---: | :---: | | <img src="https://hackmd.io/_uploads/SyGyHgQvh.gif" width=200> | <img src="https://hackmd.io/_uploads/Bkkj7xXv3.gif" width=200> | - ํ์ ์์ด์ฝ์ ํด๋ฆญํ๋ฉด ์นด๋ฉ๋ผ๊ฐ ํ์ ํฉ๋๋ค. ์์ ๋ นํ ์ค์๋ ํ์ ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. - ์์ ๋ นํ๊ฐ ์๋ฃ๋๋ฉด ํ์ผ๋ช ์ ์ ๋ ฅ๋ฐ์ต๋๋ค. ์ทจ์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ค์ ๋ นํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ## ์์ ์ฌ์ ํ๋ฉด | **์ฌ์โ์ผ์์ ์ง ํ ๊ธ** | **๊ณต์ ๊ธฐ๋ฅ** | **์ฌ์ ์๊ฐ ์ฌ๋ผ์ด๋๋ก ์กฐ์ ** | | :---: | :---: | :---: | | <img src="https://hackmd.io/_uploads/SkZ2W-mv3.gif" width=200> | <img src="https://hackmd.io/_uploads/Hkd4GbXvn.gif" width=200> | <img src="https://hackmd.io/_uploads/SkgXXbQwn.gif" width=200> | - ์ฌ์ ์ค ์ผ์์ ์ง ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์์์ด ์ผ์์ ์ง๋ฉ๋๋ค. ์ผ์์ ์ง ์ค ์ฌ์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์์์ด ๊ณ์ ์ฌ์๋ฉ๋๋ค. - ๊ณต์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์์ ์ ๋ณด์ ๊ณต์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. - ํ์ฌ ์ฌ์ ์๊ฐ์ ์ฌ๋ผ์ด๋๋ก ์กฐ์ ํ ์ ์์ต๋๋ค. | **์ฌ์ ์๊ฐ ์ฒ์์ผ๋ก ์ด๋** | **์์ ์ปจํธ๋กค๋ฌ ๋ณด์ด๊ธฐ/์จ๊ธฐ๊ธฐ** | **์์ ์ ๋ณด ํ์** | | :---: | :---: | :---: | | <img src="https://hackmd.io/_uploads/SkerKQWXDn.gif" width=200> | <img src="https://hackmd.io/_uploads/HJsGwZXv3.gif" width=200> | <img src="https://hackmd.io/_uploads/HyZ3DZXw2.gif" width=200> | - ์ฒ์์ผ๋ก ๋์๊ฐ๋ ๋ฒํผ์ ๋๋ฅด๋ฉด ์์์ ์ฒ์์ผ๋ก ์ด๋ํฉ๋๋ค. - ์์์ ํฐ์นํ๋ฉด ์์ ์ปจํธ๋กค๋ฌ ๋ณด์ด๊ธฐ/์จ๊ธฐ๊ธฐ ์ํ๊ฐ ํ ๊ธ๋ฉ๋๋ค. - ์๋จ์ Info ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๊ฐ๋จํ ์์์ ์ ๋ณด๊ฐ Alert์ผ๋ก ํ์๋ฉ๋๋ค. ## ์์ ๋ฐ์ดํฐ ๋ฐฑ์ | **์์ ์ ์ฅ** | **์์ ์ ์ฅ ์ ์๊ฒฉ DB์ ์ ๋ก๋** | | :---: | :---: | | <img src="https://hackmd.io/_uploads/S1A4MlXD3.gif" width=170> | <img src="https://hackmd.io/_uploads/rJwsGlXD2.gif" width=500> | - ์์์ ์ ์ฅํ๋ฉด ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ์ ์ฅ๋ฉ๋๋ค. - ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ๋ชฉ์ผ๋ก ๊ณ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์๋ณํ๊ธฐ ์ํด, ์์์ ์ ๋ชฉ๊ณผ ID๋ฅผ ์กฐํฉํ์ฌ ํ์ผ๋ช ์ผ๋ก ์ ๋ก๋๋ฉ๋๋ค. </br> # ๐ข ์์ฌ์ด ์ ## 1๏ธโฃ ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ฉ ๋ถ์กฑ ### ๋ฏธ๊ตฌํ ๊ธฐ๋ฅ - ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ์ฝ์ด์ค๋ ๊ธฐ๋ฅ์ด ๊ตฌํ๋์ด์์ง ์์ต๋๋ค. - ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํ๊ฐ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ### ๋ฐฐ๊ฒฝ ์๋ก์ด ์์์ด ์ ์ฅ๋ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ์ ์ฅ๋ฉ๋๋ค. ํ์ง๋ง ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋คํธ์ํฌ ํ๊ฒฝ์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋คํธ์ํฌ๊ฐ ์ฐ๊ฒฐ๋์ง ์์ ํ๊ฒฝ์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค๋ฉด ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ง ์ ์ฅ์ด ๋ ๊ฒ์ด๊ณ , ์ฑ์ ์ฌ์คํํ ํ ๋คํธ์ํฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์จ๋ค๋ฉด ๋คํธ์ํฌ๊ฐ ์ฐ๊ฒฐ๋์ง ์์ ํ๊ฒฝ์์ ์๋กญ๊ฒ ์์ฑ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ ๊ณ ๋ คํ์์ต๋๋ค. 1. ๋คํธ์ํฌ๊ฐ ์ฐ๊ฒฐ๋ ํ๊ฒฝ์์๋ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ํญ์ ๋๊ธฐํ ์ํ๋ฅผ ๋ณด์ฅํ๋ค. 2. ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐฑ์ ์ ์ฉ๋๋ก๋ง ํ์ฉํ๊ณ , ์ฑ์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๊ฒ ํ๋ค. 1๋ฒ ๋ฐฉ์์ ๋ํด์๋ ๊ธฐ์กด์ ๋ นํ๋ ์์์ ์์ฒญํ๋๋ฐ๋ ๋คํธ์ํฌ ํ๊ฒฝ์ด ๊ผญ ํ์ํ๋ค๋ฉด, ์ฑ์ ์ ์ฉ์ฑ์ด ๋ฎ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๋ฐ๋ผ์ **2๋ฒ ๋ฐฉ์์ ์ฑํ**ํ์์ผ๋ฉฐ ํ์ฌ ์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ๋์์ด ๊ตฌํ๋์ด ์์ต๋๋ค. - ์๋ก์ด ์์ ์์ฑ โ ๋ก์ปฌ/์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ์ ์ฅํฉ๋๋ค. - ์ฑ ์คํ โ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ต๋๋ค. ์ถํ ๋ก๊ทธ์ธ๊ณผ ๊ฐ์ ์ธ์ฆ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค๋ฉด, ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฉํ ๊ธฐ๊ธฐ ๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ## 2๏ธโฃ ๊ณต์ ๊ธฐ๋ฅ์ ํ์ฉ ๋ถ์กฑ ํ์ฌ ๊ณต์ ๊ธฐ๋ฅ์ `UIActivityViewController`๋ฅผ `present`ํ๋๋ก ๊ตฌํ๋์ด ์์ผ๋, ์ค์ง์ ์ธ ๋ฐ์ดํฐ์ ๊ณต์ ๋ ์ด๋ฃจ์ด์ง์ง ์๊ณ ์์ต๋๋ค. ์๊ฒฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ URL์ ๊ณต์ ํด์ ๊ณต์ ๋ ์์์ ์์ฒญํ ์ ์๊ฒ๋ ํ๋ ๋ฑ์ ์ถํ ๋ณด์์ด ํ์ํ ๊ธฐ๋ฅ์ ๋๋ค. </br> # ๐ ์ฐธ๊ณ ๋งํฌ - [์์ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํ ํ๋ ์์ํฌ ์ ํ์ ์ฐธ๊ณ ํ ์๋ฃ - AVFoundation vs UIImagePickerController](https://velog.io/@heyksw/iOS-AVFoundation-์ผ๋ก-custom-camera-๊ตฌํ) ## ์ ํ ๊ณต์ ๋ฌธ์ - [Combine](https://developer.apple.com/documentation/combine) - [AVFoundation](https://developer.apple.com/av-foundation/) - [Implementing Modern Collection Views](https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/implementing_modern_collection_views) - [Capture setup](https://developer.apple.com/documentation/avfoundation/capture_setup) - [Choosing a Capture Device](https://developer.apple.com/documentation/avfoundation/capture_setup/choosing_a_capture_device)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up