Skip to content

Conversation

@mini-min
Copy link
Member

@mini-min mini-min commented Nov 9, 2025

📝 Summary

피의자 데이터를 그동안 받아오지 않던 부분 (CaseListView, OnePageView) 연결을 진행했습니다.
그리고 이미지 데이터를 처리하던 방식을 변경했습니다.

🔨 What

1️⃣ CaseListView & OnePageView 피의자 데이터 연동

  • 기존에는 CaseRepository에서 Suspect 정보를 가져오지 않아, 피의자 이름 / 프로필 이미지 / 범죄명 등의 정보가 UI에 표시되지 않았음.
  • 이제 fetchCases()fetchAllDataOfSpecificCase(for:) 내부에서
    SuspectEntity → Case 모델 변환 시 피의자 관련 데이터 (name, profileImage) 를 함께 매핑하도록 수정함.
  • OnePageView 진입 시 caseID를 기반으로 Case와 Suspect 정보를 함께 불러와, 상단의 FadingProfileImage, 피의자명, 범죄명이 실제 데이터로 표시됨.

2️⃣ 이미지 데이터 저장 방식 리팩토링

  • 기존 문제점: 이미지 데이터를 Base64 인코딩 문자열 형태로 CoreData에 직접 저장했음.
    → 이 방식은 코드가 단순하지만, 메모리 사용량이 많고 디스크 접근 속도가 느림.

  • 개선점: FileManager 기반 BinaryData 접근
    -> 이제 이미지는 FileManager를 통해 앱 Sandbox 내 전용 디렉터리(Documents/CaseImages/)에 UUID.jpg 형태로 개별 파일로 저장되며, CoreData에는 단순히 파일 경로 (String) 만 저장함.

  • 이렇게 변경함으로써 얻는 장점은 다음과 같음:

    • ✅ 메모리 효율성 향상 — Base64 대비 저장 크기 감소
    • ✅ I/O 성능 개선 — CoreData BLOB 필드 접근보다 빠름
    • ✅ 유연한 관리 — 필요 시 파일 단위 삭제, 캐싱 등 관리 가능

3️⃣ DWEffect 전역 메서드 merge(_:) 추가

  • 여러 개의 DWEffect를 병렬로 실행하기 위해 새로운 정적 메서드 추가했음.

  • 이 메서드는 withTaskGroup을 활용해 전달된 모든 이펙트를 동시에 실행하고, 각각이 발생시키는 Action을 reducer로 다시 전파함.

    /// 여러 개의 이펙트를 동시에 실행하여, 각각이 방출하는 액션들을 모두 전달합니다.
    ///
    /// - Parameter effects: 동시에 실행할 여러 `DWEffect` 인스턴스.
    /// - Returns: 주어진 모든 이펙트를 병렬 실행하는 새로운 `DWEffect`.
    ///
    /// 이 메서드는 내부적으로 `withTaskGroup`을 사용하여 모든 이펙트를 병렬 실행합니다.
    /// 각 이펙트가 방출한 액션은 `Store`로 즉시 전파되어 reducer에 전달됩니다.
    public static func merge(_ effects: DWEffect<Action>...) -> DWEffect<Action> {
    .init { downstream in
    await withTaskGroup(of: Void.self) { group in
    for effect in effects {
    group.addTask {
    await effect.run(downstream)
    }
    }
    }
    }
    }

  • 즉, 아래와 코드와 같이 비동기 액션을 이제는 병렬로 처리할 수 있음:

  • 이전에는 Effect가 한 번에 하나의 작업만 수행 가능했지만, 이제 병렬적으로 여러 비동기 동작을 실행할 수 있어 / 화면 진입 시 Case / Location / Image 데이터를 동시에 불러오는 구조가 가능해짐.

    case let .onAppear(caseID):
    state.caseID = caseID
    let selection = state.selection
    return .merge(
    .task { .loadCaseInfo(caseID) },
    .task { .loadLocations(caseID, selection) }
    )

👀 Review Notes

  • 2️⃣번 부분 : 변경된 이미지 저장 방식 확인 !
  • 3️⃣번 부분 : DWEffect 내에 새로 추가된 전역 메서드 merge(_:) 부분 활용법 확인 !

mini-min added 6 commits November 9, 2025 10:40
What?
- DWCircleButton -> DWGlassEffectCircleButton으로 컴포넌트 수정
- 간격, 아이콘, 버튼 크기 조절
What?
- 기존 임시로 만들어둔 base64기반의 방식을 File Path 방식으로 변경합니다.

How?
- Data 파일에 `ImageFileStorage.swift` 전역 객체, 메서드 활용
- CoreData에는 String 타입의 파일 경로만 저장. 실제 이미지는 FileManager 상에 우리가 생성한 임의의 경로에 저장됨.

Why?
- base64방식은 이미지 파일의 용량이 매우 증가되어 저장되는 방식 (우리 앱에서 불필요)
- 효율이 떨어지고, 디코딩 시 성능 저하를 일으킬 수 있는 방식 -> FIleManager는 성능면에서 가장 높은 효율을 보이는 방식
- 개선된 방식은: CoreData 상에서는 실제 파일이 아니라 경로만 저장되므로, Core Data DB에 영향을 끼치지 않고 / 추후 공유시 이미지 캐싱이나 백업 처리에 유효한 방식으로 파악됨.
Why?
- 기존 Effect 중에서는 여러 개의 Effect로 방출시킬 수 있는 메서드가 없어, 해당하는 메서드 merge(_:)를 추가합니다.
- 예를 들어, 하나의 action으로 인해 두 개의 Repository에서 값을 가져오는 .task Effect를 호출해야하는 경우 해당 메서드를 사용해 구현할 수 있습니다.
What?
- OnePageView의 ProfileImage, suspectName, crime 정보를 CoreData 엔티티와 연동했습니다.
- OnePageFeature에 Case 정보를 받아오기 위한 caseRepositoryProtocol 의존성을 Factory 상에 추가했습니다.
@mini-min mini-min self-assigned this Nov 9, 2025
@mini-min mini-min added ✨ Feature 새로운 기능 구현 🐻‍❄️ Mini 천재만재 미니 선생님 작업입니다 모두 쉿 labels Nov 9, 2025
Copy link
Collaborator

@YooGyeongMo YooGyeongMo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굿

@mini-min mini-min merged commit 1b25498 into main Nov 10, 2025
@mini-min mini-min deleted the feat/#64 branch November 10, 2025 08:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 새로운 기능 구현 🐻‍❄️ Mini 천재만재 미니 선생님 작업입니다 모두 쉿

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[✨ Feat] 피의자 정보 연결 및 이미지 데이터 관리방식 정리

4 participants