라이브러리간 버전 충돌 해결

장은봉·2022년 3월 13일
0

개발일지

목록 보기
1/1

들어가며

지금까지 운이 좋았던 탓일지 모르겠지만
라이브러리간의 버전 호환에 대해 거의 신경을 안쓰며 작업해왔던 것 같습니다.
하지만 두 플랫폼을 묶어 개발하는 React Native 특성상
같은 기능을 두고도 동작이 다르거나 지원여부가 다른 경우가 있습니다.
오늘은 라이브러리 버전 관리에 대해,
그리고 최근 겪은 라이브러리 간 버전 충돌 해결에 대해 써보려 합니다.

먼저 회사에서 안일하게 관리중이던 package.json을 보자면
특정 버전을 타겟으로 설치하지않아 library@^1.0.0과 같이 선언되어있었습니다.
이는 메이저 버전인 1을 제외한 마이너, 패치 버전이 업데이트 된 경우
'명시된 마이너 버전 이상의 설치를 모두 허용'하겠다는 의미가 됩니다.

같은 프로젝트인데 각자 라이브러리 버전이 다르다?

암묵적으로 '마이너 버전은 네이티브 코드를 수정하지 않는 선에서 업데이트된다'
라고는 하지만, 실제로 그렇지 않은 라이브러리들이 더러 있습니다.

예를 들어
react-native-splash@3.2.03.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-collapsible-tab-view의 멀티플랫폼 정상작동을 위해서
    react-native-reanimated 2.2.0 이상이 필요함. (2.0.0에선 사용할 수 있으나 정상적이지 않음)
  • react-native-reanimated를 사용하기 위해선 hermes를 사용해야함
  • realm-js는 hermes를 사용하지 않아야함

react-native-reanimated와 realm-js의 요구사항인 hermes의 여부가 충돌됩니다.
위 라이브러리는 모두 필수적이라고 할 때
제가 해결했던 순서는 다음과 같습니다.

  1. realm-js의 hermes가 지원되는 특정 브랜치를 설치
  2. 해당 브랜치는 react-native@0.66.x 이상에서 사용가능하므로
    react-native@0.64.X -> react-native@0.66.x로 업데이트
  3. hermes 적용
  4. react-native-reanimated 2.2.0 업데이트
  5. react-native-collapsible-tab-view 정상 작동

이로써 모든 라이브러리간 필요 조건도 모두 충족시키면서
정상적인 기능을 하도록 되었습니다.

하지만 한가지 realm-js에서 hermes를 지원하는 브랜치를 찾을 수 있었다는 것인데요.
제 입장에선 완전한 럭키펀치였다고 볼 수 있습니다.
(후에 master로 합쳐질 예정이라고 개발자의 언급이 있었기 때문에 적용할 수 있었습니다)
만약 곧죽어도 hermes를 해결할 방법이 없었다면
내부 DB관리를 realm에서 hermes를 지원하는 다른 라이브러리로 마이그레이션하거나
react-native-collapsible-tab-view의 정상적인 작동을 포기해야 했던 상황이었습니다.

다른 얘기지만 문제가 발생하면 꼭 해당 라이브러리 issues를 뒤져보시는걸 추천합니다
생각보다 구글에는 잡히지 않으나 같은 증상을 겪고 있는 사람들이 그 곳에 있습니다.

마치며

프로젝트에 도입되는 라이브러리가 많아지면 많아질수록
업데이트가 되면 될수록 이런 문제점이 더욱 두드러질 것 같습니다.
슬슬 이런 현상이 나오는게 라이브러리 도입이나 업데이트에
좀 더 신중해야할 타이밍이 아닌가 싶습니다.

0개의 댓글