Skip to content

Latest commit

ย 

History

History
362 lines (285 loc) ยท 16.2 KB

README.md

File metadata and controls

362 lines (285 loc) ยท 16.2 KB

ํฌ๋ฏธ ๋งŽ๊ด€๋ถ€

๋ˆ ์“ธ ๋•Œ ๋ฌด์Šจ ์ƒ๊ฐํ•ด? ๋‚˜๋ฅผ ์œ„ํ•œ ์†Œ๋น„๊ธฐ๋ก, Pay fOr ME

์†Œ๋น„์— ์ •๋‹ต์ด ์žˆ์„๊นŒ์š”?
๋ฌด์กฐ๊ฑด ์ ˆ์•ฝํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ  ๋„˜์น˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹Œ, ๋‚˜์˜ ๊ธฐ์ค€์— ๋งŒ์กฑ์Šค๋Ÿฌ์šธ ๋•Œ ํ–‰๋ณตํ•œ ์†Œ๋น„๊ฐ€ ๋œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๋ชฉํ‘œ์— ๋”ฐ๋ฅธ ์†Œ๋น„ ๊ธฐ๋ก, ๋‚˜์˜ ์†Œ๋น„ ๊ฐ์ • ๊ธฐ๋ก, ํšŒ๊ณ , ์นœ๊ตฌ์˜ ์†Œ๋น„ ๊ณต๊ฐ, ๋งˆ์‹œ๋ฉœ๋กœ ๋ชจ์œผ๊ธฐ, ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํ†ตํ•ด
#๊ฐ์ • ๊ธฐ๋ก์„ ํ†ตํ•œ ์„ฑ์žฅ #์ฃผ๋„์ ์ธ ์†Œ๋น„ #ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ์†Œ๋น„๋ฅผ ๊ฒฝํ—˜ ํ•ด๋ณด์„ธ์š”.

30th THE SOPT APPJAM
ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ : 2022.07.02 ~ 2022.07.23


๐ŸŽ POME iOS Developers

์€์ฃผ ์ฃผํ˜„ ์œ ์ง„
@jane1choi @wngus4296 @yujindonut

๐Ÿ’ป Coding Convention

๋„ค์ด๋ฐ

Class & Struct

  • ํด๋ž˜์Šค/๊ตฌ์กฐ์ฒด ์ด๋ฆ„์€ UpperCamelCase๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜, ๋ณ€์ˆ˜, ์ƒ์ˆ˜

  • ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜์—๋Š” lowerCamelCase๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฒ„ํŠผ๋ช…์—๋Š” Btn ์•ฝ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  IBOutlet์—๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๋ช…์„ ๋’ค์— ๋ถ™์ž…๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์•ฝ์–ด ๊ทœ์น™์— ๋”ฐ๋ผ ๋„ค์ด๋ฐํ•ฉ๋‹ˆ๋‹ค.

    • ์˜ˆ์‹œ

      TV TVC CV CVC VC NVC TBC

      TableView -> TV
      TableViewCell -> TVC
      CollectionView -> CV
      CollectionView Cell -> CVC
      ViewController -> VC
      NavigationController -> NVC
      TabbarController -> TBC

    ์ข‹์€ ์˜ˆ

    @IBOutlet weak var pomeBtn: UIButton!
    @IBOutlet weak var pomeBackMainView: UIView!
    @IBOutlet weak var writeMainCV: UICollectionView!

    ๋‚˜์œ ์˜ˆ

    @IBOutlet weak var ScrollView: UIScrollView!
    @IBOutlet weak var pomeCollectionView: UICollectionView!
    @IBOutlet weak var tagCollectionView: UICollectionView!
    @IBOutlet weak var tableview: UITableView!

ํ•จ์ˆ˜ ๋„ค์ด๋ฐ

  • set โ†’ setDelegate (๊ธฐ๋Šฅ๊ด€๋ จ ํ•จ์ˆ˜)
  • configure โ†’ configureUI (UI๊ด€๋ จ ํ•จ์ˆ˜)
  • IBActionโ†’ tapDismissBtn() : ๋‹จ์ˆœ ํด๋ฆญ, presentResultVC() : ํ™”๋ฉด์ „ํ™˜ ๋ฉ”์†Œ๋“œ(push, present, pop, dismiss)

์ฃผ์„

// MARK: Properties

// MARK: IBOutlet

// MARK: IBAction

// MARK: Life Cycle

- Extension Part
// MARK: - UI

// MARK: - Custom Methods

// MARK: - @objc

// MARK: - Delegate

// MARK: - Protocol

// MARK: - Network

- ETC
/// ~ ํ•˜๋Š” ๋ฉ”์„œ๋“œ (ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ๋ฌธ์„œํ™”)

// TODO: - ์•ž์œผ๋กœ ํ•  ์ผ์„ TODO๋กœ ์ ์–ด๋‘๊ธฐ
 
๊ณต๋ฐฑ
  • ํƒญ ์‚ฌ์ด์ฆˆ๋Š” 4๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํ•œ ์ค„์˜ ์ตœ๋Œ€ ๊ธธ์ด๋Š” 80์ž๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

  • ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ตœ๋Œ€ tab depth ์ œํ•œ

    • tab์˜ ์ตœ๋Œ€ depth๋Š” 4๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ์ด์ƒ์œผ๋กœ depth๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ ์ด์ƒ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒฝ์šฐ, ํŒ€์›๋“ค๊ณผ์˜ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด„ํ˜ธ ์‚ฌ์šฉ

    • (if, while, for)๋ฌธ ๊ด„ํ˜ธ ๋’ค์— ํ•œ์นธ์„ ๋„์šฐ๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
       if (left == true) {
         // logic
       }
  • ๋„์–ด์“ฐ๊ธฐ

    let a = 5; // ์–‘์ชฝ ์‚ฌ์ด๋กœ ๋„์–ด์“ฐ๊ธฐ ํ•˜๊ธฐ
    if (a == 3) {
      // logic
    } else {
    }
    dictionary [Key: Value]

๊ธฐํƒ€ ๊ทœ์น™
  • ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋Š” private์œผ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
  • viewDidLoad() ์™€ ๊ฐ™์€ ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜๋“ค์—๋Š” function๋งŒ ์œ„์น˜์‹œํ‚ต๋‹ˆ๋‹ค.
  • ๋ถˆํ•„์š”ํ•œ self๋Š” ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ž์ฒด ํ•จ์ˆ˜์— self๋ฅผ ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.
  • extension ์„ ์‚ฌ์šฉํ•ด ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ€๋…์„ฑ์žˆ๊ฒŒ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ๋ฐฐ์น˜๋˜๋Š” ๊ฒƒ: IBOutlet, Properties, Life Cycle, IBAction
    • ์ด์™ธ์˜ ์ฝ”๋“œ๋Š” extension์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—‚ Foldering Convention

๐Ÿ’ธ POME-iOS Foldering Convention ๐Ÿ’ธ
 POME-iOS
    โ”‚
    โ”œโ”€โ”€ Global
    โ”‚   โ”œโ”€โ”€ PublicData
    โ”‚   โ”‚    โ””โ”€โ”€ AppModel
    โ”‚   โ”œโ”€โ”€ Factory
    โ”‚   โ”œโ”€โ”€ Class
    โ”‚   โ”œโ”€โ”€ Struct
    โ”‚   โ”œโ”€โ”€ Protocol
    โ”‚   โ”œโ”€โ”€ UIComponent
    โ”‚   โ”œโ”€โ”€ Extension
    โ”‚   โ”œโ”€โ”€ Font
    โ”‚   โ””โ”€โ”€ LaunchScreen.storyboard
    โ”‚       
    โ”œโ”€โ”€ Network
    โ”‚   โ”œโ”€โ”€ Bases
    โ”‚   โ”‚   โ”œโ”€โ”€ TargetType.swift
    โ”‚   โ”‚   โ””โ”€โ”€ NetworkResult.swift
    โ”‚   โ”œโ”€โ”€ APIEssentials
    โ”‚   โ”‚   โ”œโ”€โ”€ APIConstants.swift
    โ”‚   โ”‚   โ”œโ”€โ”€ NetworkConstants.swift
    โ”‚   โ”‚   โ””โ”€โ”€ GenericResponse.swift
    โ”‚   โ”œโ”€โ”€ Services
    โ”‚   โ”œโ”€โ”€ APIModels
    โ”‚   โ””โ”€โ”€ APIManagers
    โ”œโ”€โ”€ Screen
    โ”‚   โ””โ”€โ”€ Write
    โ”‚       โ”œโ”€โ”€ SB
    โ”‚       โ”œโ”€โ”€ VC
    โ”‚       โ”œโ”€โ”€ Cell
    โ”‚       โ”‚   โ”œโ”€โ”€ TVC
    โ”‚       โ”‚   โ””โ”€โ”€ CVC
    โ”‚       โ””โ”€โ”€ Xib
    โ””โ”€โ”€ Support
        โ”œโ”€โ”€ Info.plist
        โ”œโ”€โ”€ AppDelegate.swift
        โ”œโ”€โ”€ SceneDelegate.swift
        โ”œโ”€โ”€ Assets.xcassets
        โ””โ”€โ”€ Colorsets.xcassets

โœ‰๏ธ Commit Convention

[CHORE] ์ฝ”๋“œ ์ˆ˜์ •, ๋‚ด๋ถ€ ํŒŒ์ผ ์ˆ˜์ • 
[FEAT] ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ตฌํ˜„ 
[ADD] Feat ์ด์™ธ์˜ ๋ถ€์ˆ˜์ ์ธ ์ฝ”๋“œ ์ถ”๊ฐ€, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€, ์ƒˆ๋กœ์šด ํŒŒ์ผ ์ƒ์„ฑ ์‹œ, ์—์…‹ ์ถ”๊ฐ€
[HOTFIX] issue๋‚˜, QA์—์„œ ๊ธ‰ํ•œ ๋ฒ„๊ทธ ์ˆ˜์ •์— ์‚ฌ์šฉ
[FIX] ๋ฒ„๊ทธ, ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
[REMOVE] ์“ธ๋ชจ์—†๋Š” ์ฝ”๋“œ ์‚ญ์ œ 
[DOCS] README๋‚˜ WIKI ๋“ฑ์˜ ๋ฌธ์„œ ๊ฐœ์ •
[MOVE] ํ”„๋กœ์ ํŠธ ๋‚ด ํŒŒ์ผ์ด๋‚˜ ์ฝ”๋“œ์˜ ์ด๋™ 
[RENAME] ํŒŒ์ผ ์ด๋ฆ„, ๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 
[REFACTOR] ์ „๋ฉด ์ˆ˜์ •์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค 

โœจGithub Management

๐Ÿ’ธ POME-iOS Gitflow ๐Ÿ’ธ
1. Issue๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
2. ๊นƒ ์ปจ๋ฒค์…˜์— ๋งž๊ฒŒ Branch๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
3. Add - Commit - Push - Pull Request ์˜ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
4. Pull Request๊ฐ€ ์ž‘์„ฑ๋˜๋ฉด ์ž‘์„ฑ์ž ์ด์™ธ์˜ ๋‹ค๋ฅธ ํŒ€์›์ด Code Review๋ฅผ ํ•œ๋‹ค.
5. Code Review๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด Pull Request ์ž‘์„ฑ์ž๊ฐ€ develop Branch๋กœ merge ํ•œ๋‹ค.
6. merge๋œ Branch๋Š” ์‚ญ์ œํ•œ๋‹ค.
7. ์ข…๋ฃŒ๋œ Issue์™€ Pull Request์˜ Label๊ณผ Project๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

๐ŸŒด ๋ธŒ๋žœ์น˜


๐Ÿ“Œ ๋ธŒ๋žœ์น˜ ๋‹จ์œ„

  • ๋ธŒ๋žœ์น˜ ๋‹จ์œ„ = ์ด์Šˆ ๋‹จ์œ„ = PR๋‹จ์œ„

๐Ÿ“Œ ๋ธŒ๋žœ์น˜๋ช…

  • ๋ธŒ๋žœ์น˜๋Š” ๋ทฐ ๋‹จ์œ„๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋žœ์น˜ ๊ทœ์น™ โ†’ feature/#์ด์Šˆ๋ฒˆํ˜ธ-(UI/Func)-ํƒญ-๊ธฐ๋Šฅ๊ฐ„๋žต์„ค๋ช…
  • ex) feature/#1-UI-home-navibar
  • ํƒญ์ด๋ฆ„ - Write, Remind, Mate, Mypage
  • ๊ณตํ†ต์ ์ธ ๊ฒƒ ์ž‘์—… - Global
    • feature/chore/fix/network

๐Ÿ’ก ์ด์Šˆ, PR ๊ทœ์น™


๐Ÿ“Œ Issue๋ช… = PR๋ช…

  • โœจย [FEAT] - ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ๐Ÿ”จย [FIX] - ๋ฒ„๊ทธ ์ˆ˜์ •
  • โ™ป๏ธย [REFACTOR] - ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง(๊ฒฐ๊ณผ๋ฌผ์€ ๊ฐ™์ง€๋งŒ ์ฝ”๋“œ์˜ ํ–ฅ์ƒ)
  • โœ…ย [CHORE] - ์ˆ˜์ •
  • โž• [ADD] - ์„ธํŒ… ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

๐Ÿ’ธ ์—ญํ•  ๋ถ„๋‹ด

์€์ฃผ

  • ํ”„๋กœ์ ํŠธ ์„ธํŒ…
  • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ: PomeBtn, PomeNaviBar, PomeTextField, PomeMaskedImageView, PomeAlertVC
    • ๊ตฌํ˜„๋ฐฉ๋ฒ• Custom Class๋กœ ์ƒ์„ฑํ•ด๋‘๊ณ  ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ ์ ์šฉ
  • ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…
    • ๊ตฌํ˜„๋ฐฉ๋ฒ• ์นด์นด์˜ค์— ๋กœ๊ทธ์ธ ์š”์ฒญ ํ›„ ์†Œ์…œ ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ์„œ๋ฒ„์— ์ „๋‹ฌ, ์„œ๋ฒ„์—์„œ ์†Œ์…œ ํ† ํฐ์„ ์ด์šฉํ•ด ๊ธฐ์กด ์œ ์ € ์ธ์ง€ ํŒ๋‹จํ•ด ํšŒ์›๊ฐ€์ž… or ๋กœ๊ทธ์ธ์œผ๋กœ ๋„˜๊ธธ์ง€ ํŒ๋‹จ
  • ์นœ๊ตฌ ๊ฒ€์ƒ‰ ๋ฐ ์ถ”๊ฐ€
    • ๊ตฌํ˜„๋ฐฉ๋ฒ• ๊ฒ€์ƒ‰ํ•˜๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์„œ๋ฒ„ํ†ต์‹ . res๋ฅผ ์ด์šฉํ•ด tableview์— ๊ฒฐ๊ณผ ๋ฟŒ๋ ค์คŒ
  • ์นœ๊ตฌ ๊ฐ์ • ๋‚จ๊ธฐ๊ธฐ ํ”Œ๋กœํŒ… ๋ทฐ
    • ๊ตฌํ˜„๋ฐฉ๋ฒ• ์…€๋งˆ๋‹ค์˜ offset.y ๊ฐ’์„ ๋ฐ›์•„์™€ ์›ํ•˜๋Š” ์ขŒํ‘œ์— ์ด๋ชจ์ง€ ์„ ํƒ ๋ทฐ ๋ณด์—ฌ์คŒ

์ฃผํ˜„

  • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ: SpendCVC, PomeHalfModalVC
    • ๊ตฌํ˜„๋ฐฉ๋ฒ• ๋ฐ”ํ…€์‹œํŠธ UIPresentationController๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™”๋ฉด ์ „ํ™˜์œผ๋กœ ๊ตฌํ˜„
  • ๊ธฐ๋กํƒญ ๋ฉ”์ธ
    • ๊ตฌํ˜„๋ฐฉ๋ฒ• ์ƒ๋‹จ ์นดํ…Œ๊ณ ๋ฆฌ CV, ์นดํ…Œ๊ณ ๋ฆฌ ์ œ์™ธํ•œ ๋ถ€๋ถ„ CV ์ด 2๊ฐœ๋กœ ๊ตฌ์„ฑ, ์ƒ๋‹จ ์นดํ…Œ๊ณ ๋ฆฌ CV์—์„œ ์„ ํƒํ•œ ๋ชฉํ‘œ์— ๋”ฐ๋ผ ์•„๋ž˜์˜ ๋ฐ์ดํ„ฐ ์„œ๋ฒ„ ํ†ต์‹ 
  • ๊ธฐ๋กํƒญ ๋˜๋Œ์•„๋ณด๊ธฐ
    • ๊ตฌํ˜„๋ฐฉ๋ฒ• 1๊ฐœ์˜ CV๋กœ ๊ตฌ์„ฑ
  • ๊ธฐ๋กํƒญ ๋ชฉํ‘œ ์ถ”๊ฐ€
    • ๊ตฌํ˜„๋ฐฉ๋ฒ• FSCalendar ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
  • ๊ธฐ๋ก ๊ธ€์“ฐ๊ธฐ
    • ๊ตฌํ˜„๋ฐฉ๋ฒ• viewWillAppear์—์„œ ๋ชฉํ‘œ ์นดํ…Œ๊ณ ๋ฆฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ €์žฅํ•ด๋‘๊ณ  ๋ชฉํ‘œ ์„ ํƒ ๋ฐ”ํ…€์‹œํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฟŒ๋ ค์คŒ

์œ ์ง„

  • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ: GoalCardCVC
    • ๊ตฌํ˜„๋ฐฉ๋ฒ• UICollectionView ์ด์šฉ
  • ํšŒ๊ณ  ํƒญ
    ๊ตฌํ˜„๋ฐฉ๋ฒ•
    • ์œ„์— title๋ถ€๋ถ„์„ ์ œ์™ธํ•˜๊ณ  ์Šคํฌ๋กค์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ section๋ณ„๋กœ ์…€์„ ์ž‘์„ฑ
    • ๊ฐ์ • ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ - delegate ์ด์šฉํ•˜๊ธฐ
    • ๋ฐ”ํ…€๋„ค๋น„๊ฒŒ์ด์…˜ ๋„์›Œ์„œ ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ
  • ์นœ๊ตฌ ํƒญ
    ๊ตฌํ˜„๋ฐฉ๋ฒ•
    • ์œ„์— title๋ถ€๋ถ„์„ ์ œ์™ธํ•˜๊ณ  ์Šคํฌ๋กค์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ section๋ณ„๋กœ ์…€์„ ์ž‘์„ฑ
    • ๊ฐ์ • ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ - delegate ์ด์šฉํ•˜๊ธฐ
    • ๋ฐ”ํ…€๋„ค๋น„๊ฒŒ์ด์…˜ ๋„์›Œ์„œ ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ
  • ๋งˆ์ดํŽ˜์ด์ง€: ๋ฉ”์ธ, ์™„๋ฃŒํ•œ ๋ชฉํ‘œ
    ๊ตฌํ˜„๋ฐฉ๋ฒ•
    • percentage๊ฐ’์— ๋”ฐ๋ฅธ progressbar ๋ถ„๊ธฐ์ฒ˜๋ฆฌ
    • ๊ธฐ๋ณธ progressbar๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  UIView๋ฅผ ๋‘๊ฐœ ๋งŒ๋“ค์–ด์„œ, progressbar๊ฐ’์ด ๋“ค์–ด์˜ฌ๋•Œ๋งˆ๋‹ค constraint๊ฐ’ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

๐Ÿ›  Development Environment



๐Ÿ“š Library

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Library) ๋ชฉ์ (Purpose) ๋ฒ„์ „(Version)
Alamofire ๋„คํŠธ์›Œํฌ ํ†ต์‹  5.6.1
SnapKit autolayout ํ‘œํ˜„ 5.0.0
Then ํด๋กœ์ €๋ฅผ ์ด์šฉํ•œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ 3.0.0
FSCalendar ์บ˜๋ฆฐ๋” ๊ตฌํ˜„ 2.8.4
KingFisher ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ 7.3.0
Lottie ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„ 3.4.0

๐Ÿ’š ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

์€์ฃผ

๊ธฐ์ˆ ์ ์œผ๋กœ ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„์€ multipart/form-data๋ฅผ ํ†ตํ•œ ํšŒ์›๊ฐ€์ž… ์„œ๋ฒ„ํ†ต์‹  ๋ถ€๋ถ„์ด์—ˆ๋‹ค. Alamofire ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„ ํ†ต์‹ ์„ ์ง„ํ–‰ํ–ˆ์—ˆ๋Š”๋ฐ ํšŒ์›๊ฐ€์ž… ํ†ต์‹ ๋ถ€์—์„œ๋งŒ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“  ์—๋Ÿฌ๊ฐ€ ์ƒ๊ฒผ๊ณ , ์„œ๋ฒ„ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ โ€˜boundary not foundโ€™, โ€˜unexpected end of formโ€™ ๋“ฑ์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ boundary์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด์•˜๋Š”๋ฐ, ๋ฐ”์šด๋”๋ฆฌ๋Š” ๋ฉ€ํ‹ฐํŒŒํŠธ ๋ฐ์ดํ„ฐ์˜ ์‹œ์ž‘๊ณผ ๋์„ ์•Œ๋ฆฌ๋Š” ๋ฌธ์ž์—ด๋กœ, ์›๋ž˜ Alamofire ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•ด์„œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์ฃผ๋Š”๋ฐ, ์ด์— ๋Œ€ํ•œ ๋‚ด๋ถ€์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ์ œ๋Œ€๋กœ ์•ˆ๋˜๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. ๊ทธ๋ž˜์„œ ํšŒ์›๊ฐ€์ž… ํ†ต์‹ ๋ถ€๋งŒ iOS์˜ ๊ธฐ๋ณธ์ ์ธ ํ†ต์‹ ๋ฐฉ๋ฒ•์ธ URLSession์„ ์ด์šฉํ•ด์„œ ํ•ด์ฃผ์—ˆ๋”๋‹ˆ API์—ฐ๊ฒฐ์ด ๋˜์—ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธด ํ–ˆ์ง€๋งŒ ์ด๋ฒˆ trouble shooting ๊ณผ์ •์—์„œ URLSession์„ ์ด์šฉํ•ด ์ฒ˜์Œ ํ†ต์‹ ์„ ํ•ด๋ณด๋Š” ๊ฒƒ์ด๋ผ ํ†ต์‹ ์— ์„ฑ๊ณตํ•˜๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์ด ์‰ฝ์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฒˆ์„ ๊ณ„๊ธฐ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ†ต์‹ ์„ ํ•˜๋”๋ผ๋„ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ํŒŒ์•…ํ•˜๊ณ  ์žˆ์–ด์•ผ ์›์ธ์„ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜์—ฌ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ด์Šˆ์— ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ์–ด๋–ค ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋˜์ง€ ํ•ญ์ƒ ๊ธฐ๋ณธ์„ ์ถฉ์‹คํžˆ ๊ณต๋ถ€ํ•˜๊ณ  ๊ฐœ๋ฐœํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์ฃผํ˜„

๋ชฉํ‘œ ์ƒ์„ฑ์—์„œ ๋‘ ๊ฐœ์˜ ์บ˜๋ฆฐ๋”๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ํ•˜๋‚˜์˜ ์บ˜๋ฆฐ๋” VC๋กœ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ ํ™œ์„ฑํ™”๋˜๋Š” ๋‚ ์งœ, ์ด์ „ ๋‹ฌ์ด๋‚˜ ๋‹ค์Œ ๋‹ฌ๋กœ ์ด๋™ํ•˜๋Š” ๋ฒ„ํŠผ ํ™œ์„ฑํ™” ๋ถ„๊ธฐ์ฒ˜๋ฆฌ ํ•˜๋Š” ๊ณผ์ •์ด ์–ด๋ ค์› ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ ์„ ํƒ๋œ ๋‚ ์„ default ๊ฐ’์œผ๋กœ ๋„์›Œ์ค˜์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์บ˜๋ฆฐ๋”๋ฅผ ๋„์šฐ๋Š” VC์—์„œ ํ˜„์žฌ ์„ ํƒ๋œ ๋‚ ์งœ๋ฅผ ๋ณด๋‚ด์ฃผ๊ณ , ๋‹ค์‹œ ์บ˜๋ฆฐ๋”์—์„œ ์„ ํƒ๋œ ๋‚ ์งœ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์ž‘์—…๋„ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๋ชฉํ‘œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์˜ค๋Š˜๋ถ€ํ„ฐ ํ•œ ๋‹ฌ ๊ฐ„ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•œ ์‹œ์ž‘ ๋‚ ์งœ ์บ˜๋ฆฐ๋”, ์„ ํƒํ•œ ์‹œ์ž‘ ๋‚ ์งœ๋กœ๋ถ€ํ„ฐ ํ•œ ๋‹ฌ ๊ฐ„ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•œ ์ข…๋ฃŒ ๋‚ ์งœ ์บ˜๋ฆฐ๋” ์ค‘ ์–ด๋Š ์บ˜๋ฆฐ๋”๋ฅผ ์„ ํƒํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ isStartCalendar(bool)๊ฐ’์„ ์ „๋‹ฌํ–ˆ๋‹ค. ์บ˜๋ฆฐ๋” VC์—์„œ๋Š” isStartCalendar๊ฐ’์— ๋”ฐ๋ผ minimumDate, maximumDate๋ฅผ ์ •ํ•ด์ฃผ์—ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ ์„ ํƒ๋˜์–ด์žˆ๋Š” ๋‚ ์งœ์˜ ์œ ๋ฌด์— ๋”ฐ๋ผ default๊ฐ’๋„ ์ •ํ•ด์ฃผ์—ˆ๋‹ค. ๋ฒ„ํŠผ ํ™œ์„ฑํ™”๋„ isStartCalendar ๊ฐ’์— ๋”ฐ๋ผ ์ •ํ•ด์ฃผ์—ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ์ „์— ์บ˜๋ฆฐ๋” ์—ฐ์Šต์„ ํ–ˆ์—ˆ๋Š”๋ฐ, ์บ˜๋ฆฐ๋”๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ณณ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„์„œ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ดํ›„์— ๋˜ ์บ˜๋ฆฐ๋”๋ฅผ ์“ฐ๋Š” VC๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€๋ฅผ ์—ด์‹ฌํžˆ ํ•˜์ž

์œ ์ง„

๊ธฐ์ˆ ์ ์ธ ๋ฉด์—์„œ๋Š”, ์นœ๊ตฌ ํƒญ์—์„œ ์ด๋ชจ์ง€๊ฐ€ balloon ์ฐฝ์ฒ˜๋Ÿผ ๋– ์•ผ ํ•œ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ๊ทธ์— ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, is์—์„œ๋Š” ๋ฒŒ๋ฃฌ์ฐฝ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๊ฒ€์ƒ‰ํ•ด๋ณด์•˜์ง€๋งŒ, ๋”ฐ๋กœ ์ข‹์€ ์ƒ๊ฐ์ด ๋‚˜์ง€ ์•Š์•˜๋‹ค. ์ด ๋ถ€๋ถ„์€ ์ตœ๊ณ ์˜ ๋ฆฌ๋“œ ์€์ฃผ๊ฐ€ ํ•ด๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๊ธฐ๋กํ•œ ๊ฐ์ • ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์ด ์–ด๋ ค์› ๋‹ค. ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ• ์ˆ˜๋ก ๋ถ„๊ธฐ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•„์กŒ๊ณ , ์ด์ƒํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์–ด์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ด ๋ถ€๋ถ„์—์„œ๋Š” ์„œ๋ฒ„ ํ†ต์‹ ์„ ํ•˜๋ฉด์„œ ๋” ๊ณ ์ณ์•ผ ํ•  ์ ์ด ๋งŽ์•„์ง€๊ฒ ์ง€๋งŒ ์ข‹์€ ๊ฒฝํ—˜์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋˜ํ•œ, ์„œ๋ฒ„ ํ†ต์‹ ์„ ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฒˆ์ฉ์ž„์ด ์ƒ๊ธด๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ํŠนํžˆ ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ๋Š” ๋ถ€๋ถ„์—์„œ ์‚ฌ์ง„์ด ํ†ตํ†ต ํŠ€๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ‚นํ”ผ์…”๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜๋‹ˆ ํ•ด๊ฒฐ์ด ๋˜์—ˆ๋‹ค. ํ‚นํ”ผ์…”๊ฐ€ ์บ์‹œ ์ฒ˜๋ฆฌ๋ฅผ ๋Œ€์‹ ํ•ด์ฃผ์–ด์„œ ์‚ฌ์ง„์ด ํ†ตํ†ต ํŠ€๋Š” ๊ฒƒ์ด ์‚ฌ๋ผ์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ข‹๋‹ค ~

ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์–ด๋ ค์› ๋˜ ์ ์€ ์†Œํ†ต์ด๋‹ค. ๊ธฐํš์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ด ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ•˜๋‹ˆ๊นŒ, ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ์–ด๋ ค์›€์„ ๋Š๊ผˆ๋‹ค. ๊ธฐํš์— ๋Œ€ํ•œ ๊ถ๊ธˆ์ฆ์ด ์‚ฌ๋ผ์ ธ์•ผ, ๊ฐœ๋ฐœ์„ ์ž˜ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๊ธฐํš์ด ํƒ„ํƒ„ํ•ด์•ผ ํ•จ์„ ์•Œ์•˜๊ณ , ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ธฐ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์งˆ๋ฌธ์„ ๋ฐ”๋กœ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ์งˆ๋ฌธ์„ ์ ˆ๋Œ€ ๋ฏธ๋ฃจ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋˜ํ•œ, ๊นƒ ์ปจ๋ฒค์…˜์„ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ๋‹ค. ๋ณ€์ˆ˜๋ช… ๋“ฑ์€ ๊ทœ์น™์„ ์ •ํ•ด ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ชธ์— ๋ฐฐ์ง€ ์•Š์•„์„œ, ์ฃผ์„๋„ ์ž˜ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๊ณ  ๋ณ€์ˆ˜๋ช…๋„ ๊ณ„์†ํ•ด์„œ ํ‹€๋ ธ๋‹ค. ํ•˜์ง€๋งŒ, ๋‚ด๊ฐ€ ์ง  ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ๋™๋ฃŒ๋“ค์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฃผ์„์ด๋‚˜ ๋ณ€์ˆ˜ ๋“ฑ์„ ์ œ๋Œ€๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜‘์—…์ด ์–ด๋ ค์›Œ์ง„๋‹ค๋Š” ๊ฒƒ์„ ์ •๋ง ๋งŽ์ด ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ๋‹ค. ํ†ต์ผ๋œ ๊ทœ์น™์ด ์žˆ์–ด์•ผ, ์ˆ˜์ •, ํ˜‘์—…์ด ์‰ฌ์›Œ์ง„๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ๋‚˜๋‹ˆ, ์–ด๋–ค ํ˜‘์—… ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ๊ทœ์น™์„ ๊ผญ ์ •ํ•  ๊ฒƒ์ด๋‹ค!

๋˜ํ•œ, ์„œ๋กœ ์ž‘์—…์‹œ๊ฐ„์ด ๋‹ฌ๋ผ ์ฒ˜์Œ์—๋Š” ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ทธ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์—๋Š”, ๋‹ค์ˆ˜์™€ ์ž‘์—…์‹œ๊ฐ„์„ ํ†ต์ผํ•ด, ์„œ๋กœ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ๋ฐ”๋กœ ๋ฌป๊ณ  ๋Œ€๋‹ตํ•จ์ด ์ค‘์š”ํ•จ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ์ดํ›„์—”, ์ตœ๋Œ€ํ•œ ์ž‘์—…์‹œ๊ฐ„์„ ํ†ต์ผํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์•ˆ์œผ๋กœ ๊ทน๋ณตํ•˜์˜€๋‹ค.

์•ฑ์žผ ๋๋‚˜๊ณ ๋„ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ํ•  ๊ฒƒ์ด๋‹ค~