Skip to content

5NTeam/iMacDonald

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿš” 5NTeam

Introduction to the Project

แ„Œแ…ตแ†ซแ„แ…กแ„Žแ…ฌแ„Œแ…ฉแ†ผ 001

Project Topic: ํ•œ ํŽ˜์ด์ง€ ์•ˆ์— ๋ชจ๋ฐ”์ผ ํ‚ค์˜ค์Šคํฌ ๊ตฌํ˜„ํ•˜๊ธฐ

Project Name: iMacDonald

Project Period: 11/25 ~ 11/29 12:00

Wire Frame: ๐Ÿ”—Figma

iMacDonald?

  • ๊ฐ„๋‹จํ•˜๊ณ  ๋ฐœ์Œํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ
  • ์ต์ˆ™ํ•œ ๋‘ ์š”์†Œ (i + MacDonald)์˜ ์กฐํ•ฉ์œผ๋กœ ๋†’์€ ํšŒ์ƒ์„ฑ
  • i ์ ‘๋‘์‚ฌ๋Š” apple์˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์—ฐ์ƒ์‹œํ‚ด (iPhone, iPad, iMac ๋“ฑ)
  • IT๊ธฐ์ˆ ๊ณผ ์ „์ข…์ ์ธ ํŒจ์ŠคํŠธํ‘ธ๋“œ์˜ ๊ฒฐํ•ฉ์„ ์ƒ์ง•

๐Ÿ‘ฅ Team Members & Roles

ํŒ€์žฅ๐ŸŽฏ ๐ŸŽจ ๋””์ž์ธ/๊ฐœ๋ฐœ โšก๏ธ ๊ฐœ๋ฐœ/ํ’ˆ์งˆ โšก๏ธ ๊ฐœ๋ฐœ/ํ’ˆ์งˆ ๐Ÿ‘จโ€๐Ÿ’ป ๊ฐœ๋ฐœ ์ด๊ด„
์œ ํƒœํ˜ธ ๊น€์†๊ฒธ ํ™ฉ์„๋ฒ” ์–‘์ •๋ฌด ์žฅ์ƒ๊ฒฝ
iOS ๊ฐœ๋ฐœ, ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„, ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ UI/UX ๋””์ž์ธ, iOS ๊ฐœ๋ฐœ, ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ iOS ๊ฐœ๋ฐœ, ํ’ˆ์งˆ ๊ด€๋ฆฌ(QC), ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ํ…Œ์ŠคํŠธ iOS ๊ฐœ๋ฐœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„, ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง iOS ๊ฐœ๋ฐœ, ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๊ธฐ์ˆ  ์ง€์›

๐ŸŽฏ Project Goals

ํ”„๋กœ์ ํŠธ ๊ตฌํ˜„ ๋ชฉํ‘œ

image

ํŒ€ ํ•ต์‹ฌ ๋ชฉํ‘œ

  • ๐Ÿ‘จโ€๐Ÿ’ป ๊ฐ์ž ์ตœ์†Œ 1๊ฐœ์˜ ๊ธฐ๋Šฅ ๋…๋ฆฝ์  ๊ตฌํ˜„
  • โš–๏ธ ํŒ€์› ๊ฐ„ ๊ท ๋“ฑํ•œ ์—…๋ฌด๋Ÿ‰ ๋ถ„๋ฐฐ
  • ๐Ÿ“ˆ ๊ฐœ์ธ ์‹ค๋ ฅ ํ–ฅ์ƒ
  • ๐Ÿค ํ˜‘์—… ๊ฒฝํ—˜ ์ถ•์ 

๊ธฐ๋Œ€ ํšจ๊ณผ

  • ๐ŸŽ“ ์‹ค๋ฌด ๊ฒฝํ—˜ ํš๋“
  • ๐Ÿ”„ ์ „์ฒด ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค ์ดํ•ด
  • ๐Ÿ’ช ๊ฐœ์ธ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”
  • ๐Ÿคผ ํŒ€์›Œํฌ ํ–ฅ์ƒ

๐Ÿ† Branch Rules & Strategies

image

  1. main ๋ธŒ๋žœ์น˜์— ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ์„ธํŒ…

    • README ์ž‘์„ฑ
    • .gitignore ํŒŒ์ผ ์ž‘์„ฑ
    • ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ์ƒ์„ฑ(Xcode)
    • ์ฝ”๋“œ๋ฒ ์ด์Šค ๊ธฐ๋ณธ ์„ธํŒ…(์Šคํ† ๋ฆฌ๋ณด๋“œ ์‚ญ์ œ, info ์„ค์ • ๋“ฑ)
    • ํ”„๋กœ์ ํŠธ Asset ์ถ”๊ฐ€(์ด๋ฏธ์ง€, ์ปฌ๋Ÿฌ์„ธํŠธ ๋“ฑ)
    • ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๋ถ„๋ฆฌ(๊ฐ ์—ญํ•  ๋ณ„๋กœ ๋ถ„๋ฆฌ)
  2. dev ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ(main ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ)

    • ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋งŒ๋“ค์–ด์ง„ ๋‚ด์šฉ์„ ๋ณต์ œ
    • ์ž‘์—… ๋ธŒ๋žœ์น˜(Default)๋ฅผ dev ๋ธŒ๋žœ์น˜๋กœ ์„ค์ •
  3. ํŒ€์›๋ณ„ ์›๊ฒฉ ๋ธŒ๋žœ์น˜ ๋ถ„๋ฆฌ

    • dev ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์›๊ฒฉ ๋ธŒ๋žœ์น˜๋ฅผ ๋ถ„๋ฆฌ
    • ์„ธ๋ถ€์ ์ธ ์ž‘์—… ๋‚ด์šฉ์€ ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๋กœ ๋ถ„๋ฆฌ
  4. PR-Merge ์ „๋žต

    • PR์„ ์ž‘์„ฑํ•  ๋•Œ๋Š” ์‹ ๊ทœ ๋‚ด์šฉ, ๋ณ€๊ฒฝ ๋‚ด์šฉ, ๋ฌธ์ œ์  ๋“ฑ์„ ์ƒ์„ธํžˆ ์ž‘์„ฑ
    • ํŒ€์› ๋ชจ๋‘๋Š” PR์— ๋Œ€ํ•ด ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ž‘์„ฑ
    • Merge๋Š” ํŒ€์› ๋ชจ๋‘๊ฐ€ Approve ํ•ด์•ผ๋งŒ ๊ฐ€๋Šฅ
  5. ๋ชจ๋“  ์ž‘์—… ์™„๋ฃŒ ํ›„ test ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑ

    • dev ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ์„ test ๋ธŒ๋žœ์น˜๋กœ ๋ณต์ œ
    • test ๋ธŒ๋žœ์น˜์—์„œ ํ”„๋กœ์ ํŠธ ๋ฒ„๊ทธ ํ™•์ธ ๋ฐ ์ˆ˜์ •
    • ํ•„์š”์— ๋”ฐ๋ผ hotFix ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์šด์˜
  6. ์™„์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ main์— ์ „๋‹ฌ

    • test ๋ธŒ๋žœ์น˜์—์„œ ๋ฒ„๊ทธ ๋“ฑ์„ ์ˆ˜์ • ํ›„ ์ตœ์ข… ์™„์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ main ๋ธŒ๋žœ์น˜์— ์ „๋‹ฌ
    • ๋ถˆํ•„์š”ํ•œ ๋ธŒ๋žœ์น˜ ์‚ญ์ œ
    • README ์ˆ˜์ •

๐Ÿ““ Github ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜ ๊ฐ€์ด๋“œ (์ด๋ชจ์ง€ ๋ฒ„์ „)

๊ธฐ๋ณธ ์ปค๋ฐ‹ ํƒ€์ž…

  • โœจ feat : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • ๐Ÿ fix : ๋ฒ„๊ทธ ์ˆ˜์ •
  • ๐Ÿ“ docs : ๋ฌธ์„œ ์ˆ˜์ •
  • ๐Ÿ’„ style : ์ฝ”๋“œ ํฌ๋งทํŒ…, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ, ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ
  • โ™ป๏ธ refactor : ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
  • โœ… test : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ, ๋ฆฌํŒฉํ† ๋ง ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€
  • ๐ŸŽจ chore : ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ •

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ถ”๊ฐ€ ํƒ€์ž…

  • ๐Ÿš€ deploy : ๋ฐฐํฌ
  • โšก๏ธ perf : ์„ฑ๋Šฅ ๊ฐœ์„ 
  • ๐Ÿ”ง config : ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •
  • ๐Ÿ“ฆ build : ๋นŒ๋“œ ๊ด€๋ จ ์ˆ˜์ •
  • ๐Ÿ”€ merge : ํ•ฉ๋ณ‘
  • โช๏ธ revert : ๋˜๋Œ๋ฆฌ๊ธฐ

โšฝ๏ธ Troubleshooting

๐Ÿšจ 1. ๋ฉ”์ธ๋ทฐ ์˜คํ† ๋ ˆ์ด์•„์›ƒ ๋ฌธ์ œ

  • ๋ฌธ์ œ: ๋ฉ”๋‰ด๋ฅผ ๋‹ด์€ ์นด๋“œ๋ทฐ๊ฐ€ ๋ฉ”์ธ๋ทฐ์— ๋ฐฐ์น˜๋  ๋•Œ ๊ตฌ์„ฑ์š”์†Œ๋“ค์˜ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์ด ํ‹€์–ด์ง€๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ: ์นด๋“œ๋ทฐ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์นด๋“œ๋ทฐ์˜ ๋น„์œจ๋กœ ์„ค์ •ํ•˜์—ฌ ํ•ด๊ฒฐ
make.height.equalToSuperview().multipliedBy(0.6)

๐Ÿšจ 2. ์นด๋“œ๋ทฐ์˜ BoderColor๊ฐ€ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ

  • ๋ฌธ์ œ: layer.borderColor๊ฐ€ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ: iOS ๋ฒ„์ „์— ๋งž๋Š” ๋ณด๋” ์ปฌ๋Ÿฌ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜์—ฌ ํ•ด๊ฒฐ
// MARK: - Dark Mode Handling
    /// ๋‹คํฌ๋ชจ๋“œ ๋ณ€๊ฒฝ ๊ฐ์ง€ ์‹œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        if self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
            updateBorderColor()
        }
    }
    
    /// ํ…Œ๋งˆ์— ๋”ฐ๋ฅธ ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ ์—…๋ฐ์ดํŠธ ๋ฉ”์„œ๋“œ
    private func updateBorderColor() {
        self.layer.borderColor = UIColor(named: "CardViewShadowColor")?.cgColor
    }
    
    /// iOS 17 ์ด์ƒ์—์„œ ํ…Œ๋งˆ ๋ณ€๊ฒฝ ๊ฐ์ง€ ์„ค์ • ๋ฉ”์„œ๋“œ
    private func registerTraitChangeHandler() {
        if #available(iOS 17.0, *) {
            registerForTraitChanges([UITraitUserInterfaceStyle.self]) { (self: Self, previousTraitCollection: UITraitCollection) in
                self.updateBorderColor()
            }
        }
    }

๐Ÿšจ 3. ํ…Œ์ด๋ธ”๋ทฐ Index out of range

  • ๋ฌธ์ œ: ํ…Œ์ด๋ธ”๋ทฐ์—์„œ ์…€์„ ์ œ๊ฑฐํ•˜๋Š” ์•ก์…˜์—์„œ ์‚ญ์ œ ์ˆœ์„œ(row.index)์— ๋”ฐ๋ผ ์•ฑ์ด ํฌ๋ž˜์‹œ๋˜๋Š” ํ˜„์ƒ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ: ์…€ ์ œ๊ฑฐ ์•ก์…˜์„ ์ˆ˜์ •ํ•˜๊ณ  ํ…Œ์ด๋ธ”๋ทฐ์—์„œ ์ œ๊ฑฐ๋œ ํ–‰์„ ์‚ญ์ œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
cart.remove(at: row) // ์‚ญ์ œ ์•ก์…˜ ์‹คํ–‰์‹œ ๋ฐฐ์—ด์—์„œ ์ธ๋ฑ์Šค ์ œ๊ฑฐ

// ํ…Œ์ด๋ธ”๋ทฐ์—์„œ ์ œ๊ฑฐํ•œ ํ–‰์„ ์‚ญ์ œ
tableView.deleteRows(at: [IndexPath(row: row, section: 0)], with: .none)

๐Ÿšจ 4. ๋‹คํฌ๋ชจ๋“œ/๋ผ์ดํŠธ๋ชจ๋“œ ์ „ํ™˜์‹œ์—๋„ ๋ทฐ ๋ฐฐ๊ฒฝ์ƒ‰์ƒ์ด ๋ณ€ํ•˜์ง€ ์•Š์Œ

  • ๋ฌธ์ œ: ๋‹คํฌ๋ชจ๋“œ๋‚˜ ๋ผ์ดํŠธ๋ชจ๋“œ๋กœ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด๋„ ๋ทฐ์˜ ๋ฐฐ๊ฒฝ์ƒ‰์ด ๊ณ ์ •๋˜์–ด ๋ณ€ํ•˜์ง€ ์•Š์Œ
  • ํ•ด๊ฒฐ: ๋ฐฐ๊ฒฝ์ƒ‰์ƒ์˜ ์ปฌ๋Ÿฌ๋ฅผ UIColor.systemBackground๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Asset์—์„œ ์ƒ‰์ƒ์„ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ

๐Ÿšจ 5. ๋ฉ”์ธ๋ทฐ ์Šคํฌ๋กค ์˜์—ญ ์นจ๋ฒ”

  • ๋ฌธ์ œ: ๋ฉ”์ธ๋ทฐ์—์„œ ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ ๋ณด์ด์ง€ ์•Š์„ ๋•Œ๋„ ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ์˜์—ญ๋งŒํผ ์Šคํฌ๋กค์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ 1: ํ…Œ์ด๋ธ”๋ทฐ์˜ height๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์…€์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งŒ height ๊ฐ’์ด ๋Š˜์–ด๋‚˜๋„๋ก ์„ค์ • -> height ๊ฐ’์ด ๊ณ„์† 0์œผ๋กœ ๊ณ ์ •๋˜์–ด ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ ํ„ฐ์น˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ 2: ํ…Œ์ด๋ธ”๋ทฐ๋ฅผ Hidden์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์…€์ด ์ถ”๊ฐ€๋  ๋•Œ๋งŒ ๋ณด์ด๋„๋ก ์„ค์ • -> ํ…Œ์ด๋ธ”๋ทฐ ์…€์ด 1๊ฐœ์ผ ๋•Œ๋„ ํ…Œ์ด๋ธ”๋ทฐ ์˜์—ญ ์ „์ฒด๊ฐ€ ๋ฉ”์ธ๋ทฐ์— ์˜ํ–ฅ์„ ๋ฏธ์ณ ์Šคํฌ๋กค๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ 3: ํŠœํ„ฐ๋‹˜๊ป˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•„ hitTest๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”๋ทฐ์˜ ์…€์ด ๋น„์–ด์žˆ์ง€ ์•Š์„ ๋•Œ๋งŒ ํ„ฐ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •.
 /// ํ„ฐ์น˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฉ”์„œ๋“œ
    /// ํ…Œ์ด๋ธ”๋ทฐ ์˜์—ญ ์™ธ์˜ ํ„ฐ์น˜๋Š” ๋ฌด์‹œํ•˜๋„๋ก ๊ตฌํ˜„
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        guard !tableView.frame.contains(point) else {
            return super.hitTest(point, with: event)
        }
        return nil
    }

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages