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

🧠 Core Data + Enum: 감정(EmotionCategory) case를 추가·변경할 때 생기는 문제와 해결법

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

Core Data를 쓸 때, 우리는 종종 Enum(rawValue) 기반으로 데이터를 저장합니다.
예를 들어 감정일기 앱을 만든다면 이런 구조가 많죠 👇

enum EmotionCategory: String, CaseIterable {
    case happy
    case sad
    case angry
    case anxious
    case calm
    case excited
}

 

그리고 Core Data에는 이렇게 저장됩니다 👇

emotion (String)  content
"happy" 오늘은 정말 행복했다
"sad" 조금 울적한 하루였다

 

즉, Core Data에는 EmotionCategory 자체가 아니라
rawValue(문자열) 형태로 저장되는 거예요.

 

이 방식은 단순하고, 앱 내부에서도 Enum으로 쉽게 변환할 수 있어서 많이 쓰이죠.

그런데!
앱이 출시된 뒤 감정 종류를 추가하거나 이름을 바꿔야 할 때,
어떤 일이 일어날까요?


💡 1️⃣ 새 감정을 “추가”하는 것은 안전하다

예를 들어 새로운 감정 "tired"(피곤함)을 추가한다고 해봅시다.

enum EmotionCategory: String, CaseIterable {
    case happy
    case sad
    case angry
    case anxious
    case calm
    case excited
    case tired // ✅ 새로 추가
}

 

이 경우에는 아무 문제 없습니다.
기존 데이터 "happy", "sad" 등은 그대로 남고,
Core Data에 저장된 문자열들은 여전히 Enum과 매칭되죠.

 

✅ 앱이 업데이트되어도
✅ 기존 데이터가 깨지지 않고
✅ 새 감정은 이후 새로 작성된 일기부터 사용 가능

 

즉, case 추가는 완전히 안전합니다.


⚠️ 2️⃣ 감정 이름(rawValue)을 “수정”하면 문제가 생긴다

이제 "happy"를 "joyful"로 바꾼다고 해봅시다.

// ❌ 위험한 변경
enum EmotionCategory: String, CaseIterable {
    case joyful   // "happy"를 대체
    case sad
    case angry
    ...
}

 

Core Data에는 여전히 "happy"라는 문자열이 저장되어 있습니다.
그런데 이제 Enum에는 "happy" case가 없어요.

따라서 이런 코드가 실행되면 👇

EmotionCategory(rawValue: "happy") // nil 반환

 

앱에서는 감정이 변환되지 않아 nil로 나옵니다.
결과적으로 “감정 없음” 상태처럼 보이게 되죠.

 

⚠️ 즉, 데이터는 존재하지만 Enum 매핑이 끊기게 됩니다.


⚠️ 3️⃣ 감정을 “삭제”하는 경우도 동일한 문제

만약 case angry를 아예 없애면?

기존에 "angry"로 저장된 데이터는 여전히 Core Data에 남아 있지만,
이제 Enum에는 해당 값이 없기 때문에 변환이 불가능해집니다.

 

결국 "angry" 데이터는 앱에서 표시되지 않아요.


🧩 4️⃣ 해결책: 데이터 마이그레이션

감정 이름을 바꿔야 한다면, 기존 Core Data 데이터를 변환해야 합니다.

앱 실행 시 한 번만 돌려주는 마이그레이션 코드 👇

let request: NSFetchRequest<EmotionDiaryEntity> = EmotionDiaryEntity.fetchRequest()

do {
    let results = try context.fetch(request)
    for diary in results {
        if diary.emotion == "happy" {
            diary.emotion = "joyful" // 새 이름으로 업데이트
        }
    }
    try context.save()
} catch {
    print("마이그레이션 실패:", error)
}

 

이 코드는 "happy" → "joyful"로 기존 데이터를 안전하게 교체합니다.
이후부터 앱은 정상적으로 동작합니다 ✅


💡 5️⃣ Enum 이름 변경이 잦다면? ID 기반 설계를 고려하자

감정 이름이나 번역을 자주 바꿀 가능성이 있다면,
Core Data에는 문자열 대신 숫자 ID(Int) 를 저장하는 게 더 안전합니다.

enum EmotionCategory: Int, CaseIterable {
    case happy = 0
    case sad
    case angry
    case anxious
    case calm
    case excited
}

 

Core Data 속성을 emotionId: Int16으로 만들어두면,
이제 감정 이름을 바꾸거나 언어를 바꿔도 데이터는 절대 깨지지 않습니다.

 

이름은 UI에서 자유롭게 바꿀 수 있고,
Core Data는 고정된 숫자 ID로 영구 보존됩니다. ✅


 

🧭 결론

1. 감정(Enum) case 추가는 아무런 문제 없이 안전하다.

2.하지만 case 이름을 바꾸거나 삭제하면 Core Data에 저장된 문자열과 매칭이 끊겨,
 앱에서 데이터가 표시되지 않을 수 있다.

3. 이런 경우엔 데이터 마이그레이션으로 기존 데이터를 변환해야 한다.

4. 감정 목록이 자주 바뀔 가능성이 있다면,
String 대신 Int(rawValue) 기반으로 저장하는 게 가장 안전한 방법이다. ✅

 

728x90
LIST