→ Taster

[Project-Taster] 기본 컴포넌트 적용 및 아키텍처 변경

Swift librarian 2024. 10. 13. 10:09

현재 앱 구조는 아래와 같다. 이번 변경 목표는 다음과 같다.

├── Taster
│   ├── Preview Content
│   │   └── PreviewContainer.swift
│   ├── Resource
│   └── Source
│       ├── Model
│       │   ├── Local
│       │   └── SwiftData
│       ├── Observable
│       ├── Utility
│       └── View
│           ├── Component
│           │   ├── Alert
│           │   ├── Button
│           │   ├── Confetti
│           │   ├── RadarChart
│           │   └── Rating
│           ├── Note
│           │   ├── AddNote
│           │   │   ├── AddCocktailNote
│           │   │   ├── AddCoffeeNote
│           │   │   ├── AddWhiskeyNote
│           │   │   └── AddWineNote
│           │   ├── CocktailNote
│           │   ├── CoffeeNote
│           │   ├── WhiskeyNote
│           │   └── WineNote
│           ├── Onboarding
│           └── User
└── Taster.xcodeproj

변경 목표

  1. Observable 제거하기
  2. Model 에 비즈니스 로직 넣기 (Model 이 일을 하게하자)
  3. Utility 보다는 모듈 개념으로 구분하기
  4. 앱 UI 기본 컴포넌트로 적용하기 → 고도화는 적용 후에!
  5. 중복되는 뷰 최대한 재활용하기

앱 구조 확인과정

모델 변경

아래와 같이 Wine, Coffee, Cocktail, Whiskey 의 데이터가 너무 전역적으로 let 으로 선언되어 있고, 흩어져 있는 데이터라는 느낌이 들어서 묶어야 할 필요성을 느꼈다!! 이것을 어떻게 변경할 수 있을까?

struct WineType: Identifiable, Codable, Hashable {
    var id = UUID()
    var name: String
    var imageName: String
}

let wineTypes: [WineType] = [
    WineType(name: "스파클링 와인", imageName: "sparklingWine"),
    WineType(name: "화이트 와인", imageName: "whiteWine"),
    WineType(name: "레드 와인", imageName: "redWine")
    // ... 생략
]

struct WineColor: Identifiable, Codable, Hashable {
    var id = UUID()
    var name: String
    var imageName: String
}

let wineColors: [WineColor] = [
    WineColor(name: "밀짚색", imageName: "strawWine"),
    WineColor(name: "노란색", imageName: "yellowWine"),
    WineColor(name: "황금색", imageName: "goldWine")
    // ... 생략
]

struct WineScent: Identifiable, Codable, Hashable, Equatable {    
    var id = UUID()
    var name: String
    var imageName: String
}

let wineScents: [WineScent] = [
    WineScent(name: "블루베리", imageName: "blueberry"),
    WineScent(name: "올리브", imageName: "olive"),
    WineScent(name: "자두", imageName: "plum")
    // ... 생략
]

일단 뷰 작업 이전에 모델과 구조를 잡아놓고 해야겠다는 생각을 했다. 역시 기존의 앱 구조를 확인해보니 엉망이었다... 아래와 같이 Observable 이 단순하게 초기화와 데이터를 중간에 가지고 있는 정도만 하고 있었다. 확실히 쓸모없어보이는 코드였다...! 심지어 싱글톤사용까지... 수정이 시급해보였다.

@Observable
final class WineNoteObservable {
    var name: String = ""
    var date: Date = Date()
    var type: WineType = wineTypes[2]
    var image: Data?
    var color: WineColor = wineColors[0]
    var scents: [WineScent] = []
    var taste: [Double] = [0, 0, 0, 0, 0]
    var think: String = ""
    var rating: Double = 0.0
    
    static var shared = WineNoteObservable()
    
    func reset() {
        name = ""
        date = Date()
        type = wineTypes[2]
        image = nil
        color = wineColors[0]
        scents = []
        taste = [0, 0, 0, 0, 0]
        think = ""
        rating = 0.0
    }
}

또한 아래와 같이 똑같은 느낌의 뷰의 중복이 많아보이고 줄일 수 있는 여지가 너무 많아보였다.

고칠 부분이 너무 많이 보여서 따로따로 글로 작성하기로 했다!