Skip to content

RealM을 연동하여 못먹는음식 데이터를 Local DB에 저장합니다.#2

Merged
yanghojoon merged 2 commits intodevelopfrom
feature/localSaving
May 25, 2022
Merged

RealM을 연동하여 못먹는음식 데이터를 Local DB에 저장합니다.#2
yanghojoon merged 2 commits intodevelopfrom
feature/localSaving

Conversation

@just1103
Copy link
Copy Markdown
Owner

배경

OnboardingPage에서 사용자가 제출한 못먹는음식 데이터를 Loacl DB에 저장하기 위해 Realm을 사용했습니다.

작업 내용

1. Local DB 선택

Local DB 비교

아래와 같이 RealM, SQLite, CoreData 3개 DB를 비교한 결과, RealM을 채택했습니다.

DB Realm ✅ SQLite CoreData
특징 - 모바일에 최적화된 *NoSQL DB 라이브러리로 가장 최근에 등장함
*NoSQL (Not Only SQL) : SQL 외 여러 유형의 DB를 사용함
- 데이터 객체가 Objective-C 클래스로 표현되며, 가볍고 반응형임
- *데이터 컨테이너 모델을 사용함
*컨테이너 : OS상의 논리적인 구획(컨테이너)을 만들고, 앱 실행에 필요한 라이브러리/앱을 하나로 모아, 별도 서버처럼 사용하도록 만든 구조. 컨테이너는 오버헤드가 적으므로 가볍고 속도가 빠름
- Swift, Objective-C, Java, Kotlin, C#, JavaScript 등의 SDK를 제공
- 전세계적으로 가장 많이 사용되는 SQL DB 라이브러리
- 전통적인 테이블 지향 관계형 DB
*ORM (Object Relational Mapping) : OOP의 “객체” 및 관계형 DB의 데이터인 “테이블”을 매핑하는 구조
- 단일 사용자의 데이터를 저장하는 로컬 앱에 적합
- 앱의 Model layer를 관리하기 위한 Apple의 First-party FrameWork (DB가 아님)
- Persistence 기능은 SQLite에 의해 지원됨
- ORM 모델을 추상화한 구조
장점 - SQLite 및 CoreData 대비 작업 속도가 빠름
- 하나의 앱에서 여러 DB를 사용 가능
- 데이터를 객체 형태로 저장하여 DB에서 가져온 데이터를 앱에 즉시 사용 가능하고, CoreData 코드를 Realm으로 Migration하기 용이함
- 데이터 저장 용량이 무제한/무료
- iOS 및 Android 간의 DB 공유 가능
- Realm Studio를 통해 Finder로 DB 확인이 쉬움
- CoreData 대비 직관적인 코드
- DB 처리에 Main Thread를 사용하므로 안정적임 (장점이자 단점)
- C언어로 작성되어 가벼우며, 전체 DB를 디스크 파일 1개에 저장
- 설정이 쉬움
- Thread-safe
- 다양한 OS에서 사용 가능 (MacOS X, iOS, Android, Window, Linux)
- 데이터를 객체 (NSManagedObject) 형태로 저장하여 DB에서 가져온 데이터를 앱에 즉시 사용 가능
- SQLite 대비 속도가 빠름
단점 - Thread-confined함 (스레드별 객체 관리가 필요. 다른 스레드로 전달하려면 wrapper 등이 필요)
- SQLite 대비 바이너리 용량이 큼
- 다양한 query를 지원하지 않음
- 동시성 (Concurrency)에 제한이 있음 (여러 프로세스가 DB에 접근/quering이 가능하지만, 한 번에 1개 프로세스만 처리 가능)
- 데이터 용량이 큰 경우 부적합
- 접근 권한 종류가 한 가지 밖에 없음
- 사용이 직관적이지 않고 번거로움 (Entity 생성, 코드로 데이터를 Read/Write 등)
- 메모리 및 저장공간 소모가 큼 (In-memory 방식은 메모리에 로딩된 객체만 수정 가능)
- 데이터 중복을 방지하는 unique key 기능이 없음
- Thread-unsafe
- 오버헤드 발생 가능
- Android 등 크로스 플랫폼을 지원하지 않음

기술스택 고려사항

  1. 하위 버전 호환성에는 문제가 없는가?
    • Deployment Target을 iOS 14이상으로 설정할 계획이고, Xcode 버전 13.4을 사용 중이므로 문제 없습니다.
    • Realm : SPM 사용 기준 iOS 11 이상
  2. 안정적으로 운용 가능한가?
    • 모바일에 최적화되어 있으므로 iOS를 지속 지원할 것으로 예상되며, 2.0 버전부터 안정화됐다고 판단했습니다.
  3. 미래 지속가능성이 있는가?
    • 지속적으로 기능이 업데이트되고 있습니다.
    • 서비스를 확장하여 Android 앱을 개발할 경우에도 사용할 수 있습니다.
  4. 리스크를 최소화 할 수 있는가? 알고있는 리스크는 무엇인가?
    • First-party 라이브러리가 아니므로 서비스가 중단될 리스크가 있지만, 중단될 가능성이 낮다고 판단했습니다.
    • Realm은 Thread별 객체 관리가 필요하며, 바이너리 용량이 크므로 지속적으로 Thread/용량을 관리할 필요가 있습니다. 또한 현재 용량 무제한/무료이지만 가격 정책이 변경될 수 있습니다.
  5. 어떤 의존성 관리도구를 사용하여 관리할 수 있는가?
    • Cocoa Pods, Carthage, SPM을 사용할 수 있습니다.
    • First-party 라이브러리인 SPM을 사용중이므로 적합합니다.

2. RealM 연동

싱글톤 패턴을 적용하여 RealmManager 타입을 생성하고, realm 객체를 가지도록 했습니다. 또한 RealM 데이터 저장을 위한 객체 타입으로 DislikedFoodForRealM 타입을 추가했습니다.

OnboardingPage의 못먹는음식 화면에서 확인 버튼을 Tap하는 이벤트를 받을 때마다, RealM에 못먹는음식 데이터를 업데이트 (기존 데이터 전체삭제, 새로운 데이터 추가)하도록 구현했습니다.

3. Skip 버튼 구현

1, 2 페이지에서 Skip 버튼을 Tap한 경우, 바로 못먹는음식 페이지로 이동하도록 했습니다.

UIPageViewControllersetViewControllers 메서드를 활용하여 못먹는음식 페이지로 이동하도록 했고, 이 경우 기존 pageControlSkip 버튼이 사라지도록 했습니다.

테스트 방법

RealM Studio 맥앱을 활용해 RealM 데이터가 정상적으로 저장되는지 확인했습니다.
데이터 저장 경로의 경우 다음과 같은 방법으로 찾았습니다.

Realm.Configuration.defaultConfiguration.fileURL
  • RealM Studio에 저장된 데이터 확인
    realm연동

리뷰 노트

  • UserDefault를 통해 앱을 처음 실행하는 것이 아니라면 바로 메인 메뉴로 이동할 수 있도록 구현할 예정입니다.

스크린샷

just1103 and others added 2 commits May 25, 2022 16:16
- RealMSwift dependency 추가
- 싱글톤 패턴을 적용한 RealMManager 타입 추가
- pageControl의 userInteraction이 안되도록 수정
@just1103 just1103 added the feature 앱 출시에 한 발자국 다가간다... label May 25, 2022
@yanghojoon yanghojoon merged commit b306def into develop May 25, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature 앱 출시에 한 발자국 다가간다...

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants