본문 바로가기
감정일기(가칭)

📸 Core Data에서 ‘이미지 피드 + 게시글 연결’ 기능을 설계하는 방법

by 밤새는 탐험가89 2025. 10. 16.
728x90
SMALL

“저장된 이미지를 한눈에 보여주고,
이미지를 누르면 해당 일기(게시글)로 이동하게 만들고 싶어요!”

 

많은 앱들이 이런 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의 관계형 설계는 복잡해 보이지만,
이런 데이터 탐색형 앱에서는 선택이 아니라 필수적인 기반이에요. ✅

728x90
LIST