# โ˜•๏ธ swift-p4-startbuckst ๐Ÿน ### iOS ํ”„๋กœ์ ํŠธ#4 - ์Šคํƒ€๋ฒ…์Šค ## ๊ฐœ๋ฐœ์ž |Name|Camper Number| |:-:|:-:| |๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ๊น€ํƒœํ›ˆ|S014| |๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ์ด๋‚˜์ •|S036| <br> ## ๊ฐœ๋ฐœ์ผ์ • <details> <summary> 1๏ธโƒฃ 2021.10.11</summary> - ์ดˆ๊ธฐ ์ด๋ฒคํŠธ ํ™”๋ฉด - ```UI``` : ๊ธฐ๋ณธ ์ด๋ฏธ์ง€, label, button ์ถ”๊ฐ€ - ```Model + ViewModel``` : ์ดˆ๊ธฐ ์ด๋ฒคํŠธ ํ™”๋ฉด ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ - ```๋„คํŠธ์›Œํฌ``` <span style="color:orange">[๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปPair Programming๐Ÿง‘๐Ÿปโ€๐Ÿ’ป]</span> - ๊ณตํ†ต ๋„คํŠธ์›Œํฌ ํด๋ž˜์Šค ์ž‘์„ฑ - ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ (์บ์‹œ ์ฒ˜๋ฆฌ) - ```๊ธฐํƒ€``` <span style="color:orange">[๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๐Ÿง‘๐Ÿปโ€๐Ÿ’ป]</span> : ๋‹ค์‹œ๋ณด์ง€ ์•Š๊ธฐ(Date ์‚ฌ์šฉ), ๋‹ซ๊ธฐ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ๊ตฌํ˜„ - ํ™ˆ ํ™”๋ฉด - ```UI``` : Tabbar, Collection view(๊ธฐ๋ณธ์ ์ธ ํ‹€ ๊ตฌ์„ฑ) - ```View(custom cell)``` <span style="color:orange">[๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๐Ÿง‘๐Ÿปโ€๐Ÿ’ป]</span> : ์ถ”์ฒœ/์ธ๊ธฐ ๋ฉ”๋‰ด Cell(RoundImageCell), ๋ฉ”์ธ ์ด๋ฒคํŠธ Cell(MainEventImageCell), ์ด๋ฒคํŠธ Cell(EventImageCell) </details> <details> <summary> 2๏ธโƒฃ 2021.10.12</summary> - ํ™ˆํ™”๋ฉด - ```UI``` : Collection View(4 section ๊ตฌํ˜„) - ```View Model+Model``` - Home ๊ณผ ๊ด€๋ จ๋œ ๋„คํŠธ์›Œํ‚น ๋กœ์ง - Home ๋ฐ์ดํ„ฐ Decode ํ•˜๋Š” Model ์ƒ์„ฑ - ```View``` - Delegate, DataSource ์ฒ˜๋ฆฌ - Compositional layout ๋ฐ˜์‘ํ˜• (๋ฉ”์ธ ์ด๋ฒคํŠธ) - ```๊ธฐํƒ€``` : ~~Storyboard reference ์‚ฌ์šฉ~~ <span style="color:orange">[๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๐Ÿง‘๐Ÿปโ€๐Ÿ’ป]</span> </details> <details> <summary> 3๏ธโƒฃ 2021.10.13</summary> - What's new ํ™”๋ฉด - ```View Model+Model``` : What's new ํ™”๋ฉด์— ํ•„์š”ํ•œ model, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„ <span style="color:orange">[๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๐Ÿง‘๐Ÿปโ€๐Ÿ’ป]</span> - ```View``` : Collcetion View, DataSource, Dalegate ์ฒ˜๋ฆฌ - Order ํ™”๋ฉด - ```View``` : - Collection View (์ƒ๋‹จ Header ๊ณ ์ •) - ```View Model+Model``` : Order ํ™”๋ฉด์— ํ•„์š”ํ•œ model, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„ - View ์™€ ๋ชจ๋ธ, ๋กœ์ง ํ•ฉ์น˜๊ธฐ <span style="color:orange">[๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๐Ÿง‘๐Ÿปโ€๐Ÿ’ป]</span> </details> <details> <summary> 4๏ธโƒฃ 2021.10.14</summary> - ์ œํ’ˆ์ƒ์„ธํ™”๋ฉด - ```View``` - ํ™”๋ฉด ๊ตฌ์„ฑ + Scroll View๋กœ ๊ธฐ๋ณธ์ ์ธ UI ์™„์„ฑ - Scroll View์— ๋“ค์–ด๊ฐ€๋Š” view ๊ตฌ์„ฑ์š”์†Œ๋“ค์„ custom view๋กœ ๋งŒ๋“ค๊ธฐ - navigation bar ํšจ๊ณผ & ์ด๋ฏธ์ง€ ๋ฐ˜์‘ํ˜• - ```ViewModel+Model``` : ๊ด€๋ จ๋œ model ์ฒ˜๋ฆฌ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌํ•˜๋Š” view model ์ƒ์„ฑ - Code refactoring - View Model unitTest ๋งŒ๋“ค๊ธฐ </details> <details> <summary> 5๏ธโƒฃ 2021.10.18</summary> - Code Data - ์˜๊ตฌ ์ €์žฅ์†Œ ๊ด€๋ฆฌ ๊ฐ์ฒด - Core Data Table ์ƒ์„ฑ - CURD ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” method ๊ตฌํ˜„ - repository layer๋ฅผ ํ†ตํ•ด ์˜๊ตฌ ์ €์žฅ์†Œ ๊ด€๋ฆฌ๋ฅผ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•จ - ์ œํ’ˆ ์ƒ์„ธํ™”๋ฉด - ํ•˜ํŠธ ๋ฒ„ํŠผ์— ๋Œ€ํ•œ ์˜๊ตฌ์ €์žฅ์†Œ ๊ฐ์ฒด ์—ฐ๋™, ์‚ญ์ œ ๊ตฌํ˜„ - ๋‚˜๋งŒ์˜ ๋ฉ”๋‰ด - Collection View Cell(FavorCell) - View Model + Use Case + Model - ๊ด€๋ จ๋œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„ - ์˜๊ตฌ ์ €์žฅ์†Œ ๊ตฌํ˜„ - ๊ตฌ์กฐ์ ์ธ ๊ฐœ์„  - View - View Model - Use case - Layer(Network or persistent)์˜ ์ˆœ์„œ์— ์ค€ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž… </details> <details> <summary> 6๏ธโƒฃ 2021.10.19</summary> - Code Data - ์˜๊ตฌ ์ €์žฅ์†Œ ๊ด€๋ฆฌ ๊ฐ์ฒด - ๊ธฐ์กด์˜ ๊ด€๋ฆฌ ๊ฐ์ฒด์—์„œ entity์˜ ๋ชจ๋“  ์ €์žฅ๋œ ๊ฐ’๋“ค์„ ์‚ญ์ œํ•˜๋Š” `deleteAll` ๋งค์„œ๋“œ ์ถ”๊ฐ€ - View - Pay ํ™”๋ฉด ๊ตฌํ˜„ ๋ฐ Layout ๊ตฌ์„ฑ - Timer ์‚ฌ์šฉ ๋ฐ ๋ฐ”์ฝ”๋“œ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ ๊ตฌํ˜„ - view model + usecase - pay ํ™”๋ฉด์— ํ•„์š”ํ•œ view model ๊ตฌํ˜„ - ์˜๊ตฌ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ usecase ๊ตฌํ˜„ - Create ML - ๊ฐ ๊ถŒ ์ง€ํ(1000, 5000, 10000, 50000)์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•œ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜๊ฐ€ ์ž˜ ๋˜๋Š”์ง€ ์‹คํ—˜ - 5000๊ณผ 50000๊ฐ„ ๊ตฌ๋ณ„์ด ์ž˜ ๋˜์ง€ ์•Š์Œ data set์ด ์ ์–ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ด๋ผ๊ณ  ์ถ”์ธก </details> <details> <summary> 7๏ธโƒฃ 2021.10.20</summary> - Pay ํ™”๋ฉด - ๊ธˆ์•ก ์ ๋ฆฝ์‹œ, ๋ณ„ ์Œ“์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ถ”๊ฐ€ - AVFoundation์„ ํ™œ์šฉํ•œ image classification์„ ์ ์šฉ - ์ง€ํ ์ข…๋ฅ˜์— ๋”ฐ๋ผ core data์— ์ €์žฅ - ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง - View Model unitTest - ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘ ์ˆ˜์ • - collection view data source ๋ถ€๋ถ„ ์ˆ˜์ • - view ๋ถ€๋ถ„ ์ˆ˜์ • - navigation bar ๋ถ€๋ถ„ ์ˆ˜์ • - ์—๋Ÿฌ ๋‚˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์ •(Order ํ™”๋ฉด) </details> <details> <summary> 8๏ธโƒฃ 2021.10.21</summary> - ์ถฉ๋Œ ๋‚œ ๋ถ€๋ถ„์„ ์žฌ์ˆ˜์ • </details> <br> ## ์™„์„ฑ ๊ฒฐ๊ณผ |๋Ÿฐ์น˜ ์Šคํฌ๋ฆฐ|์ดˆ๊ธฐ์ด๋ฒคํŠธ ํ™”๋ฉด UI|๋‹ค์‹œ๋ณด์ง€ ์•Š๊ธฐ ๊ธฐ๋Šฅ| |:-:|:-:|:-:| |<img src="https://i.imgur.com/WQOV6t8.png" width=200>|<img src="https://i.imgur.com/5ULOaiE.png" width=200>|<img src="https://i.imgur.com/u8TxJUT.gif" width=200>| |Tab bar|ํ™ˆ ํ™”๋ฉด UI|What's New| |<img src="https://i.imgur.com/DBtelD9.gif" width=200>|<img src="https://i.imgur.com/ZGKd2kk.gif" width=200>|<img src="https://i.imgur.com/ke7rdHH.gif" width=200>| |Orderํ™”๋ฉด|์ œํ’ˆ์ƒ์„ธํ™”๋ฉด|์ฃผ๋ฌธํ•˜๊ธฐ ๊ธฐ๋Šฅ| |<img src="https://i.imgur.com/EyVkNSq.gif" width=200>|<img src="https://i.imgur.com/5PxRsBa.gif" width=200>|<img src="https://i.imgur.com/D5zqEvT.gif" width=200>| |๋‚˜๋งŒ์˜ ๋ฉ”๋‰ด ๋“ฑ๋ก|๋‚˜๋งŒ์˜ ๋ฉ”๋‰ด ํ•˜ํŠธ/์ฃผ๋ฌธ ๊ธฐ๋Šฅ|Payํ™”๋ฉด(10,000์›)| |<img src="https://i.imgur.com/NVlgpME.gif" width=200>|<img src="https://i.imgur.com/2vRXnfj.gif" width=200>|<img src="https://i.imgur.com/yVy4viB.gif" width=200>| ## PR ๋ฉ”์„ธ์ง€ |Day|Link| |-|-| |1์ฃผ์ฐจ ํ™”์š”์ผ|[์ดˆ๊ธฐ ์ด๋ฒคํŠธ ํ™”๋ฉด & ํ™ˆ ํ™”๋ฉด](https://github.com/boostcampwm-2021/swift-p4-starbuckst/pull/55)| |1์ฃผ์ฐจ ๋ชฉ์š”์ผ|[What's new, Order, ์ œํ’ˆ ์ƒ์„ธ ํ™”๋ฉด ](https://github.com/boostcampwm-2021/swift-p4-starbuckst/pull/94)| |2์ฃผ์ฐจ ํ™”์š”์ผ|[์ฝ”๋“œ ๋ฆฌํŽ™ํ† ๋ง + Core Data + ๋‚˜๋งŒ์˜ ๋ฉ”๋‰ด + ์ƒ์„ธ ์ฃผ๋ฌธ ํ™”๋ฉด + Create ML](https://github.com/boostcampwm-2021/swift-p4-starbuckst/pull/153)| |2์ฃผ์ฐจ ๋ชฉ์š”์ผ|[Pay ํ™”๋ฉด + ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ + ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง](https://github.com/boostcampwm-2021/swift-p4-starbuckst/pull/169)| <br> ## ์ง ํ”„๋กœ๊ทธ๋ž˜๋ฐ ### ๐Ÿ‘‰ ์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Alamofire : ๋„คํฌ์›Œํฌ ํ†ต์‹ ์„ ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์  - SnapKit : Constraint ๋ฅผ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์  - (KingFisher : ์ด๋ฏธ์ง€ ์บ์‹œ์ฒ˜๋ฆฌ) <br> ### ๐Ÿ‘‰ ์ฝ”๋“œ ์ปจ๋ฒค์…˜ 1. Model์€ ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ ๋‚˜๋ˆ„๋Š”๊ฒŒ ๊ธฐ์ค€์ด๋‹ค. 2. UI์— ๊ณตํ†ต์œผ๋กœ ์—ฌ๋Ÿฌ๊ณณ์— ๋“ค์–ด๊ฐ€๋Š” ๋กœ์ง ๋ถ€๋ถ„์€ ๋”ฐ๋กœ extension์œผ๋กœ ๊ด€๋ฆฌํ•ด์„œ ํ•œ ๊ณณ์— ์ง‘์ค‘์‹œํ‚จ๋‹ค. 3. ๋„คํŠธ์›Œํฌ ๋ถ€๋ถ„์€ ํ•˜๋‚˜์˜ layer๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๋‚˜๋ˆˆ๋‹ค(๋„คํŠธ์›Œํฌ ํ†ต์‹  - ๋ฐ์ดํ„ฐ decode - model)(์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•จ) 4. ๋งค์„œ๋“œ๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ๋งŒ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•œ๋‹ค(ex: ํ•˜๋‚˜์˜ UILabel์— text๋ฅผ ์„œ๋กœ๋‹ค๋ฅด๊ฒŒ ์†์„ฑ์„ ์ •์˜ํ•  ๊ฒฝ์šฐ text๋ฅผ ๋งŒ๋“œ๋Š” ๋งค์„œ๋“œ ๋”ฐ๋กœ ๋„ฃ๋Š” ๋งค์„œ๋“œ ๋”ฐ๋กœํ•ด์„œ ์กฐํ•ฉํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.) 5. struct, classs ์ค‘ ๊ณ ๋ฏผ์ด ๋ ๊ฒฝ์šฐ ์šฐ์„  struct๋กœ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•œ๋‹ค. 6. protocol์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•ด์„œ ๊ฐ์ฒด๊ฐ„ ์„œ๋กœ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๊ฐ€ ์œ ์ง€ ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค(๋‹จ, presenter๋ฅผ ํ™œ์šฉํ•  ๊ฒฝ์šฐ๋Š” ๊ฐ์ฒด๋ฅผ ์†Œ์œ ํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค) 7. extension์€ ํ•˜๋‚˜์˜ protocol ๊ธฐ์ค€, ๋˜๋Š” supperclass ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค. 8. view๋Š” ์ตœ๋Œ€ํ•œ custom View๋กœ ๋‚˜๋ˆ„์–ด์„œ storyboard์—์„œ ๋‹ค ์ž‘์—…ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ•œ๋‹ค. 9. test code๋Š” model์— ๋Œ€ํ•œ ์ •์˜๊ฐ€ ๋‚ด๋ ค์ง€๋ฉด ๋ฐ”๋กœ๋ฐ”๋กœ ์ •์˜ํ•œ๋‹ค. 10. compositional layout ์„ ํ†ตํ•ด UI ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. 11. ๋„คํŠธ์›Œํฌ๋Š” ํ•˜๋‚˜์˜ framework๋กœ ๊ณตํ†ต์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. 12. usecase(view model), presenster ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•œ๋‹ค. <br> ### ๐Ÿ‘‰ ์ฐธ๊ณ ํ•œ ๋งํฌ - [Kingfisher Cheat Sheet](https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet#cache) - [Swift5์˜ Result Type ์‚ฌ์šฉํ•˜๊ธฐ](https://eunjin3786.tistory.com/47) - [๊นƒ๋ชจ์ง€๋ฅผ ์ปค๋ฉ˜๋“œ๋ผ์ธ์—์„œ ๋ฐ”๋กœ ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋ณด์ž๐ŸŽ‰](https://tngusmiso.tistory.com/57) - [Clean Architecture With MVVM on iOS(using SwiftUI, Combine, SPM)](https://tigi44.github.io/ios/iOS,-Swift-Clean-Architecture-with-MVVM-DesignPattern-on-iOS/) - [ iOS Clean Architecture + MVVM ๊ฐœ๋…๊ณผ ์˜ˆ์ œ](https://eunjin3786.tistory.com/207) - [iOS ์‚ฌ์šฉ์„ฑ ์ตœ๋Œ€๋กœ ์˜ฌ๋ ค๋ณด์ž! UICollectionView Custom Layout](https://hucet.tistory.com/23) - [๋กœ์ปฌ ํ‘ธ์‰ฌ ์•Œ๋ฆผ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• (Local Notification)](https://onelife2live.tistory.com/33) - [Swift: Confetti Animation Effect](https://www.youtube.com/watch?v=YosPD7eFvcE) - [CoreML: Real Time Camera Object Detection with Machine Learning ](https://www.youtube.com/watch?v=p6GA8ODlnX0) - [Unit testing asynchronous Swift code](https://www.swiftbysundell.com/articles/unit-testing-asynchronous-swift-code/)