Core Data는 iOS에서 객체 그래프와 데이터 영속화를 관리하는 중요한 프레임워크입니다. Quick-Kick 프로젝트에서는 킥보드의 닉네임, 상태, 이용 기록 등을 저장하는 데 Core Data를 사용합니다.
핵심 정리:
모델 정의:
Core Data 모델에서 Kickboard 엔티티는 nickName, isSaddled, isOccupied, startTime, endTime, latitude, longitude, address 속성을 가지고 있습니다.
CoreDataManager:
Core Data와 상호작용하는 CoreDataManager 싱글톤 클래스가 구현되었습니다.
주요 기능:
fetch(): Core Data에서 데이터를 가져옵니다.
create(): DTO(Data Transfer Object)를 사용해 데이터를 저장합니다.
delete(): 데이터를 삭제합니다.
saveContext(): 변경사항을 안전하게 영구 저장합니다.
DTO 패턴:
Core Data 엔티티와 비즈니스 로직을 분리하기 위해 KickboardDTO를 도입했습니다. 이를 통해 데이터 테스트와 관리가 더 쉬워졌습니다.
코드 예시:
func fetch() -> [KickboardDTO] {
let entities = fetchEntities()
return entities.map { $0.toDTO() }
}
DTO를 통해 엔티티 데이터를 변환하여 Core Data에 직접적으로 의존하지 않고도 데이터를 사용할 수 있게 했습니다.
최적화:
fetchRequest()와 같은 Core Data 요청 로직은 헬퍼 메서드에 캡슐화하여 코드 중복을 방지하고 가독성을 높였습니다.
Core Data가 복잡한 관계형 데이터를 처리하는 데 사용된다면, UserDefaults는 가벼운 키-값 저장소로 적합합니다. Quick-Kick에서는 사용자 설정 및 로그인 상태를 관리하기 위해 UserDefaults를 사용합니다.
핵심 정리:
Quick-Kick에서의 활용:
로그인 상태:
사용자가 로그인했는지 여부를 추적합니다.
사용자 정보:
이메일, 닉네임 등의 정보를 빠르게 접근할 수 있도록 저장합니다.
예시 코드:
UserDefaultsManager.shared.setLoggedOut()
let user = UserDefaultsManager.shared.getUser()
캡슐화:
UserDefaultsManager 클래스를 통해 모든 UserDefaults 작업을 중앙 집중화하여 코드 재사용성을 높이고 유지보수를 용이하게 했습니다.
앱 곳곳에서 UserDefaults.standard를 직접 호출하지 않도록 방지했습니다.
장점:
자주 사용하는 속성 데이터를 쉽게 가져올 수 있습니다.
키 관리가 체계적으로 이루어집니다.
Quick-Kick 프로젝트는 MVC(Model-View-Controller) 아키텍처를 기반으로 설계되었으며, 컴포넌트의 모듈화를 신경 써서 구현했습니다.
핵심 정리:
모델:
Core Data 엔티티(Kickboard)와 DTO(KickboardDTO)가 데이터 계층을 구성합니다.
데이터 로직은 뷰(View)와 분리하여 책임을 분산했습니다.
뷰(View):
HistorySectionView와 KickboardSectionView와 같은 커스텀 뷰가 UI 렌더링과 레이아웃을 담당합니다.
동적 데이터 표시:
예를 들어, HistorySectionView는 "QuickBoard" 이미지를 포함한 킥보드 이용 내역 리스트를 표시합니다.
createHistoryView() 메서드와 같은 모듈화된 함수로 데이터를 동적으로 추가합니다.
컨트롤러(Controller):
MyPageViewController 및 AddKickboardViewController와 같은 컨트롤러는 사용자 상호작용을 관리합니다.
역할:
CoreDataManager를 사용해 데이터를 가져옵니다.
뷰에 데이터를 전달합니다.
로그아웃, 네비게이션 등 사용자 액션을 처리합니다.
재사용 가능한 Delegate:
ModalViewDelegate와 같은 프로토콜을 활용해 뷰와 컨트롤러 간의 통신을 표준화했습니다.
예시:
func didCompleteModalAction() {
print("Modal action completed in AddKickboardViewController")
}
문제점:
Core Data의 디버깅:
UI에 N/A 값이 표시되는 문제는 Core Data 엔티티와 DTO 간의 매핑 오류로 인해 발생했습니다. 이를 DTO에 기본값을 추가하고 변환 로직을 확인하여 해결했습니다.
Protocol Conformance 오류:
ModalViewDelegate 프로토콜의 일부 메서드가 구현되지 않아 컴파일 오류가 발생했습니다. 프로토콜 메서드를 모두 구현하여 문제를 해결했습니다.
해결 방법:
더미 데이터를 활용한 테스트:
Core Data 의존성을 줄이고 UI 테스트를 위해 하드코딩된 더미 데이터를 활용했습니다.
let dummyHistories = [
("24.12.01", "15:00 - 15:30"),
("24.12.01", "15:00 - 15:30"),
("24.12.01", "15:00 - 15:30")
]
historySectionView.configure(with: dummyHistories)
코드 재사용성 개선:
반복되는 로직(예: 개별 뷰 생성)을 모듈화하여 코드 가독성과 유지보수를 향상시켰습니다.
오늘의 작업을 통해 Core Data와 UserDefaults의 균형 잡힌 활용이 얼마나 중요한지 확인할 수 있었습니다. DTO 패턴, 프로토콜 기반의 델리게이트, 캡슐화를 도입함으로써 앱의 유지보수성과 확장성을 크게 개선할 수 있었습니다.
UI와 데이터 통합이 정상적으로 작동하면서, Quick-Kick은 이제 실질적인 데이터 시나리오와 추가 기능 확장을 위한 준비가 되었습니다.