RealM을 연동하여 못먹는음식 데이터를 Local DB에 저장합니다.#2
Merged
yanghojoon merged 2 commits intodevelopfrom May 25, 2022
Merged
Conversation
- RealMSwift dependency 추가 - 싱글톤 패턴을 적용한 RealMManager 타입 추가
- pageControl의 userInteraction이 안되도록 수정
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
배경
OnboardingPage에서 사용자가 제출한 못먹는음식 데이터를 Loacl DB에 저장하기 위해 Realm을 사용했습니다.작업 내용
1. Local DB 선택
Local DB 비교
아래와 같이 RealM, SQLite, CoreData 3개 DB를 비교한 결과, RealM을 채택했습니다.
*NoSQL (Not Only SQL) : SQL 외 여러 유형의 DB를 사용함
- 데이터 객체가 Objective-C 클래스로 표현되며, 가볍고 반응형임
- *데이터 컨테이너 모델을 사용함
*컨테이너 : OS상의 논리적인 구획(컨테이너)을 만들고, 앱 실행에 필요한 라이브러리/앱을 하나로 모아, 별도 서버처럼 사용하도록 만든 구조. 컨테이너는 오버헤드가 적으므로 가볍고 속도가 빠름
- Swift, Objective-C, Java, Kotlin, C#, JavaScript 등의 SDK를 제공
- 전통적인 테이블 지향 관계형 DB
*ORM (Object Relational Mapping) : OOP의 “객체” 및 관계형 DB의 데이터인 “테이블”을 매핑하는 구조
- 단일 사용자의 데이터를 저장하는 로컬 앱에 적합
- Persistence 기능은 SQLite에 의해 지원됨
- ORM 모델을 추상화한 구조
- 하나의 앱에서 여러 DB를 사용 가능
- 데이터를 객체 형태로 저장하여 DB에서 가져온 데이터를 앱에 즉시 사용 가능하고, CoreData 코드를 Realm으로 Migration하기 용이함
- 데이터 저장 용량이 무제한/무료
- iOS 및 Android 간의 DB 공유 가능
- Realm Studio를 통해 Finder로 DB 확인이 쉬움
- CoreData 대비 직관적인 코드
- DB 처리에 Main Thread를 사용하므로 안정적임 (장점이자 단점)
- 설정이 쉬움
- Thread-safe
- 다양한 OS에서 사용 가능 (MacOS X, iOS, Android, Window, Linux)
- SQLite 대비 속도가 빠름
- SQLite 대비 바이너리 용량이 큼
- 다양한 query를 지원하지 않음
- 데이터 용량이 큰 경우 부적합
- 접근 권한 종류가 한 가지 밖에 없음
- 메모리 및 저장공간 소모가 큼 (In-memory 방식은 메모리에 로딩된 객체만 수정 가능)
- 데이터 중복을 방지하는 unique key 기능이 없음
- Thread-unsafe
- 오버헤드 발생 가능
- Android 등 크로스 플랫폼을 지원하지 않음
기술스택 고려사항
2. RealM 연동
싱글톤 패턴을 적용하여 RealmManager 타입을 생성하고, realm 객체를 가지도록 했습니다. 또한 RealM 데이터 저장을 위한 객체 타입으로
DislikedFoodForRealM타입을 추가했습니다.OnboardingPage의 못먹는음식 화면에서확인 버튼을 Tap하는 이벤트를 받을 때마다, RealM에 못먹는음식 데이터를 업데이트 (기존 데이터 전체삭제, 새로운 데이터 추가)하도록 구현했습니다.3. Skip 버튼 구현
1, 2 페이지에서 Skip 버튼을 Tap한 경우, 바로 못먹는음식 페이지로 이동하도록 했습니다.
UIPageViewController의setViewControllers메서드를 활용하여 못먹는음식 페이지로 이동하도록 했고, 이 경우 기존pageControl과Skip버튼이 사라지도록 했습니다.테스트 방법
RealM Studio맥앱을 활용해 RealM 데이터가 정상적으로 저장되는지 확인했습니다.데이터 저장 경로의 경우 다음과 같은 방법으로 찾았습니다.
리뷰 노트
스크린샷