앱스토어 링크 ( 현재 서버 일부 내려간 상태입니다. )
https://apps.apple.com/kr/app/%ED%93%A8%EB%A6%AC%EC%A6%98/id6523427087
flowchart TB
%% App Layer
A[Purithm]:::app
%% Core Layer
subgraph Core
B[Cache Core]:::core
C[KeyChain Core]:::core
D[Auth Core]:::core
E[UIKit Core]:::core
F[CommonKit Core]:::core
end
%% Feature Layer
subgraph Feature
G[Filter Feature]:::feature
H[Author Feature]:::feature
I[Feed Feature]:::feature
J[Profile Feature]:::feature
end
%% Connections (simplified for clarity)
A --> B
A --> C
A --> D
A --> E
A --> F
B --> G
C --> H
D --> I
E --> J
%% Styles
classDef app fill:#FFEE99,stroke:#333,stroke-width:2,color:#000;
classDef core fill:#DFFFD6,stroke:#333,stroke-width:2,color:#000;
classDef feature fill:#D6E8FF,stroke:#333,stroke-width:2,color:#000;
%% Make arrows invisible
linkStyle default stroke:none,stroke-width:0;
🪀 Cache, KeyChain, UI 등 여러 Feature 모듈에서 공통적으로 사용될 모듈들의 단위입니다.
- UI 관련
Extension
,DesignSystem
등 공통 UIKit과 관련된 공통 컴포넌트들이 포함된 모듈
- Network Error Type, Coordinator, Data Response Wrapper 등 앱 전반적으로 사용되는
Enum
과Protocol
들이 포함된 모듈
🪀 앱에서 지원하는 기능을 포함하는 모듈들의 단위입니다.
- Filter
- Feed
- Author
- Profile
flowchart TB
%% Presentation Layer
subgraph Presentation_Layer [Presentation Layer]
direction TB
VC[View Controller]:::presentation
Input[Input]:::presentation
Output[Output]:::presentation
VM[ViewModel]:::presentation
Coord[Coordinator]:::presentation
View[View]:::presentation
ProtocolCoord[<Protocol> Coordinator]:::presentation
VC -->|Events| Input
Input --> VM
VM -->|Publisher| Output
VM -.->|Subscribe| Output
VC -->|Update| View
VM -.-> Coord
Coord -.-> ProtocolCoord
end
%% Domain Layer
subgraph Domain_Layer [Domain Layer]
direction TB
ProtocolUsecase[<Protocol> Usecase]:::domain
Usecase[Usecase]:::domain
ProtocolUsecase --> Usecase
end
%% Data Layer
subgraph Data_Layer [Data Layer]
direction TB
ProtocolService[<Protocol> Service]:::data
Service[Service]:::data
DTO[DTO]:::data
Network[Network]:::data
Repo[Repository]:::data
Cache[Cache]:::data
Database[Database]:::data
ProtocolService --> Service
Service --> DTO
Service --> Network
Repo --> Cache
Repo --> Database
end
%% Cross-layer connections
VM --> Usecase
Usecase --> Service
Usecase --> Repo
%% Styles
classDef presentation fill:#FFCCCB,stroke:#333,stroke-width:2px,color:#000;
classDef domain fill:#D8BFD8,stroke:#333,stroke-width:2px,color:#000;
classDef data fill:#CCFFCC,stroke:#333,stroke-width:2px,color:#000;
🪀 Layer 를 분리하여 로직의 역할을 명확하게 나누었습니다.
UI
및 Action
로직
- 사용자의 입력 이벤트와 이벤트 처리 로직으로 구성되어 있습니다.
- 각각의 Feature 마다 Coordinator 를 포함하여 Feature 내/외부에서의 화면 전환 일관성을 유지할 수 있게 구성되어 있습니다.
데이터 가공
및 에러처리
로직 구현
주로, 서버로부터 받아온 데이터를 UI Layer 에 맞게 가공 및 에러처리 로직을 포함하고 있습니다.
통신
및 데이터 조작
로직 구현
- 서버와의 통신 로직이 주로 구성되어 있습니다.
- Repository 를 통해 서버로부터 받아온 데이터를 DB, Cache 로의 CRUD 로직을 포함하고 있습니다.
페이지 링크 준비중
- 대부분의 화면이 리스트로 구성
- Carousel을 포함한 리스트 지원 필요
- 하나의 셀에서 다양한 이벤트를 받아 처리하는 기능 필요
Cell Regist 관리
/리스트 업데이트
/반복적인 Delegate, DataSource 구현
의 로직을 공통화하기 위함- 일부 Delegate, DataSource에서 Cell의 Type을 기준으로 분기처리하는 로직을 없애 가독성을 높임
- Cell들로부터의 이벤트 처리 로직을 Adapter에서 관리함으로써 이벤트 관리가 용이
- CollectionView FlowLayout보다 다양한 Layout 형태를 지원 (예: Carousel 지원)
- 효율적인 업데이트를 위해 Hash 값을 기준으로 하는 Diffable DataSource 적용이 적절하다고 판단
- Cell의 업데이트 시점, 반복적인 Delegate, DataSource 작성, Cell Regist 로직을 매번 작성하지 않아도 되어 재사용성 증가
- Adapter를 사용하기 위한 구조가 명확하게 정해져 있어 코드의 일관성과 가독성 유지가 용이
- 가변적인 셀 크기를 지원하는 리스트에 대한 사이즈 계산 이슈
- Compositional Layout에서 **Item, Group의 사이즈를 추정치(estimate)**로 설정 가능하지만,
셀이 그려질 때 정확한 사이즈가 계산되므로 레이아웃 워닝 지속 발생 (해결하지 못함) - Compositional Layout에서의 셀 사이즈 계산은 초기화 시점에 정의가 필요하며,
동적 사이즈 업데이트가 불가 (셀 사이즈 계산이 정적임)
- Compositional Layout에서 **Item, Group의 사이즈를 추정치(estimate)**로 설정 가능하지만,
- 각 기능마다의 플로우가 명확하고, 기능(Feature)이 독립적이라고 판단함
- 기능(Feature) 간의 화면 전환이 필요함
- 각 기능(Feature)마다 Example 앱을 별도로 만들어 테스트를 용이하게 진행하고자 함
- 앱 전반적으로 필요한 공통 로직을 Core라는 단위로 묶어 관리하고자 함
- 공통 로직을 Core 모듈로 분리하여 불필요한 로직과 코드 재사용을 제거해 가독성을 높임
- 각 기능(Feature) 내부에서 화면 전환 플로우를 명확하게 정의해, 각각의 기능(Feature) 모듈들이 서로 의존하지 않고도 화면 전환이 가능해져 화면 플로우 관리가 용이
- Micro-Features Architecture 형태로 모듈 구조를 만들어보고자 도전했지만, Feature 모듈만 구분하여 추가하고 Feature의 Example 및 Test는 적용하지 못함