감정일기(가칭)

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

밤새는 탐험가89 2025. 10. 16. 05:31
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