React Native를 사용할 때 데이터를 저장하는 옵션은 무엇입니까? (iOS 및 Android) [닫힘]


230

나는 여전히 React Native 세계에서, 그리고 일반적으로 모바일 / 네이티브 세계에서도 새로 생겼으며, 데이터 지속성에 관한 문서가 약간 부족하다는 것을 알았습니다.

React Native에 데이터를 저장하는 옵션과 각 유형의 의미는 무엇입니까? 예를 들어, 로컬 스토리지와 비동기 스토리지가 있지만 Realm과 같은 것을 보았습니다.이 모든 것이 외부 데이터베이스와 어떻게 작동하는지 혼란 스럽습니다.

나는 구체적으로 알고 싶다 :

  • 데이터 지속성을위한 다른 옵션은 무엇입니까?
  • 각각에 대해 해당 지속성의 한계는 무엇입니까 (즉, 데이터를 더 이상 사용할 수없는시기)? 예를 들어 : 응용 프로그램을 닫거나 전화를 다시 시작할 때 등
  • 각각에 대해 iOS와 Android에서 구현하는 데 차이가 있습니까 (일반 설정 제외)?
  • 오프라인으로 데이터에 액세스하는 것과 옵션을 어떻게 비교합니까? (또는 오프라인 액세스는 일반적으로 어떻게 처리됩니까?)
  • 명심해야 할 다른 사항이 있습니까?

당신의 도움을 주셔서 감사합니다!


Sensitie 데이터를 저장하려면 다음을 살펴보십시오. stackoverflow.com/questions/45547657/…
Julien Kode

Realm을 사용하십시오
Fattie

간단한 솔루션을 원한다면 back4app을 사용하십시오 (예 : parse.com)
Fattie

15
SO의 경우와 마찬가지로 많은 사람들에게 유용한 질문이 누군가에 의해 닫혀 있습니다. 아마도 SO 규칙에 '규칙'과 적용 방법에 대해 알려 주어야합니까? 가장 많이 사용되는 게시물을보고 '규칙'을 따르는 사람 수를 확인하십시오. 듣고있는 사람?
user2330237 2016 년

답변:


286

다음은 현재 몇 가지 현재 앱 프로젝트를 진행하는 가장 좋은 방법을 결정하면서 배운 내용입니다.

비동기 저장소 (기본 제공)

프로덕션 앱에 AsyncStorage를 사용합니다. 스토리지는 기기에 로컬로 유지되고 암호화되지 않으며 (다른 답변에서 언급 한 바와 같이), 앱을 삭제하면 사라지지만 기기 백업의 일부로 저장되어 업그레이드 중에 유지되어야합니다 (기본 업그레이드는 CodeFush를 통한 TestFlight 및 코드 업그레이드) ).

결론 : 로컬 스토리지; 자체 동기화 / 백업 솔루션을 제공합니다.

SQLite

내가 작업 한 다른 프로젝트는 앱 저장을 위해 sqlite3을 사용했습니다. 따라서 압축 가능한 데이터베이스를 통해 SQL과 유사한 환경을 제공 할 수 있으며 장치 간에도 데이터를 전송할 수 있습니다. 백엔드에 동기화 한 경험이 없지만 다양한 라이브러리가 있다고 생각합니다. SQLite에 연결하기위한 RN 라이브러리가 있습니다.

데이터는 데이터베이스, 테이블, 키, 인덱스 등이 모두 이진 형식으로 디스크에 저장된 기존 데이터베이스 형식으로 저장됩니다. SQLite 드라이버가있는 명령 줄 또는 앱을 통해 데이터에 직접 액세스 할 수 있습니다.

결론 : 로컬 스토리지; 동기화 및 백업을 제공합니다.

중포 기지

Firebase는 특히 실시간 noSQL 데이터베이스와 MongoDB와 같은 JSON 문서 저장소를 제공하여 1에서 n까지의 클라이언트 동기화를 유지합니다. 문서는 오프라인 지속성에 대해 이야기하지만 기본 코드 (Swift / Obj-C, Java)에 대해서만 이야기합니다. React Native에서 사용하는 Google 고유의 JavaScript 옵션 ( "웹")은 캐시 된 저장 옵션을 제공하지 않습니다 (아래 2/18 업데이트 참조). 라이브러리는 웹 브라우저가 연결될 것이라는 가정하에 작성되므로 반영구적으로 연결됩니다. Firebase 저장소 호출을 보완하기 위해 로컬 캐싱 메커니즘을 작성하거나 기본 라이브러리와 React Native 사이의 브리지를 작성할 수 있습니다.

2018 년 2 월 업데이트 나는 React Native Firebase 를발견했습니다. 기본 지원. Google이 실시간 데이터베이스 옆에 JSON 문서 저장소를 도입하면서 Firebase는 내가 구축하려는 일부 실시간 앱을 다시 한 번 살펴볼 것입니다.

실시간 데이터베이스는 JSON과 같은 트리로 저장되어 웹 사이트에서 편집하고 간단하게 가져 오기 / 내보내기 할 수 있습니다.

결론 : Reactive-native-firebase를 사용하면 RN은 Swift 및 Java와 동일한 이점을 얻습니다. [/ update] 네트워크 연결 장치에 맞게 확장 할 수 있습니다. 낮은 활용도를위한 저렴한 비용. 다른 Google 클라우드 제품과 잘 어울립니다. 인터페이스에서 데이터를 쉽게보고 편집 할 수 있습니다.

왕국

업데이트 4/2020 MongoDB는 Realm을 인수했으며이를 아래의 MongoDB 스티치와 결합 할 계획입니다. 이것은 매우 흥미로운 것 같습니다 .


또한 자동 네트워크 동기화 기능을 갖춘 실시간 객체 저장소입니다. 그들은 "장치 우선"으로 선전하고 데모 비디오는 장치가 산발적이거나 손실 된 네트워크 연결을 처리하는 방법을 보여줍니다.

자체 서버 또는 AWS 또는 Azure와 같은 클라우드 솔루션에서 호스팅하는 무료 버전의 객체 저장소를 제공합니다. 장치와 함께 유지되지 않는 메모리 내 저장소, 서버와 동기화되지 않는 장치 전용 저장소, 읽기 전용 서버 저장소 및 하나 이상의 장치에서 동기화하기위한 전체 읽기 / 쓰기 옵션을 만들 수도 있습니다. Firebase보다 월별 비용이 높은 전문 및 엔터프라이즈 옵션이 있습니다.

Firebase와 달리 모든 Realm 기능은 Swift / ObjC / Java (기본) 앱과 마찬가지로 React Native 및 Xamarin에서 지원됩니다.

데이터는 코드의 객체와 연결되어 있습니다. 그것들은 정의 된 객체이기 때문에 스키마가 있으며 코드 관리를 위해서는 버전 관리가 필수적입니다. Realm이 제공하는 GUI 도구를 통해 직접 액세스 할 수 있습니다. 온 디바이스 데이터 파일은 플랫폼 간 호환 가능합니다.

결론 : 장치 우선, 무료 및 유료 요금제와의 선택적 동기화. React Native에서 지원되는 모든 기능. Firebase보다 수평 확장이 더 비쌉니다.

iCloud

나는 솔직히이 일을 많이하지 않았지만 가까운 장래에 그렇게 할 것입니다.

CloudKit을 사용하는 기본 앱이있는 경우 CloudKit JS를 사용하여 웹 앱 (또는이 경우 React Native)에서 앱 컨테이너에 연결할 수 있습니다. 이 시나리오에서는 기본 iOS 앱과 React 기본 Android 앱이있을 것입니다.

Realm과 마찬가지로 데이터를 로컬에 저장하고 가능한 경우 iCloud와 동기화합니다. 앱을위한 공개 상점과 각 고객을위한 개인 상점이 있습니다. 고객은 매장이나 물건 중 일부를 다른 사용자와 공유하도록 선택할 수도 있습니다.

원시 데이터에 액세스하는 것이 얼마나 쉬운 지 모르겠습니다. 스키마는 Apple 사이트에서 설정할 수 있습니다.

결론 : Apple 대상 앱에 적합합니다.

소파베이스

큰 이름, 그 뒤에 큰 회사가 많이 있습니다. 표준 지원 비용이 포함 된 Community Edition 및 Enterprise Edition이 있습니다.

그들은 사이트에 React Native에 연결하는 튜토리얼을 가지고 있습니다. 나는 또한 이것에 많은 시간을 소비하지는 않았지만, 기능면에서 Realm에 대한 실용적인 대안으로 보입니다. 앱 외부의 데이터 또는 빌드하는 API가 얼마나 쉬운 지 잘 모르겠습니다.

[편집 : Couchbase와 CouchDB에 대해 이야기하는 오래된 링크를 찾았으며 CouchDB는 아직 고려해야 할 또 다른 옵션입니다. 이 두 제품은 역사적으로 관련되어 있지만 현재 완전히 다른 제품입니다. 참조 이 비교를 .]

결론 : Realm과 비슷한 기능을 가지고 있습니다. 장치 전용 또는 동기화 가능 나는 그것을 시도해야합니다.

몽고 DB

4/2020 업데이트

Mongo는 Realm을 인수했으며 MongoDB Stitch (아래에서 논의 됨)와 Realm (위에서 논의 됨) 을 결합 할 계획 입니다.


이 서버 쪽을 AsyncStorage를 로컬로 사용하는 앱에 사용하고 있습니다. 나는 모든 것이 JSON 객체로 저장되어 클라이언트 장치로의 전송이 매우 간단하다는 것을 좋아합니다. 유스 케이스에서는 TV 가이드 데이터의 업스트림 공급자와 클라이언트 장치 간의 캐시로 사용됩니다.

스키마와 같이 데이터에 대한 엄격한 구조는 없으므로 모든 객체는 쉽게 검색 가능하고 필터링 할 수있는 "문서"로 저장됩니다. 유사한 JSON 객체에는 추가 (그러나 다른) 속성 또는 하위 객체가있을 수 있으므로 객체 / 데이터를 구성하는 방법에 많은 유연성이 있습니다.

클라이언트와 서버 간 동기화 기능을 시도하지 않았거나 임베디드를 사용하지 않았습니다. MongoDB에 대한 반응 네이티브 코드가 존재합니다.

결론 : 로컬 전용 NoSQL 솔루션, Realm 또는 Firebase와 같은 명확한 동기화 옵션이 없습니다.

2019 년 2 월 업데이트

MongoDB에는 Stitch라는 "제품"(또는 서비스)이 있습니다. 클라이언트 (웹 브라우저 및 전화의 의미에서)는 MongoDB와 직접 대화해서는 안되며 (서버의 코드로 수행됨), 앱을 사용하도록 선택할 때 서버가없는 프런트 엔드를 만들었습니다. 호스팅 솔루션 (Atlas). 그들의 문서는 가능한 동기화 옵션이있는 것으로 보입니다.

2018 년 12 월이 글은 샘플 앱에서 React Native, Stitch 및 MongoDB를 사용하는 방법과 문서에 링크 된 다른 샘플 ( https://www.mongodb.com/blog/post/building-ios-and-android-apps) 에 대해 설명합니다. with-the-mongodb-stitch-react-native-sdk )를 사용하십시오.

트윌 리오 싱크

동기화를위한 또 다른 NoSQL 옵션은 Twilio의 동기화입니다. 사이트에서 : "동기화를 사용하면 백엔드 인프라를 처리하지 않고도 여러 장치에서 실시간으로 대규모 상태를 관리 할 수 ​​있습니다."

위에서 언급 한 프로젝트 중 하나, 특히 두 팀과 대화 한 후 Firebase의 대안으로이 문제를 검토했습니다. 또한 다른 통신 도구를 좋아하며 간단한 웹 앱의 문자 메시지 업데이트에 사용했습니다.


[편집] 원래이 글을 쓴 이후로 Realm과 함께 시간을 보냈습니다. Firebase와 마찬가지로 앱과 서버간에 데이터를 동기화하기 위해 API를 작성하지 않아도되는 방법이 마음에 듭니다. 서버리스 함수는이 두 가지 기능에 정말 도움이 될 것 같습니다.

MongoDB 데이터 저장소의 유연성을 좋아하므로 웹 기반 및 기타 연결이 필요한 앱의 서버 측에서 선택하고 있습니다.

RESTHeart를 발견했습니다 .MongoDB 에 매우 간단하고 확장 가능한 RESTful API를 만듭니다. JSON 오브젝트를 읽고 읽고 RESTHeart에 쓰는 React (네이티브) 컴포넌트를 빌드하는 것이 너무 어렵지 않아야합니다.


[편집] 데이터 저장 방법에 대한 정보를 추가했습니다. 때로는 데이터를 조정하고 테스트해야하는 경우 개발 및 테스트 중에 얼마나 많은 작업을 수행해야하는지 아는 것이 중요합니다.


2019 년 2 월 편집 나는 작년 (2018 년) 높은 동시성 프로젝트를 디자인 할 때 이러한 옵션 중 몇 가지를 실험했습니다. 그들 중 일부는 문서에서 하드 및 소프트 동시성 한계를 언급합니다 (Firebase는 10,000 연결에서 어려운 것으로 나타났습니다 .Twilio는 AltConf의 두 팀과의 논의에 따르면 충돌 할 수있는 소프트 한계였습니다).

수십에서 수십만 명의 사용자를위한 앱을 설계하는 경우 그에 따라 데이터 백엔드를 확장 할 수 있도록 준비하십시오.


1
Redux는 어떻습니까?
HIRA THAKUR

4
@LeonardoDaCodinchi Redux는 상태 관리에 도움이되지만 지속적인 스토리지 기능은 제공하지 않습니다.
walshie4

1
왜 목록에서 redux-persistent하지 않습니까? 그것에 대해 뭔가 추가해 주시겠습니까? 그렇게 나쁘다면.
Shahzad Mirza

내가 이것을 썼을 때, 나는 Redux와 관련된 것을 보는 데 시간을 소비하지 않았습니다. 기존 React 및 React-Native 앱 (현재 거의 2 년이되었으며 유지 관리 모드에만 있음)은 사용하지 않습니다. 아마도 미래의 프로젝트에서 아마도 공정한 논평을 제공 할 수 있습니다.
Bryan Scott

1
나는 당신이 모든 것을 올리는 방식을 좋아했습니다. 각각에 장단점을 추가하면 더 좋을 것입니다 (문서 링크). 내가 찾은 것처럼 AsyncStorage안드로이드에서 6MB 만 지원하는 반면 iOS의 경우 그러한 제한이 없습니다.
Jimit Patel

58

빠르고 더러운 : 반응 네이티브를 위해 Redux + react-redux + redux-persist + AsyncStorage 를 사용하십시오.

반응하는 세계와 거의 완벽하게 맞으며 안드로이드와 iOS 모두에게 매력처럼 작동합니다. 또한 주변에는 탄탄한 커뮤니티와 많은 정보가 있습니다.

실제 예제 는 Facebook 의 F8App 을 참조하십시오 .

데이터 지속성을위한 다른 옵션은 무엇입니까?

react native를 사용하면 아마도 redux와 redux-persist를 사용하고 싶을 것입니다. 여러 스토리지 엔진을 사용할 수 있습니다. RN의 옵션은 AsyncStorage 및 redux-persist-filesystem-storage입니다.

Firebase 또는 Realm과 같은 다른 옵션이 있지만 RN 프로젝트에서는 사용하지 않았습니다.

각각에 대해 해당 지속성의 한계는 무엇입니까 (즉, 데이터를 더 이상 사용할 수없는시기)? 예를 들어 : 응용 프로그램을 닫거나 전화를 다시 시작할 때 등

redux + redux-persist를 사용하여 지속되는 것과 그렇지 않은 것을 정의 할 수 있습니다. 지속되지 않으면 앱이 실행되는 동안 데이터가 존재합니다. 지속되면 데이터는 앱 실행 (닫기, 열기, 전화 다시 시작 등)간에 유지됩니다.

Android에서 AsyncStorage의 기본 제한은 6MB입니다. Java 코드에서 더 큰 제한을 구성하거나 Android 용 스토리지 엔진으로 redux-persist-filesystem-storage를 사용할 수 있습니다.

각각에 대해 iOS와 Android에서 구현하는 데 차이가 있습니까 (일반 설정 제외)?

redux + redux-persist + AsyncStorage를 사용하면 Android 및 iOS에서 설정이 동일합니다.

오프라인으로 데이터에 액세스하는 것과 옵션을 어떻게 비교합니까? (또는 오프라인 액세스는 일반적으로 어떻게 처리됩니까?)

redux를 사용하면 설계 부분 (액션 생성자 및 감속기) 덕분에 유선 액세스가 거의 자동으로 이루어집니다.

가져오고 저장 한 모든 데이터를 사용할 수 있으며 추가 데이터를 쉽게 저장하여 상태 (페치, 성공, 오류) 및 페치 시간을 표시 할 수 있습니다. 일반적으로 가져 오기를 요청해도 이전 데이터가 무효화되지 않으며 새 데이터가 수신 될 때 구성 요소가 업데이트됩니다.

다른 방향에서도 동일하게 적용됩니다. 서버로 전송 중이고 아직 보류중인 데이터를 저장하고 적절하게 처리 할 수 ​​있습니다.

명심해야 할 다른 사항이 있습니까?

React는 앱을 생성하는 반응적인 방식을 권장하며 Redux는 이에 적합합니다. 일반 Android 또는 iOS 앱에서 사용하는 옵션을 사용하기 전에 시도해야합니다. 또한 더 많은 문서와 도움을 얻을 수 있습니다.


3
AsyncStorage / Redux Persist에 대한 심층적 인 이해에 감사드립니다. 모든 옵션에 대한 개요를 더 많이 찾고 있었기 때문에 이것이 공식 답변으로 선택하지 않은 유일한 이유입니다.
Sia

9

위의 사람들은 저장에 대한 올바른 메모를했지만 저장해야 할 PII 데이터를 고려해야하는 경우 https://github.com/oblador/react-native-keychain 과 같은 것을 사용하여 키 체인에 숨길 수도 있습니다 ASyncStorage는 암호화되지 않았기 때문입니다. 그것은 redux-persist와 같은 지속적인 구성의 일부로 적용될 수 있습니다.


1

비동기 저장소보다 사용하기 쉬운 동기화 저장소 를 사용할 수 있습니다 . 이 라이브러리는 비동기 스토리지를 사용하여 데이터를 비동기 적으로 저장하고 메모리를 사용하여 데이터를 동 기적으로 즉시로드 및 저장하는 데 유용하므로 데이터를 메모리에 비동기 적으로 저장하고 앱 동기화에 사용하므로 훌륭합니다.

import SyncStorage from 'sync-storage';

SyncStorage.set('foo', 'bar');
const result = SyncStorage.get('foo');
console.log(result); // 'bar'

1

복잡한 데이터 유형을 관리하려는 경우 Realm 또는 Sqlite를 사용할 수 있습니다.

그렇지 않으면 내장 반응 기본 asynstorage로 이동


0

지속성을 위해 단순히 redux를 사용할 수있는 redux-persist가 필요하지 않습니다.

react-redux + AsyncStorage = redux-persist

그래서 createsotre 파일 안에 단순히이 줄을 추가하십시오

store.subscribe(async()=> await AsyncStorage.setItem("store", JSON.stringify(store.getState())))

이것은 redux store에 약간의 변화가있을 때마다 AsyncStorage를 업데이트합니다.

그런 다음 json 변환 저장소를로드하십시오. 앱이로드 될 때마다 상점을 다시 설정하십시오.

redux-persist는 wix react-native-navigation을 사용할 때 문제를 발생시키기 때문입니다. 이 경우 가입자 기능 이상으로 간단한 redux를 사용하는 것을 선호합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.