# ๐Ÿ›’ ์˜คํ”ˆ ๋งˆ์ผ“ ## ๋ชฉ์ฐจ * [Project Storage](#-project-storage) * [Team](#-team) * [Run screen](#-run-screen) * [Development Environment and Library](#-development-environment-and-library) * [Timeline](#-timeline) * [week1](#week-1) * [week2](#week-2) * [week3](#week-3) * [week4](#week-4) * [Project Contents](#project-contents) * [Core Feature Experience](#-core-feature-experience) * [TroubleShooting](#-troubleshooting) * [Reference page](#reference-page) ## ๐Ÿ’พ Project Storage >**ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„** : 2022-07-11 ~ 2022-08-05<br> **์†Œ๊ฐœ** : ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ†ตํ•ด ์ƒํ’ˆ API๋ฅผ ๊ฐ€์ ธ์™€ ๋ฌผ๊ฑด์„ ๋งค๋งคํ•˜๋Š” ์•ฑ์ž…๋‹ˆ๋‹ค. <br> **๋ฆฌ๋ทฐ์–ด** : [**๋ผ์ด์–ธ**](https://github.com/ryan-son) ## ๐Ÿ‘ฅ Team | [ํ˜„์ด](https://github.com/seohyeon2) | [์–ธ์ฒด์ธ](https://github.com/unchain123) | |:---:|:---:| |<img src = "https://i.imgur.com/0UjNUFH.jpg" width="250" height="250">|<img src = "https://i.imgur.com/GlPnCo7.png" width="250" height="250">| --- ## ๐Ÿ“บ Run screen ### Home screen | ListCollectionView | GridCollectionView | |:---:|:---:| |<img src = https://i.imgur.com/SBqTBAk.gif width=200 height=400>|<img src = https://i.imgur.com/op5su98.gif width=200 height=400>| ### Product registration screen | ์ƒํ’ˆ ๋“ฑ๋ก ๊ณผ์ • | ์ƒํ’ˆ ๋“ฑ๋ก ์„ฑ๊ณต | ์ƒํ’ˆ ๋“ฑ๋ก ์‹คํŒจ | |:---:|:---:|:---:| |<img src = https://i.imgur.com/YjuWno2.gif width=200 height=400>|<img src = https://i.imgur.com/XVGljW8.png width=200 height=400>|<img src = https://i.imgur.com/1tiOGeA.png width=200 height=400>| ## ๐Ÿ›  Development Environment and Library [![swift](https://img.shields.io/badge/swift-5.6-orange)]() [![xcode](https://img.shields.io/badge/Xcode-13.4.1-blue)]() [![swiftLint](https://img.shields.io/badge/SwiftLint-13.2-green)]() --- ## ๐Ÿ•– Timeline ### Week 1 - **2022-07-11 (์›”)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP1: URLSession์— ๋Œ€ํ•ด์„œ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๋ถ€ - **2022-07-12 (ํ™”)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP1: STEP1 PR - **2022-07-13 (์ˆ˜)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP1: URLSession์— ๋Œ€ํ•ด ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๊ณ  CollectionView ๊ณต๋ถ€ - **2022-07-14 (๋ชฉ)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP1: ๋ฆฌํŒฉํ† ๋ง - **2022-07-15 (๊ธˆ)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP1: Readme.md ์ž‘์„ฑ ๋ฐ ๋ฆฌํŒฉํ† ๋ง ### Week 2 - **2022-07-18 (์›”)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP2: ๋ฆฌํŒฉํ† ๋ง - **2022-07-19 (ํ™”)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP1: CollectionView ๊ณต๋ถ€ - **2022-07-20 (์ˆ˜)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP2: List Collection View, Segmented Control ๊ตฌํ˜„ - **2022-07-21 (๋ชฉ)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP2: ์˜คํ† ๋ ˆ์ด์•„์›ƒ ๋ฐ Grid ๊ตฌํ˜„ - **2022-07-22 (๊ธˆ)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP2: Readme.md ์ž‘์„ฑ ๋ฐ STEP2 PR ### Week 3 - **2022-07-25 (์›”)** - ์˜คํ”ˆ๋งˆ์ผ“ II STEP1: multipart/form-data ๊ตฌ์กฐ ๊ณต๋ถ€ ๋ฐ ์˜ˆ์ œ ์ฝ”๋“œ ์ž‘์„ฑ - **2022-07-26 (ํ™”)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP1: ๋ฆฌํŒฉํ† ๋ง - **2022-07-27 (์ˆ˜)** - ์˜คํ”ˆ๋งˆ์ผ“ I STEP2: ๋ฆฌํŒฉํ† ๋ง - **2022-07-28 (๋ชฉ)** - ์˜คํ”ˆ๋งˆ์ผ“ II STEP1: http๋ฉ”์„œ๋“œ ๊ณต๋ถ€๋ฐ POST ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ - **2022-07-29 (๊ธˆ)** - ์˜คํ”ˆ๋งˆ์ผ“ II STEP1: POST ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๋ฐ ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„ ### Week 4 - **2022-08-01 (์›”)** - ์˜คํ”ˆ๋งˆ์ผ“ II STEP1: RegistrationViewController UI ๊ตฌํ˜„ - **2022-08-02 (ํ™”)** - ์˜คํ”ˆ๋งˆ์ผ“ II STEP1: POST ๋ฉ”์„œ๋“œ ์ˆ˜์ • ๋ฐ ํ‚ค๋ณด๋“œ ๊ตฌํ˜„ - **2022-08-03 (์ˆ˜)** - ์˜คํ”ˆ๋งˆ์ผ“ II STEP2: STEP2์— ํ•„์š”ํ•œ ๊ฐœ๋… ๊ณต๋ถ€ - **2022-08-04 (๋ชฉ)** - ์˜คํ”ˆ๋งˆ์ผ“ II STEP1: ๋ฆฌํŒฉํ† ๋ง - **2022-08-05 (๊ธˆ)** - ์˜คํ”ˆ๋งˆ์ผ“ II STEP1: ๋ฆฌํŒฉํ† ๋ง - ์˜คํ”ˆ๋งˆ์ผ“ II STEP2: RegistrationViewController UI ๋ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ --- ## โœ๏ธ Project Contents ### ๐Ÿ’ป Core Feature Experience - [x] UIAlertController ์•ก์…˜์˜ completion handler ํ™œ์šฉ - [x] UIAlertController์˜ textFields ํ™œ์šฉ - [x] UICollectionView ๋ฅผ ํ†ตํ•œ ์ขŒ์šฐ ์Šคํฌ๋กค ๊ธฐ๋Šฅ ๊ตฌํ˜„ --- ### ๐Ÿ€ TroubleShooting #### 1. Application Test VS Library Test - ApplicationTest์™€ LibraryTest์˜ ์ฐจ์ด๋Š” ๊ทน๋ช…ํ•˜๋‹ค. - ApplicationTest๋Š” iOS์•ฑ๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์„ ๊ฒ€์‚ฌํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. - LibraryTest๋Š” ์•ฑ๊ณผ ์ƒ๊ด€์—†๋Š” ๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. - ํ˜ธ์ŠคํŠธ ์•ฑ์„ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์— ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋” ๋น ๋ฅด๊ณ  ์ด๋”ฐ๊ธˆ์”ฉ ๋™์ž‘์ด ๋ถˆ์•ˆ์ •ํ•œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์˜ํ–ฅ์„ ๋œ๋ฐ›๋Š”๋‹ค. - ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ์กด์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ์™€ LivraryTest๋กœ ๋ฐ”๊ฟ”์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ ํ…Œ์ŠคํŠธ๋‹น ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๊ฑฐ์˜ 10๋ฐฐ์— ๊ฐ€๊นŒ์šด ์œ ์˜๋ฏธํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. |Application Test ๊ฑธ๋ฆฐ์‹œ๊ฐ„|Library Test ๊ฑธ๋ฆฐ์‹œ๊ฐ„| |--|--| |<img src = https://i.imgur.com/onFx9QR.png width = 300 height = 100> |<img src = https://i.imgur.com/OZAEbUi.png width = 700 height = 100>| #### 2. URLSession Unit Test - ๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ ์‹œ, ์‚ฌ์ง„๊ณผ ๊ฐ™์ด XCTAssert ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ์กฐ์ฐจ ๋˜์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜ ๋ฒ„๋ฆฐ๋‹ค. - `expectation(description:), fulfill(), wait(for:timeout:` ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์˜€๋”๋‹ˆ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋˜์–ด, ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ![](https://i.imgur.com/YaxLbBg.png) #### 3. ๋„คํŠธ์›Œํฌ ๋งตํ•‘๋ชจ๋ธ ํŠธ๋Ÿฌ๋ธ” - ๋„คํŠธ์›Œํฌ์—์„œ ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€๋Š” 137์ด์—ˆ๋Š”๋ฐ 72๋ฒˆ ํŽ˜์ด์ง€์—์„œ ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ํƒˆ์ถœํ•˜๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. - LLDB๋ฅผ ์ด์šฉํ•ด ํ•จ์ˆ˜์˜ ๋ถ„๊ธฐ๋งˆ๋‹ค ํ™•์ธ์„ ํ–ˆ์„ ๋•Œ 72๋ฒˆ์งธ ํŽ˜์ด์ง€๋ฅผ ๋””์ฝ”๋”ฉ ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋งตํ•‘์— ์‹คํŒจํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํƒˆ์ถœํ•จ. - ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ํ‚ค๊ฐ’(price, bargainPrice, discountedPrice)์ด Double๊ฐ’์ด ์•„๋‹ˆ๋ผ Int๋กœ ๋ชจ๋ธ์„ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Double๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” 72๋ฒˆ์งธ ํŽ˜์ด์ง€์—์„œ๋Š” ๋งตํ•‘์„ ์‹คํŒจ ํ–ˆ๋˜ ๊ฒƒ์ด์—ˆ๋‹ค. - ๋ฌธ์ œ๊ฐ€ ์žˆ๋˜ ํ‚ค๊ฐ’์˜ ํƒ€์ž…์„ Double๋กœ ๋ฐ”๊ฟ”์„œ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. - ๋งˆ์ผ“์˜ ์ƒํ’ˆ๊ฐ€๊ฒฉ๋“ค์ด ํ•œํ™”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ USD๋“ฑ ์™ธํ™”๋„ ํฌํ•จ์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Int๋กœ ํ•˜๋Š” ๊ฒƒ์€ ์ œ๋Œ€๋กœ๋œ ๋ชจ๋ธ๋ง์ด ์•„๋‹ˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์‚ฌ์†Œํ•œ ๋ถ€๋ถ„๋„ ์ž˜ ํ™•์ธํ•ด์„œ ์ด๋Ÿฐ ์‹ค์ˆ˜๋ฅผ ํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ๊ฒ ๋‹ค. | ๋„คํŠธ์›Œํฌ ๋งตํ•‘๋ชจ๋ธ | ์„œ๋ฒ„ ์ •๋ณด | ํŠธ๋Ÿฌ๋ธ” ๊ฒฐ๊ณผ | |:--:|:--:|:--:| |<img src = https://i.imgur.com/x9fe0O9.png width = 180 height = 60> |<img src = https://i.imgur.com/3BQxRVi.png width = 500 height = 200>|<img src = https://i.imgur.com/MoPV79O.png width = 800 height = 200>| #### 4. ๋ฆฌ์ŠคํŠธ ํ˜•์‹์˜ collectionview์—์„œ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง€๋˜ ํ˜„์ƒ - ์ฒ˜์Œ UICollectionView์˜ Listํ˜•์‹๋ ˆ์ด์•„์›ƒ์„ ์žก์„ ๋Œ€ ์•„๋ž˜์™€ ๊ฐ™์ด apperance๋ฅผ ์„ค์ •ํ•ด ์คฌ๋‹ค. ```swift let config = UICollectionLayoutListConfiguration(appearance: .plain) //์ฒ˜์Œ์„ค์ • imageStackView.widthAnchor.constraint(lessThanOrEqualToConstant: 80), imageStackView.heightAnchor.constraint(lessThanOrEqualToConstant: 80) //๋ณ€๊ฒฝํ•ด๋ณธ์„ค์ • imageStackView.widthAnchor.constraint(equalToConstant: 80), imageStackView.heightAnchor.constraint(equalToConstant: 80) ``` - ๊ทธ๋žฌ๋”๋‹ˆ ์ฒ˜์Œ์—” ์•„๋ž˜์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์‚ฌ์ง„์ด ์ž‘๊ฒŒ ํ‘œํ˜„๋˜๋Š” ์…€๋“ค์ด ์žˆ์—ˆ๊ณ  ์ด ์›์ธ์ด lessThanOrEqual์ด๋ผ๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์•„์ € ๋ฒ„๋ฆฌ๋Š”๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ equalToConstant๋กœ ๋ณ€๊ฒฝ์„ ํ–ˆ๋”๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™์ด Autolayout์—์„œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. | ์ถฉ๋Œ ์›์ธ | |:--:| |<img src = https://i.imgur.com/LwSy5Os.png width = 600 height = 150>| | ์ถฉ๋Œ ํ™”๋ฉด | |<img src = https://i.imgur.com/rfAzEsn.png width = 250 height = 500>| - ์šฐ๋ฆฌ๊ฐ€ ํ™•์ธํ•œ ์ถฉ๋Œ ์›์ธ์€ `UICollectionLayoutListConfiguration(appearance: .plain)`์ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋†’์ด๋ฅผ 44๋กœ ์„ค์ •ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ•ด์ค€ heightAncor = 80 ๊ณผ๋Š” ์ถฉ๋Œ์„ ์ผ์œผ์ผฐ๊ณ  ๋‘ ๊ฐ’์ค‘์— ์–ด๋–ค ๊ฐ’์ด ๋งž๋Š”์ง€ ํŒ๋‹จํ•˜์ง€ ๋ชปํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‘ ๊ฐ’์„ ๋ฌด์ž‘์œ„๋กœ ๋‚ด๋ณด๋‚ด๊ณ  ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. - ์ฒ˜์Œ์œผ๋กœ ์ƒ๊ฐํ–ˆ๋˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ์— Priority๋ฅผ ๋†’์—ฌ์„œ ์…€์˜ ํฌ๊ธฐ๊ฐ€ ์•„๋‹Œ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ˜์˜ํ•˜๋„๋ก ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ด์—ˆ๋Š”๋ฐ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋‹ˆ ์ด๋ฏธ์ง€๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ ˆ์ด๋ธ”๋“ค์€ ๋ฐ€๋ ค๋‚˜๋ฒ„๋ฆฌ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋Œ€์•ˆ์„ ์ฐพ๊ฒŒ ๋˜์—ˆ๋‹ค - ์ตœ์ข…์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ๋ฐฉ๋ฒ•์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’์ด ์ง€์ •๋˜์–ด์žˆ๋Š” `UICollectionViewCompositionalLayout.list`๊ฐ€ ์•„๋‹Œ `UICollectionViewCompositionalLayout(section: )`์œผ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์ง์ ‘ collectionView์˜ item,group,section์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ง€์ •ํ•ด ์ฃผ๋Š” ๋ฐฉ๋ฒ• ์ด์—ˆ๋‹ค. #### 5.snapshot apply ์‹œ์  ์˜ค๋ฅ˜ - ๊ธฐ์กด `snapshot`์˜ `apply` ์ ์šฉ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์‹œ์ (`getProductList`ํ˜ธ์ถœ ์‹œ)์—๋งŒ ์ง„ํ–‰๋˜์—ˆ๋‹ค. ๊ทธ๋žฌ๋”๋‹ˆ `getProductList` ๋ฉ”์„œ๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์‹œ๊ฐ„ ๋™์•ˆ์—๋Š” `segmentedControl`๋กœ layout ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ ํ›„๋กœ๋Š” layout์„ ๋ณ€๊ฒฝํ•ด ์ฃผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด layout ์ž์ฒด๊ฐ€ ๋‚ ์•„๊ฐ€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. | ์˜ค๋ฅ˜ํ™”๋ฉด | |:--:| |<img src = https://i.imgur.com/tt55i4h.png width = 200 height = 300>| - debug ์ฐฝ์„ ํ†ตํ•ด layout์ด ๊นจ์ง€๋Š” ์‹œ์ ๊ณผ `getProductList` ๋ฉ”์„œ๋“œ์˜ escaping closer ์ข…๋ฃŒ ์‹œ์ ๊ณผ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ›์•„ ์˜จ ํ›„์—๋„ `apply` ์ ์šฉ์„ ํ•ด์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๊ณ , `segmentedControl`์—์„œ ๋ฐ”๊ฟ€ ๋•Œ์—๋„ `apply` ์ ์šฉ์„ ํ•ด์ฃผ์—ˆ๋”๋‹ˆ layout ๊นจ์ง ํ˜„์ƒ์„ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. | ๊ธฐ์กด์˜ ์ฝ”๋“œ | ํ•ด๊ฒฐํ•œ ์ฝ”๋“œ | | :--: | :--: | |<img src = https://i.imgur.com/orryKJl.png width = 400 height = 200>|<img src = https://i.imgur.com/ZK8yfsf.png width = 400 height = 200>| #### 6. URLRequest Timeinterval Test - URLRequest์˜ Timeinterval ๊ฐ’์€ default๊ฐ’์ด 60์ดˆ์ธ๋ฐ ์ด ์‹œ๊ฐ„์„ ๋„˜์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‹ค๊ธฐ๊ธฐ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ ํ•ด ๋ณด์•˜๋‹ค. - ์‹ค๊ธฐ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ปจ๋””์…˜์œผ๋กœ ์„ค์ •์„ ํ•ด์ค€ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ ํ–ˆ๋‹ค. <img src = https://i.imgur.com/4VYU6h0.png width = 225 height = 200> - ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Timeinterval์„ 10์ดˆ๋กœ ์„ค์ •ํ•˜๊ณ  ์ง„ํ–‰ ํ•˜์˜€๊ณ  10์ดˆ๊ฐ€ ์ง€๋‚œ ๋‹ค์Œ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ•ด์ค€ ์–ผ๋Ÿฟ ๋ฉ”์„ธ์ง€๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. | ์–ผ๋Ÿฟ๋ฉ”์„ธ์ง€ | ์ดํ›„ ๋กœ๋”ฉ๋ทฐ| | :--: | :--: | |<img src = https://i.imgur.com/YLyBtW9.png width = 200 height = 400>|<img src = https://i.imgur.com/2STJ1Ms.png width = 200 height = 400>| ### 7. remove Observer - ์ƒํ’ˆ๋“ฑ๋ก ํ™”๋ฉด์—์„œ ํ‚ค๋ณด๋“œ์˜ ์ž…๋ ฅ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด NotificationCenter๋ฅผ ์‚ฌ์šฉํ•ด Observer๋ฅผ ์ถ”๊ฐ€ํ•œ ๋’ค ๋‹ค์‹œ remove Observer๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  removeOBserver๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ ํ–ˆ์—ˆ๋Š”๋ฐ ์ด๊ฒŒ ๊ผญ ํ•„์š”ํ• ๊นŒ์š”? ๋ผ๋Š” ๋ฆฌ๋ทฐ์–ด์˜ ๋ง์„ ๋“ฃ๊ณ  ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด์•˜๋‹ค. - ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธ€์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์šฐ๋ฆฌ์˜ ํƒ€๊ฒŸ ๋ฒ„์ „์€ 14.0์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ตฌ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ removeObserver๋ฉ”์„œ๋“œ๋ฅผ ์ง€์› ๋‹ค. <img src = https://i.imgur.com/8v6wmC5.png width = 500 height = 50> --- ### Reference page - [Implementing Modern Collection Views](https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/implementing_modern_collection_views)