๐Ÿ” ๊ผฌ๋ผ์˜ค์Šคํฌ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

Edenยท2024๋…„ 11์›” 29์ผ
2

myPlace

๋ชฉ๋ก ๋ณด๊ธฐ
26/31
post-thumbnail

์•„๋ฌดํŠผ ์ƒค๋ผ์›ƒ ๋ฐ›์€ ๊ผฌ๋ผ์˜ค์Šคํฌ ํšŒ๊ณ 


๋ ˆ์ง€๊ณ !!!!!!!! ๋‚œ ๐Ÿ”๊ผฌ๋ผ์˜ค์Šคํฌ ๊นƒํ—ˆ๋ธŒ๐Ÿ˜˜



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

๐ŸŽจ ์—ญํ• ๊ณผ ๊ธฐ์—ฌ


๋‚˜๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํŒŒํŠธ๋ฅผ UIView, UIStackView, UITableView ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. ์ˆ˜๋Ÿ‰ ์กฐ์ ˆ, ์ƒํ’ˆ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ UI๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ์™ธ์—๋„ ํŒ€๊ณผ ํ•จ๊ป˜ README ์ž‘์„ฑ ๋“ฑ ๋ฌธ์„œํ™”์— ๋„์›€์„ ์ฃผ๊ณ ์ž ๋…ธ๋ ฅํ–ˆ์œผ๋ฉฐ, Git ์ปจ๋ฒค์…˜๊ณผ ๋จธ์ง€ ์ „๋žต์— ๋Œ€ํ•ด ์˜๊ฒฌ์„ ๋งŽ์ด ๋”ํ–ˆ๋‹ค.

๐ŸŒŸ ์„ฑ์žฅ์˜ ์ˆœ๊ฐ„

๋‚˜๋Š” ํ•„์ˆ˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋งˆ์น˜๊ณ  README ๋ฌธ์„œ ์ž‘์„ฑ์— ์ฐธ์—ฌํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๋ฌธ์„œํ™”๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค. ์˜ค๋žœ๋งŒ์— ๋ฌธ์„œํ™” ์ž‘์—…์„ ํ•˜๋ฉฐ ๋‚ด๊ฐ€ ๋†“์ณค๋˜ ๋ถ€๋ถ„๋“ค์„ ๋‹ค๋“ฌ์„ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
๋˜ Git์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๋ฉฐ ํŒ€์›๋“ค๊ณผ์˜ ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ๋‹ค. ํŒ€์›๋“ค๊ณผ ๊ฐ™์ด Git์— ๋Œ€ํ•ด ํ•จ๊ป˜ ๋ฐฐ์šฐ๋ฉฐ ์„ฑ์žฅํ•˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ํŒ€ ์ „์ฒด์˜ ์—ญ๋Ÿ‰์ด ์ƒ์Šนํ•œ ๊ฒƒ์ด ๋А๊ปด์ ธ ์ •๋ง ๋ฟŒ๋“ฏํ–ˆ๋‹ค.

๐Ÿ˜ฎโ€๐Ÿ’จ ์•„์‰ฌ์šด ์ 

์•„์‰ฌ์šด ์ ์œผ๋กœ๋Š” ์—ญ์‹œ ์•„์ง ๋‚ด ์‹ค๋ ฅ์— ๋Œ€ํ•ด ๋ถ€์กฑํ•จ์„ ๋А๋ผ๋Š” ๊ฒƒ. ๋ฐฐ์šด ๋‚ด์šฉ์—์„œ ๋ฒ—์–ด๋‚œ, ์ž์œ ๋กœ์šด ํ”„๋กœ์ ํŠธ์˜€๊ธฐ์— ๋ฐฉํ–ฅ ์„ค์ •์ด ์–ด๋ ต๊ฒŒ ๋А๊ปด์กŒ๋‹ค. ๊ทธ๋ž˜์„œ์ธ์ง€ ๋Œ€๋ถ€๋ถ„ ํŒ€์›๋“ค์—๊ฒŒ ์˜์กดํ•˜๋Š” ์ƒํ™ฉ์ด ๋งŽ์•˜๋‹ค.

๐Ÿ“– ๋ฐฐ์šด ์ 

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

๐Ÿค— ํ˜‘์—…์˜ ์˜๋ฏธ

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

๐Ÿš€ ์•ž์œผ๋กœ์˜ ๋„์ „

๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋” ์‹ ๊ฒฝ ์“ฐ๊ณ  ์‹ถ๋‹ค. ํ•„์ˆ˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์ง‘์ค‘ํ•˜๋А๋ผ UX๋ฅผ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•œ ์ ์ด ์•„์‰ฌ์› ๋Š”๋ฐ, ์ด์ œ๋Š” ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊นŠ์ด ๊ณ ๋ฏผํ•ด๋ณด๋Š” ์‹œ๊ฐ„์ด ์ถฉ๋ถ„ํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. ๋˜ํ•œ, ํŒ€์›๋“ค์—๊ฒŒ ๋” ๋งŽ์€ ๊ธฐ์ˆ ์  ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ๋˜๊ธฐ ์œ„ํ•ด ์ง€์†์ ์ธ ํ•™์Šต๊ณผ ์ฃผ๋„์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์ „ํ•˜๊ณ  ์‹ถ๋‹ค.

๐ŸŒฟ ์„ฑ์žฅ ์ด์•ผ๊ธฐ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํŠนํžˆ UIKit๊ณผ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ์š”์†Œ๋“ค์„ ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋งŽ์€ ์„ฑ์žฅ์„ ์ด๋ค˜?๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

  1. UIStackView์™€ UITableView ํ™œ์šฉ ๋Šฅ๋ ฅ +1

    // UITableView์™€ UIStackView๋ฅผ ํ™œ์šฉํ•œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ UI ๊ตฌ์„ฑ
    let cartTableView = UITableView()
    let headerStackView = UIStackView()
    
    // StackView์™€ TableView๋ฅผ ๋ทฐ์— ์ถ”๊ฐ€
    view.addSubview(headerStackView)
    view.addSubview(cartTableView)
    
    headerStackView.axis = .horizontal
    headerStackView.distribution = .fillEqually
    
    // ์ œ์•ฝ์กฐ๊ฑด ์„ค์ •
    headerStackView.snp.makeConstraints { make in
        make.top.equalToSuperview().offset(16)
        make.leading.trailing.equalToSuperview().inset(16)
        make.height.equalTo(50)
    }
    
    cartTableView.snp.makeConstraints { make in
        make.top.equalTo(headerStackView.snp.bottom).offset(16)
        make.leading.trailing.bottom.equalToSuperview().inset(10)
    }

    UIStackView์™€ UITableView๋ฅผ ์‚ฌ์šฉํ•ด ์œ ๋™์ ์ธ UI ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ, ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ ˆ์ด์•„์›ƒ์„ ์–ด๋–ป๊ฒŒ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŠนํžˆ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํ™”๋ฉด์—์„œ ์ƒํ’ˆ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ, UITableView์™€ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  2. ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ตฌ์กฐํ™”๋œ ์„ค๊ณ„์˜ ์ค‘์š”์„ฑ ์ดํ•ด

    // ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ CartTableViewCell
    class CartTableViewCell: UITableViewCell {
        private let menuLabel = UILabel()
        private let decreaseQuantityButton = UIButton()
        private let increaseQuantityButton = UIButton()
        private let quantityLabel = UILabel()
    
        override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
            super.init(style: style, reuseIdentifier: reuseIdentifier)
            setUpCell()
        }
    
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        private func setUpCell() {
            // UI ์š”์†Œ ์ถ”๊ฐ€ ๋ฐ ๋ ˆ์ด์•„์›ƒ ์„ค์ •
            let stackView = UIStackView(arrangedSubviews: [decreaseQuantityButton, quantityLabel, increaseQuantityButton])
            stackView.axis = .horizontal
            stackView.spacing = 8
    
            contentView.addSubview(menuLabel)
            contentView.addSubview(stackView)
    
            menuLabel.snp.makeConstraints { make in
                make.leading.top.equalToSuperview().offset(16)
            }
    
            stackView.snp.makeConstraints { make in
                make.trailing.top.equalToSuperview().offset(16)
            }
        }
    
        func configure(with menu: String, quantity: Int) {
            menuLabel.text = menu
            quantityLabel.text = "\(quantity)"
        }
    }

    ๊ฐ UI ์š”์†Œ๋ฅผ ๋ณ„๋„์˜ ์ปค์Šคํ…€ ๋ทฐ๋‚˜ ์…€๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์ด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์˜€๋‹ค.(?) ์˜ˆ๋ฅผ ๋“ค์–ด, CartTableViewCell์„ ํ™œ์šฉํ•ด ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‚ด ์ƒํ’ˆ์˜ ์ •๋ณด๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด์„œ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์…€ ๋‚ด๋ถ€์˜ ๋ฒ„ํŠผ์„ ํ™œ์šฉํ•ด ์‚ฌ์šฉ์ž ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ํšจ์œจ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ตฌ์กฐํ™”๋œ ์„ค๊ณ„์˜ ์ค‘์š”์„ฑ์„ ๋”์šฑ ๊นŠ์ด ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

  3. ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•œ ๋™์  UI ์—…๋ฐ์ดํŠธ ๊ฒฝํ—˜

    // ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•œ ๋ฒ„ํŠผ ์•ก์…˜ ๊ตฌํ˜„
    class CartTableViewCell: UITableViewCell {
        var minusButtonTapped: (() -> Void)?
        var plusButtonTapped: (() -> Void)?
    
        private let decreaseQuantityButton = UIButton()
        private let increaseQuantityButton = UIButton()
    
        override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
            super.init(style: style, reuseIdentifier: reuseIdentifier)
            setUpButtons()
        }
    
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        private func setUpButtons() {
            decreaseQuantityButton.setTitle("-", for: .normal)
            decreaseQuantityButton.addTarget(self, action: #selector(handleMinusButtonTapped), for: .touchUpInside)
    
            increaseQuantityButton.setTitle("+", for: .normal)
            increaseQuantityButton.addTarget(self, action: #selector(handlePlusButtonTapped), for: .touchUpInside)
    
            contentView.addSubview(decreaseQuantityButton)
            contentView.addSubview(increaseQuantityButton)
    
            // ๋ฒ„ํŠผ ๋ ˆ์ด์•„์›ƒ ์„ค์ • (SnapKit ์‚ฌ์šฉ ์˜ˆ์‹œ)
            decreaseQuantityButton.snp.makeConstraints { make in
                make.leading.equalToSuperview().offset(16)
                make.centerY.equalToSuperview()
            }
    
            increaseQuantityButton.snp.makeConstraints { make in
                make.trailing.equalToSuperview().offset(-16)
                make.centerY.equalToSuperview()
            }
        }
    
        @objc private func handleMinusButtonTapped() {
            minusButtonTapped?()
        }
    
        @objc private func handlePlusButtonTapped() {
            plusButtonTapped?()
        }
    }

    CartTableViewCell์—์„œ ์ˆ˜๋Ÿ‰์„ ์ฆ๊ฐ€์‹œํ‚ค๊ฑฐ๋‚˜ ๊ฐ์†Œ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํด๋กœ์ €(minusButtonTapped, plusButtonTapped)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ†ตํ•ด, ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ด๋ฅผ UI์— ๋ฐ˜์˜ํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŠนํžˆ ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด ๋ถ€๋ชจ ๋ทฐ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋ฉด์„œ, ํด๋กœ์ €์˜ ๊ฐ•๋ ฅํ•จ๊ณผ ์ด์— ๋”ฐ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ์„ ๋ฐฐ์šฐ๊ฒŒ ๋˜์—ˆ๋‹ค.

    ํŒ€ ๋ฆฌ๋”์ธ Eric๋‹˜์˜ ์ฝ”๋“œ ๊ฐˆ๋ผ์‡ผ๋ฅผ 1์—ด ์ง๊ด€ํ•˜์—ฌ ๋น„๋กœ์†Œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ์ž‘์—…์ด๋‹ค.

  4. SnapKit์„ ํ†ตํ•œ ์ง๊ด€์ ์ธ ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ
    SnapKit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ด์•„์›ƒ์„ ์ง๊ด€์ ์ด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํ˜”๋‹ค. ์ œ์•ฝ ์กฐ๊ฑด์„ ์ฝ”๋“œ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, SnapKit์„ ํ™œ์šฉํ•ด ๊ฐ€๋…์„ฑ ๋†’์€ ๋ ˆ์ด์•„์›ƒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ํŠนํžˆ ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ์—์„œ ๋ ˆ์ด์•„์›ƒ์ด ์ผ๊ด€๋˜๊ฒŒ ๋ณด์ด๋„๋ก ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  5. ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ดํ•ด

    func updateCartData() {
        tableView.reloadData()
        cartHeaderStackView.updateTotalCount(newCount: cartManager.totalCount)
    }

    ์žฅ๋ฐ”๊ตฌ๋‹ˆ์˜ ์ƒํ’ˆ ์ˆ˜๋Ÿ‰์„ ์กฐ์ ˆํ•˜๊ณ , ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŠนํžˆ reloadData()๋ฅผ ํ†ตํ•ด UITableView์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๊ณ , CartHeaderStackView์˜ ๋ผ๋ฒจ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ณผ์ •์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ๊ณผ ์ด๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค.

  6. ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์˜ UX ๊ณ ๋ ค

    // ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ๋น„์–ด ์žˆ์„ ๋•Œ ์•ˆ๋‚ด ๋ฌธ๊ตฌ ํ‘œ์‹œ
    if cartManager.orders.isEmpty {
        emptyCartLabel.isHidden = false
    } else {
        emptyCartLabel.isHidden = true
    }

    ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ๋น„์–ด ์žˆ์„ ๋•Œ ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋“ฑ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๊ณ ๋ คํ•œ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์•ฑ์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก UI์˜ ์„ธ๋ถ€์ ์ธ ๋ถ€๋ถ„๊นŒ์ง€ ์‹ ๊ฒฝ ์“ฐ๋ฉด์„œ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ๊นจ๋‹ฌ์•˜๋‹ค. ๋‹ค์Œ๋ฒˆ์—” ์ข€ ๋” ๊ณ ๋ฏผํ•ด๋ณด๊ณ  ์‹ถ๋‹ค!

๐Ÿ’ก ํ”„๋กœ์ ํŠธ ๊ตํ›ˆ

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

profile
๐ŸŒ Frontend && ๏ฃฟ iOS

0๊ฐœ์˜ ๋Œ“๊ธ€