본문 바로가기

Swift

데이터 모델 형식이 따른 장, 단점 (Feed VS [Feed])

1. 기존 방식과 제안 방식 비교

기존 방식:

struct Feed {
    let id: UUID
    let title: String?
    let contents: String?
    let date: Date?
    let imagePath: [String]
}

 

 

  • 장점:
    • 데이터가 간단하게 정의되어 있고, 각 피드가 독립적인 단위로 사용 가능.
    • 필요한 정보가 한 구조체 안에 모두 포함되어 있어 코드가 직관적.
  • 단점:
    • Feed에 관련된 고유 ID 및 관리 로직이 포함되어 있어, 이 로직이 확장되거나 복잡해질 경우, 구조체가 비대해질 수 있음.

 

제안 방식:

struct FeedManager {
    let id: UUID
    let feed: Feed
}

struct Feed {
    let title: String?
    let contents: String?
    let date: Date?
    let imagePath: [String]
}

 

 

  • 장점:
    • id가 FeedManager로 이동하면서, Feed 구조체는 순수 데이터만을 다루게 됨.
    • FeedManager에서 추가적인 로직(예: ID 기반 검색, 필터링 등)을 구현할 수 있음.
    • 관리 용도가 분리되면서 확장성 증가.
  • 단점:
    • 코드를 작성할 때 한 단계 더 깊이 들어가야 하므로 약간의 복잡성 증가.
    • FeedManager 배열을 다룰 때, 데이터를 접근하려면 feedManager.feed처럼 중첩된 접근 필요.

 

2. 언제 사용하면 좋은가?

FeedManager 방식이 적합한 경우:

  • Feed추가적인 관리 로직이 필요하거나, id를 사용해 데이터 검색, 필터링 등의 작업이 많이 발생하는 경우.
  • id를 별도의 관리 단위로 사용해 Feed와 관련 없는 로직을 처리하고 싶은 경우.
  • 데이터가 더 복잡해질 가능성이 높고, 구조를 확장하려는 경우.

기존 방식이 적합한 경우:

  • Feed가 비교적 간단하게 사용되고, ID와 데이터가 항상 같이 다뤄지는 경우.
  • 추가 관리 로직이 거의 없고, 단순한 데이터만을 처리할 경우.

 

3. FeedManager 방식으로 구현 예제

FeedManager와 Feed를 사용한 배열 관리

var feedManagers: [FeedManager] = []

// 새로운 Feed 추가
let newFeed = Feed(title: "Sample Title", contents: "Sample Content", date: Date(), imagePath: ["path1", "path2"])
let newFeedManager = FeedManager(id: UUID(), feed: newFeed)
feedManagers.append(newFeedManager)

// 특정 FeedManager의 Feed에 접근
if let firstFeed = feedManagers.first?.feed {
    print("Title: \(firstFeed.title ?? "No Title")")
}

// ID로 FeedManager 검색
if let foundFeedManager = feedManagers.first(where: { $0.id == UUID() }) {
    print("Found Feed: \(foundFeedManager.feed.title ?? "No Title")")
}

 

FeedManager로 검색, 필터링 로직

// Feed ID로 검색
func findFeedByID(_ id: UUID, in managers: [FeedManager]) -> Feed? {
    return managers.first(where: { $0.id == id })?.feed
}

// FeedManager 내 이미지 경로 접근
func getImagePaths(from managers: [FeedManager], id: UUID) -> [String]? {
    return managers.first(where: { $0.id == id })?.feed.imagePath
}

// 사용 예제
if let imagePaths = getImagePaths(from: feedManagers, id: newFeedManager.id) {
    print("Image Paths: \(imagePaths)")
}

 

4. FeedManager 방식을 사용하면 유용한 이유

  • 유연성 증가: ID와 데이터가 분리되어, ID 중심의 로직과 데이터 중심의 로직을 각각 확장 가능.
  • 관리 용이: 배열을 관리할 때 ID를 키로 사용하면 검색과 정렬이 쉬움.
  • 단일 책임 원칙 준수: 데이터 관리와 데이터 표현을 분리.