Jake Seo
제이크서 개발 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (719)
    • AI 서비스 개발 일기 (3)
    • LLM 개발 일기 (1)
    • ------레거시 (2025.08.23 이전)--.. (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 스프링 검증
  • try-with-resources
  • 이펙티브 자바
  • 빈 검증
  • 이펙티브자바
  • 메이븐 골
  • bean Validation
  • 자바스크립트 인터뷰
  • 참조 해제
  • 토비의 스프링
  • 이펙티브 자바 item9
  • 자바스크립트
  • 플라이웨이트패턴
  • 도커공식문서
  • 추상 팩터리 패턴
  • MSSQL
  • 싱글톤
  • item7
  • 자바 검증
  • 자바
  • next js app
  • Java
  • 외래키 제약조건
  • 러스트
  • 작업기억공간
  • 프로그래머의 뇌
  • item8
  • 서버리스 컴퓨팅
  • item9
  • 느린 쿼리
  • 슬로우 쿼리
  • pnpm
  • 팩터리 메서드 패턴
  • prerendering
  • 객체복사
  • Next.js
  • Pre-rendering
  • rust
  • serverless computing
  • 싱글톤 패턴
  • 자료구조
  • 메이븐 라이프사이클
  • 메이븐 페이즈
  • 자바스크립트 면접
  • 자바 디자인패턴
  • NEXT JS
  • 디자인패턴
  • Javadoc 자바독 자바주석 주석 Comment
  • 싱글턴
  • 알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 개발 블로그

리액트 네비게이션 (react navigation) 으로 리액트 네이티브 화면 전환하기
리액트 네이티브 (React Native)

리액트 네비게이션 (react navigation) 으로 리액트 네이티브 화면 전환하기

2022. 10. 5. 22:32

리액트 네이티브 화면 전환 방법은?

리액트 네이티브에서 화면을 옮겨다디고 싶다면, 어떤 선택지가 있을까?

다음 두가지 패키지를 고려할 수 있다.

  1. react-navigation
  2. react-router-native

react-navigation

조금 더 앱에 적합한 기능을 많이 가지고 있다.
사실상의 대세이다.

react-router-native

기존에 웹에서 사용하던 react-router 와 사용법이 비슷하여 편리하다.
웹처럼 주소기반의 화면이동이 가능하다.

react-navigation 설치하기

사람들이 많이 사용하는 것이 보통 레퍼런스가 많으니 대세를 따라 react-native 를 설치하는 것이 일반적인 방법이다.

https://reactnavigation.org/docs/getting-started 이 공식문서를 읽고 차근차근 따라하여 설치하고 이용해볼 수 있다.

npm 의존성 설치하기

npm i @react-navigation/native @react-navigation/native-stack @react-navigation/bottom-tabs react-native-screens react-native-safe-area-context
npx pod-install # mac 인 경우에만! darwin machine 전용

/android/app/src/.../MainActivity.java 파일에 코드 추가하기

// import 들 ...

/* 리액트 네비게이션 이용을 위해 추가 */
import android.os.Bundle;

public class MainActivity extends ReactActivity {

  // 다른 자동 생성된 초기 코드들...

  /* 리액트 네비게이션 이용을 위해 추가 */
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(null);
  }
}

/android/build.gradle 파일에 코드 추가하기

buildscript {
    ext {
        ...
        kotlin_version = '1.6.10'
    }
    dependencies {
        ...
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

react-navigation 사용 방법

소스코드 작성해보기

const Stack = createNativeStackNavigator();

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home">
        <Stack.Screen
          name="Home"
          component={HomeScreen}
          options={{ title: "홈" }}
        />
        <Stack.Screen name="Details">
          {(props) => <DetailsScreen {...props} />}
        </Stack.Screen>
      </Stack.Navigator>
    </NavigationContainer>
  );
}

export default App;

계층형 구조

  • NavigationContainer
    • Stack.Navigator
      • Stack.Screen
  • 소스코드를 작성할 때는 위와 같은 계층형 구조로 작성하면 된다.
  • 컨테이너라는 큰 개념이 있고, 내부에 네비게이터가 있고, 네비게이터는 내부에 포함된 스크린들을 왔다갔다할 수 있다.
  • 화면이 실제로 보이지 않더라도, Navigator 내부에 사용할 화면을 전부 깔아놓긴 해야 한다.

Stack.Screen 의 기본 사용법

Stack.Screen 은 위에서 보다시피 2가지 형식으로 사용이 가능하다. Home 과 Details 는 형식이 약간 다르다. 그러나 일반적으로는 HomeScreen 컴포넌트를 렌더링하듯 사용하는 방식이 일반적이다.

화면을 전환하는 방법 (navigation)

Stack.Screen 이 component 속성을 통해 화면을 가져가면서, prop 오브젝트를 전달하고 내부에 navigation 이라는 속성을 넣어 제공하는데, 이 속성을 통해 화면 전환이 가능하다.

navigation.navigate(`${화면 이름}`)

위와 같은 코드를 통해 화면 전환이 가능하다. 아래의 완성 코드에서 useCallback() 부분에 어떻게 사용하는지 정확히 나와있다.

props 오브젝트 내부에는 navigation 외에도 route 라는 속성도 제공된다. route-prop 사용법 공식문서 와 navigation-prop 사용법 공식문서 를 통해 사용법을 배워볼 수 있다.

props 공식문서 초기에는 아래와 같은 내용이 나온다.

Each screen component in your app is provided with the navigation prop automatically. The prop contains various convenience functions that dispatch navigation actions.

"매 스크린 컴포넌트는 자동으로 navigation prop 이 제공된다. prop 에는 다양한 편의 함수가 포함되어 있다."

또한 타입스크립트의 타입에도 나와있긴 한데, 유심히 보지 않으면 찾기 어렵다. 공식 문서 를 유심히 보는게 그나마 찾는 방법이다..

export declare type NativeStackScreenProps<
  ParamList extends ParamListBase,
  RouteName extends keyof ParamList = string,
  NavigatorID extends string | undefined = undefined
> = {
  navigation: NativeStackNavigationProp<ParamList, RouteName, NavigatorID>;
  route: RouteProp<ParamList, RouteName>;
};

알아두면 좋은 것 safe-area-context

safe-area-context 란, 휴대폰의 노치 등에 가리지 않고 확실히 화면에 나오는 영역을 이야기한다. 현재의 react-navigation 은 safe-area-context 가 자동으로 적용된 상태이다.

react-navigation 의 화면의 종류

보통은 Stack 을 사용하지만, Tab, Drawer 등 다양한 방식을 제공한다.

보통 Stack 을 사용하는 이유는 이전 페이지의 정보를 계속 유지하며 다음 페이지로 넘어갈 수 있기 때문이다. 앱에서는 이런 방식을 많이 사용한다.

react-navigation 의 Params 추가 가능

스크린에 다양한 params 를 넘길 수 있지만, 최소한의 정보만 넘겨서 소프트웨어의 복잡도를 높이지 않도록 주의해야 한다.

최종 코드 및 결과 확인하기

import * as React from "react";
import { NavigationContainer, ParamListBase } from "@react-navigation/native";
import {
  createNativeStackNavigator,
  NativeStackScreenProps,
} from "@react-navigation/native-stack";
import { Text, TouchableHighlight, View } from "react-native";
import { useCallback } from "react";

type HomeScreenProps = NativeStackScreenProps<ParamListBase, "Home">;
type DetailsScreenProps = NativeStackScreenProps<ParamListBase, "Details">;

function HomeScreen({ navigation }: HomeScreenProps) {
  const onClick = useCallback(() => {
    navigation.navigate("Details");
  }, [navigation]);

  return (
    <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
      <TouchableHighlight onPress={onClick}>
        <Text>홈 스크린</Text>
      </TouchableHighlight>
    </View>
  );
}

function DetailsScreen({ navigation }: DetailsScreenProps) {
  const onClick = useCallback(() => {
    navigation.navigate("Home");
  }, [navigation]);

  return (
    <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
      <TouchableHighlight onPress={onClick}>
        <Text>디테일 스크린</Text>
      </TouchableHighlight>
    </View>
  );
}

const Stack = createNativeStackNavigator();

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home">
        <Stack.Screen
          name="Home"
          component={HomeScreen}
          options={{ title: "홈" }}
        />
        <Stack.Screen
          name="Details"
          component={DetailsScreen}
          options={{ title: "디테일" }}
        />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

export default App;

위의 화면에서 홈 스크린 을 클릭하면,

디테일 스크린 이 있는 화면으로 전환된다.

레퍼런스

인프런 - 배달앱 클론코딩

저작자표시 비영리 (새창열림)

'리액트 네이티브 (React Native)' 카테고리의 다른 글

리액트 네이티브 TextInput 컴포넌트 사용 방법  (0) 2022.10.10
spawnSync ./gradlew EACCES 에러 해결 방법  (0) 2022.10.09
리액트 네이티브 앱 이름 변경 방법  (0) 2022.10.03
리액트 네이티브 (React Native) 앱 디버깅 하는 방법들  (0) 2022.10.03
React Native 의 Metro 란? Metro (메트로) 소개  (0) 2022.10.02
    '리액트 네이티브 (React Native)' 카테고리의 다른 글
    • 리액트 네이티브 TextInput 컴포넌트 사용 방법
    • spawnSync ./gradlew EACCES 에러 해결 방법
    • 리액트 네이티브 앱 이름 변경 방법
    • 리액트 네이티브 (React Native) 앱 디버깅 하는 방법들
    Jake Seo
    Jake Seo
    ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바