본문 바로가기
감정일기(가칭)

🧩 HomeSection은 어디에 두는 게 맞을까?

by 밤새는 탐험가89 2025. 10. 28.
728x90
SMALL

UICollectionView + CompositionalLayout 설계 시 섹션 enum의 위치 정하기

 

홈 화면을 UICollectionView + CompositionalLayout으로 구현할 때
아래처럼 섹션을 구분하는 enum을 많이 쓰게 됩니다 👇

enum HomeSection: Int, CaseIterable {
    case quote
    case moodSummary
    case recentEntries
    case photoGallery
}

 

그런데 여기서 많은 초보 개발자들이 헷갈리는 부분이 하나 있죠.

“이 enum은 어디에 넣는 게 맞을까? Model 폴더? ViewController?”

 

결론부터 말하자면,
👉 HomeSection은 ViewController 쪽(UI 계층) 에 두는 게 가장 적절합니다.


🎯 이유 1. HomeSection은 “UI 구성 정보”이기 때문

이 enum은 데이터 모델(EmotionDiaryModel, HappinessQuote)을 표현하는 게 아니라,
“홈 화면의 시각적 섹션 구조”를 정의하는 UI 전용 열거형이에요.

 

즉, 이건 “어떤 데이터를 가지고 있느냐”보다
“어떤 순서로, 어떤 섹션을 보여줄 것이냐”에 대한 화면 레이아웃 로직입니다.

 

✅ 따라서 Model 폴더(비즈니스 로직)보다는
ViewController나 View 폴더에 두는 게 구조적으로 맞습니다.


🧱 MVVM 계층 기준으로 보면

계층 책임 예시
🧩 Model 앱의 데이터 구조 정의 EmotionDiaryModel, HappinessQuote
🧠 ViewModel 데이터 가공, 상태 관리 HomeViewModel
🎨 View(ViewController) UI 구성, 사용자 인터랙션 HomeViewController
📚 HomeSection UI 레이아웃 정의용 Enum ✅ ViewController 영역

 

즉, HomeSection은 화면에 어떤 섹션을 보여줄지 결정하는
View의 도메인 언어”이기 때문에 Model 영역에 두면 SRP(단일 책임 원칙)를 깨게 됩니다 ❌


📁 폴더 구조 추천

두 가지 방법이 있습니다 👇

✅ 방법 ① HomeViewController 내부에 정의 (가장 권장)

// HomeViewController.swift

extension HomeViewController {
    enum HomeSection: Int, CaseIterable {
        case quote
        case moodSummary
        case recentEntries
        case photoGallery
    }
}

 

👍 장점

- ViewController와 강한 결합 구조 유지 (1:1 관계)

- 네임스페이스 충돌 방지 (HomeViewController.HomeSection)

- 코드 읽을 때 “이 화면의 구조”가 한눈에 들어옴 👀

 

실무에서도 이 방식이 가장 많이 쓰입니다.
특히 섹션이 이 화면 전용이라면 완벽한 위치예요.

 

🔸 방법 ② View 폴더 내에 별도 파일로 분리

📂 View
 ┣ 📜 HomeViewController.swift
 ┣ 📜 HomeSection.swift

 

이 방식은
다른 곳(예: LayoutBuilder, DataSource)에서도
HomeSection을 참조해야 할 때 사용합니다.

 

즉, “재사용 가능성이 조금이라도 있다면
독립 파일로 빼되, 위치는 View 계층 안에 두는 게 베스트입니다.


🚫 피해야 할 위치: Model 폴더

📂 Model
 ┣ 📜 HomeSection.swift ❌

이건 안 됩니다 😅

 

- Model 폴더는 데이터 정의를 위한 영역이에요.

- HomeSection은 데이터 모델이 아니라 UI 표현 구조입니다.

- 이렇게 섞이면 계층 구분이 흐려지고, 협업 시 혼란을 일으킵니다.


💡 참고: enum에 메타 정보 추가하기

보통 HomeSection 안에 각 섹션의 타이틀이나 아이콘을 정의해두면
코드 가독성이 훨씬 좋아집니다 👇

extension HomeViewController {
    enum HomeSection: Int, CaseIterable {
        case quote
        case moodSummary
        case recentEntries
        case photoGallery

        var title: String {
            switch self {
            case .quote: return "오늘의 명언"
            case .moodSummary: return "주간 감정 요약"
            case .recentEntries: return "최근 감정일기"
            case .photoGallery: return "사진으로 보는 감정일기"
            }
        }
    }
}

 

이렇게 하면 DiffableDataSource 구성 시
섹션별로 쉽게 타이틀을 붙일 수 있어요 💬


✅ 정리 요약

위치 적합성 설명
HomeViewController 내부 ✅ 가장 권장 1화면 전용 섹션 정의
View 폴더 내 별도 파일 ⭕️ 가능 여러 파일에서 참조할 때
Model 폴더 ❌ 비권장 UI 레이아웃 로직은 Model이 아님

 


✨ 마무리

💬 HomeSection은 “데이터의 구조”가 아니라
“화면의 구조”를 정의하는 UI 계층 전용 Enum입니다.


따라서 ViewController(혹은 View 폴더) 쪽에 두는 것이
MVVM 설계 원칙에도 맞고, 실무에서도 가장 깔끔한 방식이에요 ✅

728x90
LIST