React Native의 Root Wrapper 구조를 살펴보자. 웹으로 치면 App.js에서 Redux Provider, ThemeProvider, BrowserRouter 등을 중첩해서 감싸는 것과 동일한 논리이다. 또한 모바일 특유의 물리적 제약(제스처, 키보드, 네이티브 성능)을 해결하기 위한 라이브러리들도 같이 알아보자.
요즘 나오는 스마트폰들은 노치(Notch), 펀치홀 카메라, 하단의 홈 인디케이터(바) 때문에 화면 전체를 네모 반듯하게 쓸 수가 없다.
이 "위험한 영역"을 피해서 안전한 곳에만 콘텐츠를 보여주게 해주는 핵심 라이브러리가 바로 react-native-safe-area-context다. (React Native 내장 SafeAreaView는 기능이 부족해서 실무에선 무조건 이 라이브러리를 쓴다.)
Safe Area란 노치나 홈 바, 상태 바에 가려지지 않는 순수한 화면 영역을 뜻한다.
<SafeAreaProvider /> : 앱이 시작될 때 "이 폰의 안전 영역이 어디부터 어디까지인지" 계산하고 정보를 뿌려주는 공급자다.
<SafeAreaView /> : Provider가 계산한 정보를 바탕으로, 실제로 패딩(padding)을 줘서 콘텐츠가 잘리지 않게 보호해 주는 컴포넌트(View)다.
기기마다 다른 노치 높이를 알아서 계산해서 paddingTop, paddingBottom 등을 적용해 준다.
유연성: edges 속성을 써서 위, 아래, 왼쪽, 오른쪽 중 어디를 보호할지 정할 수 있다. (예: "위쪽 노치는 피하고, 아래쪽 홈 바는 무시해라" 가능)
react-native-gesture-handler 라이브러리에서 제공하며 네이티브 제스처 시스템의 뿌리이다.
react-native-keyboard-controller 라이브러리에서 제공하며 키보드 애니메이션 동기화를 해준다.
여러 스타일링 솔루션 중 하나의 선택지다.
tamagui 라이브러리에서 제공하며 UI 스타일링 엔진 및 테마 주입의 역할을 한다. 앱 전체에 색상, 폰트, 스페이싱, 미디어 쿼리 설정을 내려준다.
tamagui 라이브러리에서 제공하는 계층 구조 탈출 (모달, 토스트 등) 라이브러리이다.
Provider 간의 의존 관계가 있기 때문에 순서가 중요하다. 아래 순서를 권장한다.
<GestureHandlerRootView style={{ flex: 1 }}> {/* 반드시 최외곽 */}
<SafeAreaProvider>
<KeyboardProvider>
<TamaguiProvider config={tamaguiConfig}>
<PortalProvider>
<App />
</PortalProvider>
</TamaguiProvider>
</KeyboardProvider>
</SafeAreaProvider>
</GestureHandlerRootView>