Firebase 관련 모듈들의 의존성 문제를 해결하면서 겪은 이슈와 해결 과정을 정리해보려고 한다.
현재 프로젝트는 다음과 같은 구조로 되어있다:
let project = Project(
name: "AppCraft",
packages: [
.remote(
url: "https://github.com/pointfreeco/swift-composable-architecture",
requirement: .upToNextMajor(from: "1.8.0")
),
.remote(
url: "https://github.com/firebase/firebase-ios-sdk",
requirement: .branch("main")
)
],
targets: [...]
)
이 구조에서:
CoreDatabase가 FirebaseFirestore를 참조
CoreAuth가 CoreDatabase와 FirebaseAuth를 참조
각 모듈이 staticFramework로 설정되어 있어서 중복 구현 에러 발생
Copyobjc[41982]: Class ... is implemented in both ... and ... One of the two will be used. Which one is undefined.
해결 과정
모든 모듈을 staticFramework에서 framework로 변경
swiftCopyTarget(
name: "CoreDatabase",
platform: .iOS,
product: .framework, // .staticFramework에서 변경
...
)
CoreAuth와 CoreDatabase 모듈 통합
Firebase 관련 의존성을 한 곳에서 관리하기 위해 CoreAuth 로직을 CoreDatabase로 이동
의존성 순환 문제 해결
코드 중복 제거
남은 과정
Preview 동작 이슈는 아직 해결해야 할 문제로 남아있음
배운 점
framework와 staticFramework의 차이점
framework
동적 링크 방식
런타임에 로드됨
여러 타겟이 하나의 프레임워크를 공유
메모리 효율적
앱 크기 감소
staticFramework
정적 링크 방식
빌드 시점에 바이너리에 포함
각 타겟마다 복사본 생성
메모리/용량 증가
iOS 버전 호환성 좋음
Firebase같은 외부 의존성은 한 모듈에서 관리하는 것이 좋다
의존성 충돌 방지
코드 중복 최소화
유지보수 용이
이렇게 모듈 구조를 개선하니 빌드는 성공적으로 됐다. Preview 이슈는 다음 글에서 다뤄보도록 하겠다.