Menu
Menu
Posts List
  1. Core Data 모델 로드 시 리소스 번들을 우선 사용하는 이유
    1. 1. 프레임워크 번들
    2. 2. 리소스 번들
    3. 3. 안전한 처리 방식
    4. 4. 요약

CoreData Bundle

Core Data 모델 로드 시 리소스 번들을 우선 사용하는 이유

1. 프레임워크 번들

일반적으로 .xcdatamodeld를 프레임워크 타깃에 포함시키면, 빌드 결과로 나온 .momd 파일은 프레임워크 번들 내부에 들어간다.

이 경우에는 단순히 접근해도 모델을 정상적으로 찾을 수 있다.

1
let bundle = Bundle(for: CoreDataManager.self)

2. 리소스 번들

하지만 빌드/배포 방식에 따라 .momd별도의 리소스 번들 안으로 들어가는 경우가 있다.
대표적인 예시:

  • CocoaPods: resource_bundles를 사용했을 때
  • 정적 프레임워크 + 리소스 번들 타깃을 분리했을 때
  • 특정 빌드 설정으로 리소스를 따로 묶었을 때

이런 경우 산출물 구조는 다음과 같다.

1
2
3
AssignmentSDK.framework/
└── AssignmentSDKResources.bundle/
└── AssignmentSDKModel.momd

즉, 프레임워크 번들에는 모델이 없고, 리소스 번들에만 존재!!


3. 안전한 처리 방식

빌드 환경에 따라 리소스 위치가 달라질 수 있으므로, 보통 다음과 같이 처리하면 좋다.

1
2
3
4
5
let sdkBundle = Bundle(for: CoreDataManager.self)

let resourceBundle =
sdkBundle.url(forResource: "AssignmentSDKResources", withExtension: "bundle")
.flatMap(Bundle.init(url:)) ?? sdkBundle
  • 리소스 번들이 있으면 → 그 안에서 모델을 탐색
  • 없으면 → 프레임워크 번들에서 모델을 탐색

4. 요약

  • 모델이 프레임워크 번들에 있으면 Bundle(for:)만으로 충분!
  • 모델이 리소스 번들에만 있으면 Bundle(url:)로 해당 번들을 직접 로드!
  • 따라서 “리소스 번들을 우선 확인 → 없으면 프레임워크 번들 사용” 하는 것이 가장 안전한 방법