.
└── CaloLink/
├── Source/
│ ├── Application/ # 앱의 생명주기 및 전역 설정
│ │ ├── AppDelegate.swift
│ │ ├── SceneDelegate.swift
│ │ └── DIContainer/ # 의존성 주입 컨테이너
│ │
│ ├── Data/ # 데이터 소스 (네트워크, DB 등)
│ │ ├── Network/ # 네트워크 통신 관련
│ │ └── Repository/ # 데이터 저장소 구현체
│ │
│ ├── Domain/ # 핵심 비즈니스 로직
│ │ ├── Entity/ # 핵심 모델 객체
│ │ ├── RepositoryProtocol/ # 데이터 저장소 인터페이스(프로토콜)
│ │ └── UseCase/ # 비즈니스 로직 단위
│ │
│ └── Presentation/ # UI 계층
│ ├── Common/ # 공통 UI 컴포넌트
│ ├── MainScene/
│ ├── SearchScene/
│ ├── ListScene/
│ └── DetailScene/
│
└── Resource/ # 에셋 및 리소스
├── Assets.xcassets
└── Info.plist
전체 폴더 구조는 이런식으로 구분하여 사용합니다.
초반 설정이 어렵다는 점과 파일이 많아진다는 점은 어쩔 수 없는 것 같습니다.
ApplicationAppDelegate, SceneDelegate)과 모든 의존성을 관리하고 주입하는 DIContainer가 위치합니다.DataURLSession을 사용한 REST API 통신을 구현하고,DomainEntityRepositoryProtocolUseCasePresentationUseCase는 사용자의 특정 목표나 앱의 비즈니스 로직 하나를 대표하는 독립적인 기능 단위입니다.
CaloLink 프로젝트의 핵심 기능들을 아래와 같이 UseCase로 정의합니다.
SearchProductsUseCase
GetProductDetailUseCase
GetRecentKeywordsUseCase
SaveRecentKeywordUseCase
ClearRecentKeywordsUseCase

View (UI): 사용자의 액션이 발생하면 ViewModel을 호출합니다.ViewModel: 해당 액션에 맞는 UseCase를 실행시킵니다.UseCase: 비즈니스 로직을 수행하고 필요한 데이터는 Repository Protocol을 통해 요청합니다.Repository (구현체)NetworkService: URLSession을 사용하여 백엔드 서버와 통신하고, JSON 데이터를 받아옵니다.이러한 단방향 의존성 구조는 각 계층을 독립적으로 개발하고 테스트할 수 있게 만들어주고 향후 API 서버가 변경되거나 새로운 데이터 소스가 추가되어도 Domain과 Presentation 계층의 코드 수정 없이 Data 계층만 교체하여 유연하게 대응할 수 있도록 합니다.