# ๐Ÿ‡ฐ๐Ÿ‡ท๐Ÿ‡ซ๐Ÿ‡ท ๋งŒ๊ตญ๋ฐ•๋žŒํšŒ ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ‡ฆ๐Ÿ‡น ## ๋ชฉ์ฐจ 1. [์†Œ๊ฐœ](#-์†Œ๊ฐœ) 2. [ํŒ€์›](#-ํŒ€์›) 3. [ํƒ€์ž„๋ผ์ธ](#-ํƒ€์ž„๋ผ์ธ) 4. [UML](#-UML) 5. [์‹คํ–‰ ํ™”๋ฉด](#-์‹คํ–‰-ํ™”๋ฉด) 6. [ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…](#-ํŠธ๋Ÿฌ๋ธ”-์ŠˆํŒ…) 7. [ํ•ต์‹ฌ ๊ฒฝํ—˜](#-ํ”„๋กœ์ ํŠธ-์ˆ˜ํ–‰-์ค‘-ํ•ต์‹ฌ-๊ฒฝํ—˜) 8. [์ฐธ๊ณ  ๋งํฌ](#-์ฐธ๊ณ -๋งํฌ) ## 1. ์†Œ๊ฐœ - 1900๋…„์— ํ”„๋ž‘์Šค ํŒŒ๋ฆฌ์—์„œ ์—ด๋ฆฐ ๋งŒ๊ตญ๋ฐ•๋žŒํšŒ์— ๋Œ€ํ•œ ์†Œ๊ฐœ์™€, ํ•œ๊ตญ์˜ ์ถœํ’ˆ์ž‘์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ์•ฑ์ž…๋‹ˆ๋‹ค. <br> ## 2. ํŒ€์› |Ayaan | bella | | --- | --- | |<img src= "https://i.imgur.com/Unq1bdd.png" width ="155"/>| <img src=https://user-images.githubusercontent.com/99257965/190572701-5e51fd28-455f-4c3b-924d-0baade5011a3.png width="155" height="155" > | | [@oneStar92](https://github.com/oneStar92) | [@hyhy0429](https://github.com/hyhy0429) | <br> ## 3. ํƒ€์ž„๋ผ์ธ **[STEP-1]** - 221018 - JSON ์ดํ•ด์™€ ํ™œ์šฉ - Asset์— ์ด๋ฏธ์ง€์™€ JSON ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ํ›„, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ `ExpositionUniverselle` ํƒ€์ž…๊ณผ `ExpositionUniverselleItem` ํƒ€์ž… ์ถ”๊ฐ€ - 221019 - `ExpositionUniverselleItem` ํƒ€์ž… ์—ญํ™œ์— ๋งž๊ฒŒ ๋ฆฌํŒฉํ† ๋ง **[STEP-2]** - 221020 - Main(์ฒซ๋ฒˆ ์งธ) ํ™”๋ฉด UI ๊ตฌ์„ฑ์š”์†Œ ๊ตฌํ˜„ - MainVC ๋‚ด๋ถ€ ํ•„์š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ - `ExpositionItems` ๋‘๋ฒˆ ์งธ ํ™”๋ฉด UI ๊ตฌ์„ฑ์š”์†Œ ๊ตฌํ˜„ - `ExpositionItemsVC` ๋‚ด๋ถ€ ํ•„์š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ - `ExpositionItemDetail` ์„ธ๋ฒˆ ์งธ ํ™”๋ฉด UI ๊ตฌ์„ฑ์š”์†Œ ๊ตฌํ˜„ - 221021 - `ExpositionItemDetailVC` ๋‚ด๋ถ€ ํ•„์š” ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ - ๊ฐ ํ™”๋ฉด์— ๋งž๋Š” `NavigationBar` ์ƒํƒœ ๊ตฌํ˜„ - `NameSpace` ๊ตฌํ˜„ - `JSONProcessor` ๊ตฌํ˜„ - MainVC ๋ฐ Detail ๋‚ด๋ถ€ TextView ์ƒ์„ธ ์„ค์ • - 221025 - VC `final`, `super` ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ - `JSONProcessor`์˜ ๊ธฐ๋Šฅ๋ถ„๋ฆฌ์™€ ๋„ค์ด๋ฐ ์ˆ˜์ • - JASONParser ๋‚ด๋ถ€ fetchDataAsset ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ - ๋ถˆํ•„์š”ํ•œ extension์„ MARK ์ฃผ์„์œผ๋กœ ๋ณ€๊ฒฝ - MainVC์™€ ExpositionItemDetailVC ๋‚ด๋ถ€์˜ TextView๋ฅผ Label๋กœ ๋ณ€๊ฒฝ **[STEP-3]** - 221026 - MainView ๋‚ด๋ถ€ ์˜คํ† ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ • - `ExpositionItemCell` ๊ตฌํ˜„ - Dynamic Type์„ ์œ„ํ•œ UILabel extension ๊ตฌํ˜„ - 221027 - Main ํ™”๋ฉด ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๋Š” Label ์Šคํƒ€์ผ ๊ตฌํ˜„ - MainVC `visitorLabel`์„ ์œ„ํ•œ `DecimalNumberFormatter` ํŒŒ์ผ ์ƒ์„ฑ๊ณผ ํƒ€์ž… ๊ตฌํ˜„ - Label์˜ `Dynamic Type` ํ•ด์ œ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • - Main ํ™”๋ฉด ์„ธ๋กœ ๊ณ ์ • ๊ตฌํ˜„ - ๋ชจ๋“  VC์—์„œ override๋ฅผ ํ†ตํ•œ `supportedInterfaceOrientations` ํ”„๋กœํผํ‹ฐ ๊ตฌํ˜„ - 221028 - MVC ์—ญํ•  ๋ถ„๋ฐฐ๋ฅผ ์œ„ํ•œ `MainViewManager` ํƒ€์ž… ๊ตฌํ˜„ <br> ## 4. UML <img src="https://i.imgur.com/IFXc1gS.jpg" width="800" height="500"/> ## 5. ์‹คํ–‰ํ™”๋ฉด |์‹คํ–‰ ํ™”๋ฉด|๋‹ค์ด๋‚˜๋ฏน ํƒ€์ž…| |:---:|:---:| |<img src="https://i.imgur.com/77SkGR0.gif" width="400" height="400"/>|<img src="https://i.imgur.com/gb03T08.gif" width="200" height="400"/>| ## 6. ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… #### DTO Type์˜ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ์ œ์–ด์ž - DTO์˜ ํ”„๋กœํผํ‹ฐ์˜ ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ `private(set)`๊ณผ `let` ๋‘๊ฐ€์ง€ ์ค‘์—์„œ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. - `private(set)`์˜ ๊ฒฝ์šฐ ๋‚ด๋ถ€์—์„œ๋Š” ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‚˜ `let`์˜ ๊ฒฝ์šฐ ์ด๋‹ˆ์…œ๋ผ์ด์ง• ์ดํ›„ ๋‚ด/์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— DTO Type์˜ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ์ œ์–ด์ž๋Š” `let`์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๋” ์˜ฌ๋ฐ”๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•ด `let`์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. #### Main ํ™”๋ฉด ๊ตฌ์„ฑ์‹œ, TextView ์‚ฌ์šฉ vs label ์‚ฌ์šฉ - ์ฒซ๋ฒˆ์งธ ํ™”๋ฉด์ธ Main ํ™”๋ฉด์—์„œ, ExpositionUniverselle DTO์˜ ์žฅ๋ฌธ์˜ text์ธ description์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ UI ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ตฌ์„ฑํ•จ์— ์žˆ์–ด์„œ `TextView`์™€ `Label` ์‚ฌ์šฉ์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. `Apple HIG` ์˜ ๊ฐ ๋ฌธ์„œ์™€ [Displaying Text Content in iOS](https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/UsingTextClasses/UsingTextClasses.html)๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํฌ๊ฒŒ `label`์€ ์†Œ๋Ÿ‰์˜ text๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉฐ ํŽธ์ง‘ํ•  ์ˆ˜ ์—†๋Š” ์ ๊ณผ, `TextView` ๋Š” ๋‹ค๋Ÿ‰์˜ text๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉฐ ํŽธ์ง‘์™€ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ €ํฌ๋Š” ๋‹ค๋Ÿ‰์˜ text๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ์šฐ์„ ์ˆœ์œ„๋กœ ์ƒ๊ฐํ•˜์—ฌ `TextView` ๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€๋‹ค๊ฐ€, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ๊ณผ ๋‹ฌ๋ฆฌ `editable` ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœ ํ•  ๋•Œ์— `TextView`๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ๋˜์—ˆ๊ณ , `label`๋กœ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. #### Segue๋ฅผ ํ†ตํ•œ ํ™”๋ฉด ์ „ํ™˜์‹œ ๋ฐ์ดํ„ฐ ์ „์†ก. - Segue๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ํ•œ๊ตญ์˜ ์ถœํ’ˆ์ž‘์„ ๋ณด์—ฌ์ฃผ๋Š” TableView์˜ Cell์„ ํด๋ฆญํ•˜๋ฉด, ํด๋ฆญ๋œ Cell์˜ ํ•ด๋‹นํ•˜๋Š” ์ถœํ’ˆ์ž‘์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” View๋กœ ํ™”๋ฉด์ „ํ™˜์ด ๋˜๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. `prepare()`๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ• ๋•Œ, `sender`๋กœ ์ „๋‹ฌ๋˜๋Š” ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ cell์—๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” View์— ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. - TableView Delegate์˜ ๋ฉ”์„œ๋“œ์ธ `tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)`๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋ณด๊ณ ์‹ถ์€ Cell์„ ์„ ํƒํ•˜๋ฉด ์„ ํƒ๋œ ์…€์˜ row์— ํ•ด๋‹นํ•˜๋Š” Item์„ `performSegue`๋ฉ”์„œ๋“œ์˜ `sender`๋กœ ์ „๋‹ฌํ•ด ์ฃผ์–ด์„œ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ```swift func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.performSegue(withIdentifier: "ShowItemDetail", sender: expositionItems[indexPath.row]) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard let nextViewController: ExpositionItemDetailViewController = segue.destination as? ExpositionItemDetailViewController, let item: ExpositionUniverselleItem = sender as? ExpositionUniverselleItem else { return } nextViewController.item = item } ``` #### ๋ฉ”์ธํŽ˜์ด์ง€ ์ด๋™๋ฒ„ํŠผ |Before|After| |:---:|:---:| |<img src="https://i.imgur.com/op4N0rw.gif" width="200" height="400"/>|<img src="https://i.imgur.com/wHQ3Eqn.gif" width="200" height="400"/>| ```swift showKoreanItemListButton.titleLabel?.text = "ํ•œ๊ตญ์˜ ์ถœํ’ˆ์ž‘ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ" ``` - MainVC ๋‚ด๋ถ€์—์„œ ๋‹ค์Œ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์›ํ•˜๋Š” text๋ฅผ ๊ตฌํ˜„์„ ํ•˜์˜€์œผ๋‚˜, ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ํ›„์™€ ํ™”๋ฉด ์ด๋™ ํ›„ ๋‹ค์‹œ Main ํ™”๋ฉด์œผ๋กœ ๋˜๋Œ์•„์™”์„ ๋•Œ ์ง€์ •ํ•œ text๊ฐ€ ์•„๋‹Œ ๋ฒ„ํŠผ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์›๋ž˜์˜ text์ธ "Button" ์ด ๋ณด์—ฌ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ```swift showKoreanItemListButton.setTitle("ํ•œ๊ตญ์˜ ์ถœํ’ˆ์ž‘ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ", for: .normal) ``` - Button์˜ State๊ฐ€ `.nomal`์ผ๋•Œ์˜ Title์ด "Button"์ด์—ฌ์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŒŒ์•…ํ–ˆ์œผ๋ฉฐ, Button์˜ `titleLabel`์˜ `text`๋ฅผ ์ง์ ‘ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ `setTitle(_,for:)`๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ์˜ State์— ๋”ฐ๋ฅธ Title์„ ์ง€์ •ํ•ด์ค˜์„œ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. #### Label ์„ค์ •๊ณผ Dynamic Type - MainView์˜ Label์˜ font, textAlignment, numberOfLines, lineBreakMode ๋“ฑ์˜ Label์„ ์„ค์ •์„ ํ•  ๋•Œ, ์ฝ”๋“œ๋ฅผ ์ค‘๋ณตํ•ด์„œ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. - ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ ์ž Inheritance ๋ฐ Extention์„ ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์ค„์˜€์Šต๋‹ˆ๋‹ค. #### Main VC์˜ Label์˜ ์„œ๋กœ๋‹ค๋ฅธ Font ์ ์šฉ - `range`์˜ ๋ฒ”์œ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ• ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ๊ณ , String Type์˜ ๋ฉ”์„œ๋“œ์ธ `prefix`๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. - ๊ธฐ๋ณธ์ ์ธ Font๋ฅผ Dynamic Type์œผ๋กœ ์„ค์ •ํ•œ ํ›„, ์›ํ•˜๋Š” ๋ฒ”์œ„์˜ attributedText๋ฅผ ์ง€์ •ํ•ด์คฌ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ attributedText๊ฐ€ ์ง€์ •๋œ ๋ฒ”์œ„ ์ด์™ธ์˜ Text๋Š” Dynamic Type์ด ์•„๋‹Œ ์ฒ˜์Œ ์„ค์ •๋œ Font๋กœ ๊ณ ์ •๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. - ์ „์ฒด ๋ฒ”์œ„์˜ attributedText๋ฅผ ์ง€์ •ํ•ด ์ค€ ํ›„ ์›ํ•˜๋Š” ๋ฒ”์œ„์˜ attributedText๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ง€์ •ํ•ด ์ค˜์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. #### Title Label ์ค„๋ฐ”๊ฟˆ - Title Label์„ ์ค„๋ฐ”๊ฟˆํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ •๊ทœ์‹ ์‚ฌ์šฉ์„ ๊ณ ๋ฏผ ํ•˜์˜€์ง€๋งŒ, ๋„ˆ๋ฌด ๋ฌด๊ฑฐ์šด ๋‚ด์šฉ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜์–ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. - ๊ณ ๋ฏผ ๋์—, Title Label์˜ text์—์„œ ์ค„๋ฐ”๊ฟˆ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ถ€๋ถ„์ธ '('์˜ index๋ฅผ ๊ตฌํ•œ ํ›„, `inset(_, at:)`๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์›ํ•˜๋Š” index ๋ถ€๋ถ„์— '\n'๋ฅผ insert ํ–ˆ์Šต๋‹ˆ๋‹ค. #### ๊ฐ ํ™”๋ฉด์˜ ๊ณ ์œ  ๋ฐฉํ–ฅ ์ง€์ • - AppDelegate์—์„œ ํ™”๋ฉด ๋ฐฉํ–ฅ ๊ณ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋Š” ๊ฒƒ์„ ์•Œ์•˜์ง€๋งŒ, ์•„์ง AppDelegate์— ๋Œ€ํ•œ ๊ณต๋ถ€๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ View Controller์˜ `supportedInterfaceOrientations` ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•ด ํ™”๋ฉด ๋ฐฉํ–ฅ์„ ๊ณ ์ •ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. #### View๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด ๊ตฌํ˜„ - ๋ฆฌ๋ทฐ์–ด์™€ ํ† ์˜ํ•œ ํ›„ VC๋Š” View์— ๊ฐ€๊น๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฐ€๊ณตํ•˜๋Š” ๋“ฑ์˜ ๋กœ์ง์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. - MainVC์—์„œ ์ฒ˜๋ฆฌํ•˜๋˜ ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜๋Š” `MainViewManager`๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. #### MainViewManager์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง ๋ฐฉ๋ฒ• - `MainViewManager`๊ฐ์ฒด์— ์ €์žฅ๋˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋กœ์ง์„ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ์ฒด์— ๋งŽ์€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. - ์ €์žฅ ํ”„๋กœํผํ‹ฐ์™€ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์˜ `set`์„ ์ด์šฉํ•˜์—ฌ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์˜ ์›ํ•˜๋Š” ๋กœ์ง์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€๊ณ , ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์˜ `get`์„ ํ†ตํ•ด ์ €์žฅํ”„๋กœํผํ‹ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. <br> ## 7. ํ”„๋กœ์ ํŠธ ์ˆ˜ํ–‰ ์ค‘ ํ•ต์‹ฌ ๊ฒฝํ—˜ - JSON ์ดํ•ด์™€ ํ™œ์šฉ - ScrollVeiw์˜ ์ดํ•ด์™€ ํ™œ์šฉ - tableView์™€ Cell์˜ ์ดํ•ด์™€ ํ™œ์šฉ - ํ™”๋ฉด ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ - lldb ํ™œ์šฉ - ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ†  ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉ - Word Wrapping, Line Wrapping, Line Break ๋ฐฉ์‹์˜ ์ดํ•ด ๋ฐ ํ™œ์šฉ - Dynamic Types์„ ์ ์šฉํ•ด ํ…์ŠคํŠธ ์ ‘๊ทผ์„ฑ ํ–ฅ์ƒ <br> ## 8. ์ฐธ๊ณ  ๋งํฌ - Apple Developer - [UITableView](https://developer.apple.com/documentation/uikit/uitableview) - [Table views](https://developer.apple.com/documentation/uikit/views_and_controls/table_views) - [Filling a table with data](https://developer.apple.com/documentation/uikit/views_and_controls/table_views/filling_a_table_with_data) - [UIControl.State](https://developer.apple.com/documentation/uikit/uicontrol/state) - [Configuring the cells for your table](https://developer.apple.com/documentation/uikit/views_and_controls/table_views/configuring_the_cells_for_your_table) - [JSONDecoder](https://developer.apple.com/documentation/foundation/jsondecoder) - [Using JSON with Custom Types](https://developer.apple.com/documentation/foundation/archives_and_serialization/using_json_with_custom_types) - [Encoding and Decoding Custom Types](https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types) - [HIG - Text views](https://developer.apple.com/design/human-interface-guidelines/components/content/text-views) - [HIG - View](https://developer.apple.com/design/human-interface-guidelines/components/layout-and-organization/labels) - [Displaying Text Content in iOS](https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/UsingTextClasses/UsingTextClasses.html) - [NSAttributedString](https://developer.apple.com/documentation/foundation/nsattributedstring) - [HIG - Typography](https://developer.apple.com/design/human-interface-guidelines/foundations/typography) --- [๐Ÿ” ๋งจ ์œ„๋กœ ์ด๋™ํ•˜๊ธฐ](#๋งŒ๊ตญ๋ฐ•๋žŒํšŒ)