ABC Local Package Map

ABC 로컬 SPM 패키지를 어떤 순서로 읽어야 하는가

이 문서는 `mstove-ios` 안의 로컬 Swift Package들을 그룹별로 정리하고, 어디부터 보면 프로젝트 구조를 가장 빨리 이해할 수 있는지 안내하는 지도다.

Observed from Package.swift files Discussion starter for package-by-package review
학습 날짜

2026-04-10

처음 보는 사람용 한 줄 설명

이 프로젝트는 하나의 거대한 앱 코드베이스가 아니라, `App`, `Core`, `Feature`라는 여러 부품 상자로 쪼갠 구조다. 그래서 “어떤 상자가 기반이고 어떤 상자가 기능인지”부터 알면 전체가 훨씬 쉬워진다.

패키지 그룹 전체 지도

flowchart TD
    A[App packages]
    B[Core packages]
    C[Feature packages]

    A --> A1[앱 공통 서비스 / 리소스 / 인터페이스]
    B --> B1[네트워크 / 유틸 / 정책 / SDK 래퍼]
    C --> C1[실제 화면 / 기능 조합]
        
읽는 기본 원칙: Core를 먼저 보고, App 공통 모듈을 보고, 마지막에 Feature를 보는 순서가 가장 빠르다.

App 패키지 수

25개

  • `Resource`, `Environment`, `TokenManager`, `ProfileManager` 같은 앱 공통 기능
  • `...Interface` 계열은 계약용 인터페이스 모듈
  • `MStoveBaseUI`, `RemoteConfig`, `RealtimeEventStream` 등도 포함

Core 패키지 수

8개

  • `MStoveBaseUtil`, `MStoveNetwork`, `MStovePolicy`, `MStoveSDKWrapper`
  • 기반 유틸과 SDK 래퍼가 집중된 층
  • 프로젝트 이해의 출발점으로 가장 중요

Feature 패키지 수

18개

`MStoveV3Home`, `StreamingPlay`, `SGSSocialUI`, `Notice`, `QRLogin`처럼 실제 제품 기능이 들어 있는 층이다. 보통 이 계층이 가장 의존성이 많고, 가장 무겁다.

그룹별 패키지 목록

그룹 패키지
App `ABTest`, `Biometric`, `BlockUserInterface`, `CookieManager`, `Environment`, `GOTPLib`, `HomeTemplate`, `LocalNotificationManager`, `LoginState`, `MStoveBaseUI`, `MStoveChatManager`, `OTPServiceInterface`, `PerformanceTraceInterface`, `ProfileManager`, `RealtimeEventManagerInterface`, `RealtimeEventStream`, `RemoteConfig`, `RemoteNotification`, `Resource`, `SchemeInterface`, `SocialSchemeInterface`, `TinodeEventManager`, `TinodeServiceExtension`, `TokenManager`, `TokenManagerInterface`
Core `MStoveBaseUtil`, `MStoveNetwork`, `MStoveNetworkInterface`, `MStovePolicy`, `MStoveSDKWrapper`, `MStoveSDKWrapperInterface`, `NotificationUtils`, `SGSSocialData`
Feature `CharacterShop`, `Gamification`, `GamificationList`, `LanguageSetup`, `LoginHistory`, `MStoveV3EditProfile`, `MStoveV3Home`, `MStoveV3Login`, `Notice`, `OneTimeLogin`, `PlatformPopup`, `QRLogin`, `RemoteLogout`, `SGSSocialUI`, `SecondAuthenticationOTP`, `SocialScene`, `StoveGameString`, `StreamingPlay`

의존성이 많은 패키지 상위권

패키지 로컬 의존성 외부 의존성 해석
`Feature/SGSSocialUI` 10 8 소셜 기능을 위한 상위 조합 모듈로 보인다.
`Feature/MStoveV3Home` 12 5 앱 메인 허브 성격의 기능 모듈이다.
`Feature/StreamingPlay` 11 5 실시간 재생 관련 무거운 상위 feature다.
`Feature/Gamification` 10 2 로컬 조합이 강한 기능 모듈이다.
`App/MStoveChatManager` 8 2 App 계층 안에서도 꽤 무거운 관리 모듈이다.
패키지별 논의를 시작할 때는 무조건 많은 의존성부터 보기보다, 기반을 먼저 이해한 뒤 무거운 feature로 올라가는 순서가 낫다.

추천 읽기 순서

  1. `Core/MStoveBaseUtil`
  2. `Core/MStoveNetwork` 와 `Core/MStoveNetworkInterface`
  3. `Core/MStoveSDKWrapper` 와 `Core/MStoveSDKWrapperInterface`
  4. `App/Resource`, `App/Environment`, `App/TokenManager`
  5. `App/MStoveBaseUI`, `App/ProfileManager`, `App/RemoteConfig`
  6. `Feature/MStoveV3Home`
  7. `Feature/StreamingPlay`
  8. `Feature/SGSSocialUI`
이 순서는 “기반 -> 앱 공통 -> 대표 feature” 순서다. 바로 `Feature/MStoveV3Home`부터 보면 왜 저 패키지가 많은 걸 끌고 오는지 맥락이 안 잡힐 수 있다.

Then 1

가장 먼저 어디를 보면 좋나?

`Core/MStoveBaseUtil`, `Core/MStoveNetwork`, `App/Resource`, `App/Environment`부터 보는 게 좋다. 이걸 알아야 feature 패키지 안의 import와 dependency가 읽힌다.

Then 2

왜 Feature부터 바로 보면 안 되나?

Feature는 대부분 상위 조합 지점이라 이미 많은 기반 모듈을 끌고 온다. 기반 모듈을 모르면 feature는 “왜 이렇게 복잡하지?”만 남고 구조가 잘 안 보인다.

Then 3

무거운 패키지는 무엇을 의미하나?

보통 여러 도메인을 묶는 상위 조합 계층이라는 뜻이다. 꼭 나쁜 것은 아니지만, 결합도가 커지고 변경 영향 범위가 넓어질 가능성은 있다.

Then 4

이제 어떻게 논의하면 좋나?

다음부터는 패키지 하나를 잡고 “이 패키지는 무슨 역할인지, 누구를 의존하는지, 누가 이 패키지를 쓰는지, 외부 패키지는 왜 붙는지” 순서로 보면 된다.

다음 논의 후보