“저장된 이미지를 한눈에 보여주고,
이미지를 누르면 해당 일기(게시글)로 이동하게 만들고 싶어요!”
많은 앱들이 이런 UI를 가지고 있습니다.
대표적으로 인스타그램, 네이버 블로그, 다이어리 앱 같은 경우죠.
그리드 형태로 이미지를 보여주고,
해당 이미지를 탭하면 그 이미지가 속한 게시글(또는 일기)로 이동합니다.
이런 기능을 Core Data로 구현하려면
반드시 관계형(1:N) 구조 설계가 필요합니다.
🔹 1️⃣ 우리가 만들고 싶은 구조
사용자가 작성한 감정일기(EmotionDiary) 안에는 여러 장의 이미지가 들어갑니다.
그리고 나중에는 이렇게 보여주고 싶어요 👇
“저장된 이미지만 따로 모아 보여주고,
이미지를 탭하면 해당 일기로 이동”
즉, 인스타그램 피드처럼 이미지 중심 탐색 구조입니다.

🔹 2️⃣ Core Data에서 필요한 설계
이 구조를 만들려면 Core Data에서 다음과 같이 관계를 설정해야 합니다 👇
EmotionDiaryEntity (일기)
└──> DiaryImageEntity (이미지)
EmotionDiaryEntity: 감정, 내용, 작성 날짜 등의 일기 정보
DiaryImageEntity: 실제 이미지의 파일 경로(imagePath), 식별자 등
이 둘은 1:N 관계로 연결됩니다.
즉, 한 개의 일기에 여러 이미지가 연결될 수 있습니다.
class EmotionDiaryEntity: NSManagedObject {
@NSManaged var id: UUID
@NSManaged var emotion: String
@NSManaged var content: String
@NSManaged var createdAt: Date
@NSManaged var images: NSSet? // To-Many 관계
}
class DiaryImageEntity: NSManagedObject {
@NSManaged var id: UUID
@NSManaged var imagePath: String
@NSManaged var diary: EmotionDiaryEntity? // 역참조 (To-One 관계)
}
🔹 3️⃣ “이미지를 먼저 불러오고 → 어떤 일기에 속했는지 찾는 구조”
이제 Core Data에서 DiaryImageEntity만 따로 불러오면,
해당 이미지가 속한 일기도 함께 참조할 수 있습니다.
let fetchRequest: NSFetchRequest<DiaryImageEntity> = DiaryImageEntity.fetchRequest()
do {
let images = try context.fetch(fetchRequest)
for imageEntity in images {
print("이미지 경로:", imageEntity.imagePath)
print("이 이미지는 다음 일기에 속함:", imageEntity.diary?.content ?? "연결된 일기 없음")
}
} catch {
print("이미지 불러오기 실패:", error)
}
이 코드 한 줄로
✅ 모든 이미지를 한 번에 불러올 수 있고,
✅ 각 이미지가 어떤 일기에 속하는지도 바로 확인할 수 있습니다.
🔹 4️⃣ Transformable [String] 방식으로는 불가능한 이유
일부 개발자들은 다음처럼 [String] 배열로 이미지 경로를 저장하려고 합니다.
class EmotionDiaryEntity: NSManagedObject {
@NSManaged var id: UUID
@NSManaged var imagePaths: [String]? // Transformable 타입
}
겉보기엔 간단하지만, 이 구조로는 이런 기능이 불가능합니다 👇
| 기능 | 가능 여부 | 이유 |
| 전체 이미지 한 번에 불러오기 | ❌ | 각 일기의 배열을 전부 펼쳐야 함 |
| 이미지가 속한 일기 찾기 | ❌ | 역참조가 불가능 |
| 이미지 삭제/정렬/메타데이터 관리 | ❌ | 배열 전체를 다시 저장해야 함 |
🔹 5️⃣ 관계형(1:N) 구조의 강력함
관계형 구조에서는 DiaryImageEntity 안에서 바로 EmotionDiaryEntity를 참조할 수 있습니다.
즉, 이미지를 누르면 바로 “그 일기”를 찾아갈 수 있죠 👇
func didSelectImage(_ image: DiaryImageEntity) {
if let diary = image.diary {
let detailVC = DiaryDetailViewController(diary: diary)
navigationController?.pushViewController(detailVC, animated: true)
}
}
이 구조로 구현하면 인스타그램과 같은 흐름이 가능합니다.
✅ 이미지 피드 화면 →
✅ 이미지 클릭 →
✅ 연결된 일기 상세 화면으로 이동
🔹 6️⃣ 실제 데이터 흐름
Core Data 내부에서는 이렇게 동작합니다 👇
| 단계 | 데이터 흐름 |
| ① | DiaryImageEntity 전체 fetch |
| ② | 각 이미지의 diary 프로퍼티로 연결된 일기 접근 |
| ③ | 사용자가 이미지를 탭하면 해당 일기로 이동 |
이 구조는 Core Data의 관계형 ORM(Object Relational Mapping) 기능을 100% 활용하는 예시입니다.
✅ 결론
🎯 인스타그램처럼
“이미지 중심의 피드”를 만들고,
이미지를 눌러 “해당 게시글(일기)”로 이동하는 구조를 만들려면
Core Data의 1:N 관계형 설계는 필수입니다.
Transformable [String] 방식은 단순 저장에는 편리하지만,
검색・연결・탐색 구조를 구현할 수 없습니다.
이 구조를 잘 설계해두면,
나중에 “이미지 태그별 보기”, “감정별 이미지 필터링”, “날짜순 정렬” 같은 기능도
손쉽게 확장할 수 있습니다.
Core Data의 관계형 설계는 복잡해 보이지만,
이런 데이터 탐색형 앱에서는 선택이 아니라 필수적인 기반이에요. ✅
'감정일기(가칭)' 카테고리의 다른 글
| 🧩 Core Data 설계할 때, “나중에 쓸 속성”을 지금 넣어야 할까? (0) | 2025.10.16 |
|---|---|
| 🧠 Core Data + Enum: 감정(EmotionCategory) case를 추가·변경할 때 생기는 문제와 해결법 (0) | 2025.10.16 |
| 🧩 Core Data에서 여러 이미지를 저장하는 두 가지 방법 비교 (0) | 2025.10.16 |
| 📱 iOS에서 사용자가 선택한 이미지를 FileManager에 저장하는 이유 (0) | 2025.10.16 |
| 🚀 iOS에서 앱 로고를 보여주는 두 가지 방식 — LaunchScreen vs SplashViewController 완전 정리 (0) | 2025.10.15 |