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 설계 원칙에도 맞고, 실무에서도 가장 깔끔한 방식이에요 ✅
'감정일기(가칭)' 카테고리의 다른 글
| 커스텀 캘린더 ViewModel, 이렇게 만들면 됩니다 (CalendarViewModel 완전 해부) (0) | 2025.11.10 |
|---|---|
| 📐 Compositional Layout에서 interGroupSpacing vs interItemSpacing 완벽 정리 (0) | 2025.10.29 |
| 🏠 HomeViewModel에 HappinessViewModel을 통합한 이유와 구조 정리 (0) | 2025.10.28 |
| 📘 Combine 기반 ViewModel 테스트: 시행착오로 배우는 HappinessViewModelTests 완성기 (0) | 2025.10.27 |
| 🤔 프로토콜을 어디에 붙여야 하나? - MVVM 설계의 성숙도 (0) | 2025.10.27 |