RootTag
RootTag
는 리액트 네이티브 화면의 네이티브 루트 뷰에 할당된 불투명 식별자이다. 즉, 안드로이드의 ReactRootView
나 iOS의 RCTRootView
인스턴스를 가리킨다. 간단히 말해, 이는 화면 식별자라고 할 수 있다.
RootTag를 언제 사용할까?
대부분의 React Native 개발자는 RootTag
를 직접 다룰 필요가 없다.
RootTag
는 앱이 여러 React Native 루트 뷰를 렌더링하고, 각 화면에 따라 네이티브 API 호출을 다르게 처리해야 할 때 유용하다. 예를 들어, 앱이 네이티브 네비게이션을 사용하고 각 화면이 별도의 React Native 루트 뷰로 구성된 경우가 이에 해당한다.
네이티브 네비게이션에서는 모든 React Native 루트 뷰가 플랫폼의 네비게이션 뷰(예: Android의 Activity
, iOS의 UINavigationViewController
)에 렌더링된다. 이를 통해 플랫폼의 네비게이션 패러다임(예: 네이티브 디자인 및 네비게이션 트랜지션)을 활용할 수 있다. 네이티브 네비게이션 API와 상호작용하는 기능은 네이티브 모듈을 통해 React Native에 노출될 수 있다.
예를 들어, 화면의 제목 표시줄을 업데이트하려면 네비게이션 모듈의 API인 setTitle("Updated Title")
을 호출해야 하지만, 이때 스택에서 어떤 화면을 업데이트할지 알아야 한다. 여기서 RootTag
는 루트 뷰와 해당 뷰를 호스팅하는 컨테이너를 식별하는 데 필요하다.
RootTag
의 또 다른 사용 사례는 앱이 특정 JavaScript 호출을 해당 호출이 발생한 루트 뷰에 따라 네이티브에 전달해야 할 때이다. RootTag
는 다른 화면에서 발생한 호출의 출처를 구분하는 데 필수적이다.
RootTag에 접근하는 방법
0.65 버전 이하에서는 RootTag에 접근하기 위해 레거시 컨텍스트를 사용했다. React 18부터 도입될 동시성 기능을 준비하기 위해, 0.66 버전부터는 최신 Context API를 통해 RootTagContext
로 마이그레이션하고 있다. 0.65 버전은 레거시 컨텍스트와 권장되는 RootTagContext
를 모두 지원해 개발자들이 점진적으로 마이그레이션할 수 있도록 했다. 주요 변경 사항은 요약 문서를 참고한다.
RootTagContext
를 통해 RootTag
에 접근하는 방법은 다음과 같다.
import {RootTagContext} from 'react-native';
import NativeAnalytics from 'native-analytics';
import NativeNavigation from 'native-navigation';
function ScreenA() {
const rootTag = useContext(RootTagContext);
const updateTitle = title => {
NativeNavigation.setTitle(rootTag, title);
};
const handleOneEvent = () => {
NativeAnalytics.logEvent(rootTag, 'one_event');
};
// ...
}
class ScreenB extends React.Component {
static contextType: typeof RootTagContext = RootTagContext;
updateTitle(title) {
NativeNavigation.setTitle(this.context, title);
}
handleOneEvent() {
NativeAnalytics.logEvent(this.context, 'one_event');
}
// ...
}
클래스와 훅을 사용한 Context API에 대한 자세한 내용은 React 문서와 훅 문서를 참고한다.
0.65 버전의 주요 변경 사항
RootTagContext
는 이전에 unstable_RootTagContext
로 불렸으며, 0.65 버전에서 RootTagContext
로 이름이 변경되었다. 코드베이스에서 unstable_RootTagContext
를 사용한 부분을 모두 업데이트해야 한다.
0.66 버전에서의 주요 변경 사항
기존의 RootTag
에 대한 레거시 컨텍스트 접근 방식이 제거되고 RootTagContext
로 대체된다. 0.65 버전부터 개발자들은 RootTag
접근 방식을 RootTagContext
로 미리 마이그레이션할 것을 권장한다.
향후 계획
새로운 React Native 아키텍처가 발전함에 따라 RootTag
에도 향후 개선이 이뤄질 예정이다. 이 과정에서 RootTag
타입을 불투명하게 유지하고 React Native 코드베이스에서의 혼란을 방지할 계획이다. 현재 RootTag
가 숫자로 별칭이 지정되어 있다고 해서 이를 의존하지 말자! 만약 여러분의 앱이 RootTag
에 의존한다면, 여기에서 확인할 수 있는 버전 변경 로그를 꼭 주시해야 한다.