지금까지 운이 좋았던 탓일지 모르겠지만
라이브러리간의 버전 호환에 대해 거의 신경을 안쓰며 작업해왔던 것 같습니다.
하지만 두 플랫폼을 묶어 개발하는 React Native 특성상
같은 기능을 두고도 동작이 다르거나 지원여부가 다른 경우가 있습니다.
오늘은 라이브러리 버전 관리에 대해,
그리고 최근 겪은 라이브러리 간 버전 충돌 해결에 대해 써보려 합니다.
먼저 회사에서 안일하게 관리중이던 package.json을 보자면
특정 버전을 타겟으로 설치하지않아 library@^1.0.0
과 같이 선언되어있었습니다.
이는 메이저 버전인 1을 제외한 마이너, 패치 버전이 업데이트 된 경우
'명시된 마이너 버전 이상의 설치를 모두 허용'하겠다는 의미가 됩니다.
암묵적으로 '마이너 버전은 네이티브 코드를 수정하지 않는 선에서 업데이트된다'
라고는 하지만, 실제로 그렇지 않은 라이브러리들이 더러 있습니다.
예를 들어
react-native-splash@3.2.0
이 3.3.0
으로 업데이트되며
안드로이드 쪽 네이티브 코드가 변경되어 빌드가 정상적이지 않던 이슈가 있었습니다.
해당 라이브러리가 3.2.0
이 최신인 시점에 설치를 했다면 그 로컬 레퍼지토리엔
3.2.0
이겠지만, 후에 업데이트가 된 후 해당 레퍼지토리를 설치한 경우엔
3.3.0
이상의 버전이 깔리게될 가능성이 생기게됩니다.
따라서 다음과 같은 상황이 벌어지게 됩니다.
'아니 레퍼지토리도 똑같은 곳에서 받았고 버전 명시도 똑같은데 왜 안되지?'
이와 같은 경우를 해결하기위해 각 종속성 lock파일을 동시에 원격으로 올리고 있지만,
추적을 해야하는 상황이 발생하는 것도 사실이고 (package.json 확인, lock 파일 재확인 필요)
node_modules, lock파일을
초기화 시켜야할 경우가 생기기 때문에 버전을 고정하여 ^3.1.0
-> 3.1.0
관리해야할 필요성이 있습니다.
이어서 라이브러리 간 종속성이 있을 경우 문제는 더 심각해질 수 있습니다.
라이브러리를 설치하다보면 requirements가 존재하는 경우가 다수 있습니다.
최대한 변동성이 적고 안정적으로 업데이트하고 있는 라이브러리가 종속인 경우엔 상관이 없을 수 있지만
그렇지 않은 예시를 하나 들어보겠습니다.
react-native-reanimated와 realm-js의 요구사항인 hermes의 여부가 충돌됩니다.
위 라이브러리는 모두 필수적이라고 할 때
제가 해결했던 순서는 다음과 같습니다.
react-native@0.66.x
이상에서 사용가능하므로react-native@0.64.X
-> react-native@0.66.x
로 업데이트이로써 모든 라이브러리간 필요 조건도 모두 충족시키면서
정상적인 기능을 하도록 되었습니다.
하지만 한가지 realm-js에서 hermes를 지원하는 브랜치를 찾을 수 있었다는 것인데요.
제 입장에선 완전한 럭키펀치였다고 볼 수 있습니다.
(후에 master로 합쳐질 예정이라고 개발자의 언급이 있었기 때문에 적용할 수 있었습니다)
만약 곧죽어도 hermes를 해결할 방법이 없었다면
내부 DB관리를 realm에서 hermes를 지원하는 다른 라이브러리로 마이그레이션하거나
react-native-collapsible-tab-view의 정상적인 작동을 포기해야 했던 상황이었습니다.
다른 얘기지만 문제가 발생하면 꼭 해당 라이브러리 issues를 뒤져보시는걸 추천합니다
생각보다 구글에는 잡히지 않으나 같은 증상을 겪고 있는 사람들이 그 곳에 있습니다.
프로젝트에 도입되는 라이브러리가 많아지면 많아질수록
업데이트가 되면 될수록 이런 문제점이 더욱 두드러질 것 같습니다.
슬슬 이런 현상이 나오는게 라이브러리 도입이나 업데이트에
좀 더 신중해야할 타이밍이 아닌가 싶습니다.