Skip to content

Module Structure

JEONG edited this page Jun 29, 2026 · 2 revisions

Module Structure

Tuist 기반 UMCApp/ 모듈 구조와 의존성 방향. 빌드 명령은 Build & Run 참고.

두 빌드 축

형태 상태
UMCApp/ Tuist 활성 — 모든 신규·유지보수 작업 대상
AppProduct/ xcodeproj 레거시, v2.2.0 동결 (열람/참고 전용)

UMCApp 전체 구조

UMCApp/
├── Makefile                       # 빌드/생성 래퍼 (mise exec 기반)
├── MAKEFILE_GUIDE.md              # 팀원용 사용 가이드
├── mise.toml                      # tuist 버전 고정 (4.155.0)
├── Project.swift                  # 앱 타겟 정의
├── Workspace.swift                # 전체 워크스페이스 (Core/*, Features/* glob + Widget/Watch)
├── Tuist.swift                    # Tuist 시스템 설정
├── Tuist/
│   ├── Package.swift              # SPM 외부 의존성 (Moya, Kingfisher)
│   └── ProjectDescriptionHelpers/
│       ├── Project+Core.swift     # Core 모듈 공통 헬퍼
│       └── Project+Feature.swift  # Feature 모듈 공통 헬퍼
├── Core/                          # 8개 공유 인프라 모듈
│   ├── Foundation/                # 기반 유틸리티, Config
│   ├── Network/                   # 네트워크 레이어 (Moya)
│   ├── DesignSystem/              # 디자인 토큰, 색상
│   ├── UIComponents/              # 공용 UI 컴포넌트 (Kingfisher)
│   ├── DI/                        # 의존성 주입 컨테이너
│   ├── NearbyExchange/            # 근거리 명함 교환 인프라
│   ├── WatchConnectivity/         # iOS ↔ watchOS 통신
│   └── WidgetShared/              # Widget-App 공유 모델
├── Features/                      # 8개 기능 모듈
│   ├── Activity/
│   ├── Auth/
│   ├── Badge/
│   ├── BusinessCard/              # 전자명함 (3D 렌더링 캡슐화 경계 모듈)
│   ├── Community/
│   ├── Home/
│   ├── MyPage/
│   └── Notice/
├── UMCAppWidget/                  # Widget Extension 타겟
└── UMCWatchApp/                   # watchOS Companion App 타겟

모듈 의존성 방향

App Target (UMCApp)
    ↓
Feature Presentation  (Domain + CoreDesignSystem + CoreUIComponents)
    ↓
Feature Domain        (UMCFoundation)
Feature Data          (Domain + CoreNetwork + UMCFoundation)
    ↓
Core Modules          (Foundation / Network / DesignSystem / UIComponents / DI)
    ↓
External Packages     (Moya 15.0.3 / Kingfisher 8.6.1)

경계 정책 — BusinessCard: Model3D/RealityView 등 RealityKit 렌더링은 BusinessCardPresentation 내부에만 캡슐화한다. 명함을 노출하는 다른 Feature는 BusinessCardPresentation만 링크하며 RealityKit을 직접 링크하지 않는다.

Feature 모듈 = 3개 타겟

각 Feature는 Clean Architecture에 따라 3개 타겟으로 분리됩니다.

타겟 Product Type Bundle ID 패턴 Sources
{Name}Domain .staticFramework dev.umc.feature.{name}.domain Domain/Sources/**
{Name}Data .staticFramework dev.umc.feature.{name}.data Data/Sources/**
{Name}Presentation .staticFramework dev.umc.feature.{name}.presentation Presentation/Sources/**

ProjectDescriptionHelpers

보일러플레이트 제거를 위한 헬퍼 함수:

// Core 모듈 생성
coreProject(
    name: "CoreNetwork",
    bundleIdSuffix: "network",
    dependencies: [.target(name: "UMCFoundation"), .external(name: "Moya")]
)

// Feature 모듈 생성 (3개 타겟 자동 생성)
featureProject(
    name: "Auth",
    domainExtraDependencies: [],
    dataExtraDependencies: [],
    presentationExtraDependencies: []
)

주요 설정

항목
Tuist 버전 UMCApp/mise.toml 고정 (4.155.0)
Deployment Target iOS 26.3 (전체 타겟 공통)
Product Type 모든 모듈 .staticFramework
Bundle ID Core → dev.umc.core.* / Feature → dev.umc.feature.*.*
외부 의존성 Moya 15.0.3 (CoreNetwork) / Kingfisher 8.6.1 (CoreUIComponents)

Tuist 버전을 올릴 때는 mise.toml 수정하고 PR 본문에 릴리스 노트를 첨부합니다. Makefile / 로컬 tuist 설치는 손대지 않습니다.

레거시 AppProduct 구조 (참고)

AppProduct/AppProduct/
├── Core/            # Alert, Common(DesignSystem/Enum/Error/UIComponents), DIContainer, Manager, Navigation, NetworkAdapter, Secret
├── Utilities/       # Extensions, Keychain, Modifier, RemoteImage, Shadow, ToolBar
└── Features/        # Activity, Auth, Community, Home, MyPage, Notice, Splash, Tab

AppProduct는 v2.2.0에 동결되어 있습니다. 수정하지 않습니다.


관련 문서: Build & Run · Architecture

Clone this wiki locally