리액트 네이티브 DB 선택 고민할 때 sqlite 쓰지 마세요. (API 30 오류 및 임시 해결방법 포함)

리액트 네이티브의 로컬 DB를 무엇으로 구성할까 고민하고 많이 찾아봤었다.

파이어베이스 부터 시작해서 realms 까지도 생각했지만 현 상황에서 sqlite에 대한 정보들이 가장 쉽고 빠르게 진행할 수 있었다.

하지만 국내에 공유된 sqlite (패키지 : andpor의 react-native-sqlite-storage)는 안드로이드 API 30에서 심각한 오류가 발생한다.

바로 Open database failed 로 DB가 아예 연결이 안된다. 하지만 패키지의 업데이트는 오래전부터 멈췄다.

sqlite로 DB를 구성했던 해외 앱 개발자들은 난관에 봉착했고 원인을 찾기 시작했다.

나는 이 이슈가 있는 지 1년이 넘은 지금 앱을 다 만들고 구글 플레이에 등록되고 나서야 최신 기기들에서 작동이 되지 않음을 알게되었고 이제서야 잘못된 것을 알았다.

그래서 구글을 검색해봤지만 국내 정보로는 이 이슈에 대한 내용이 없고 전부 react-native-sqlite-storage 를 이용해서 개발하는 방법에 대해서만 있다. 아마 당시에는 문제가 없었던 듯 하다.

아무튼 API 30 이슈는 해외 개발자들이 react-native-sqlite-storage 이슈로 등록했고 사람들이 이 이슈를 해결하기 위해 또 다른 패키지를 만들었다.

이슈로 등록된 글 : https://github.com/andpor/react-native-sqlite-storage/issues/462

이 이슈로 인해 사용자들이 풀리퀘스트(PR)을 받아 스스로 수정하기 시작했다. https://github.com/andpor/react-native-sqlite-storage/pull/494

이렇게 만들어진 패키지는 https://www.npmjs.com/package/react-native-sqlite-storage-api30 이다.

이슈 해결 방법

1. 임시 패키지를 설치한다. (임시라 함은 절대 기존 공식 패키지와 별도로 사용자들이 만든 패키지 이기 때문이다.)

npm i --save react-native-sqlite-storage-api30

2. 기존 패키지를 삭제한다. 안그러면 같은 이름의 패키지가 있다가 빌드 오류 난다.

npm uninstall react-native-sqlite-storage

나는 React Native 0.60 이기 때문에 pod install 처리만 하면된다. 0.59이하는 Link 작업해야 한다.

cd ios && pod install && cd ..

3. 프로젝트 폴더/react-native.config.js 파일 수정

기존 파일이 이렇게 되어 있을 것이다.

module.exports = {
... 생략 
    dependencies: {
        "react-native-sqlite-storage": {
            platforms: {
                android: {
                    sourceDir:
                        "../node_modules/react-native-sqlite-storage/platforms/android-native",
                    packageImportPath: "import io.liteglue.SQLitePluginPackage;",
                    packageInstance: "new SQLitePluginPackage()"
                }
            }
        }
    },
... 생략 

위 부분을 아래와 같이 수정한다.

module.exports = {
... 생략 
    dependencies: {
        "react-native-sqlite-storage-api30": {
            platforms: {
                android: {
                    sourceDir:
                        "../node_modules/react-native-sqlite-storage-api30/platforms/android-native",
                    packageImportPath: "import io.liteglue.SQLitePluginPackage;",
                    packageInstance: "new SQLitePluginPackage()"
                }
            }
        }
    },
... 생략 

4. 이제 실제 구성한 페이지들의 상단에 import 했던 부분들을 수정한다.

기존에는 이렇게 임포트해 와서 쓰고 있을 것이다.

import SQLite from "react-native-sqlite-storage";

저렇게 불러오는 부분을 전부 아래처럼 바꾸어 쓰면 된다.

import SQLite from "react-native-sqlite-storage-api30";

이렇게 임시 구성이 끝났다.

현재 앱의 DB 구성을 바로 바꿀 수 없어서 이 패키지를 걷어 내지 못했지만 최신 OS 기기들에서 DB가 작동 안되는 큰 이슈를 임시로 수정해서 끌어안고 갈 수 없다.

개인적으로는 로컬 DB 선택을 고민한다면 해당 패키지는 제외시키는 것을 추천한다.

TOP