# ๐ŸŽฅ ๋น„๋””์˜ค๋ ˆ์ฝ”๋” > ์˜์ƒ์„ ์ดฌ์˜ํ•˜๊ณ  ์žฌ์ƒํ•˜๋Š” ์•ฑ์ž…๋‹ˆ๋‹ค. > > ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„: 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 ![](https://hackmd.io/_uploads/rkb8_X7w3.png) </br> <details> <summary><big>๐Ÿ“‚ ๊ณ„์ธต ๋ณ„ ํ™•๋Œ€ ํŽผ์น˜๊ธฐ / ์ ‘๊ธฐ </big></summary> ![](https://hackmd.io/_uploads/Sk71d7QPn.png) ![](https://hackmd.io/_uploads/r13JdXQvh.png) ![](https://hackmd.io/_uploads/BJWe_7Xwn.png) ![](https://hackmd.io/_uploads/rkNeuQmDh.png) </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)