1. New Architecture

1-1. 왜 등장 했는가?

Bridge

Java Script != Native 서로의 언어를 못 알아들음!

이런 문제가 발생하므로, 중간에 interpreting해주는 도구가 필요함

  1. JS Thread가 요청을 직려화
  2. Bridge가 역직렬화함 (Queue에 저장 비동기적으로 전달)
  3. Shadow Thread가 번역된 스타일 정보를 넘겨 받음.

JSI

직통 전화와 같이 작업한다.

  • Js Thread JavaScript Interface Native (UI Thread)

Note

JSI는 cpp로 작성된 크로스 플랫폼 어딘가와 통신한다.

Bridge 병목

JSThread에서 여러 개의 요청을 보내면 Native Bridge가 다 받아들이지 못하고 오류가 난다.

JSI를 거쳐간 Task에는 대해 블로킹이 발생할 가능성이 있지 않는가?

  • Native Bridge 비동기 큐 덕분에 Native가 아무리 느려도 JS Thread가 계속 실행될 수 있음

  • New Architecture 방식 무거운 작업이 동시에 나올 경우 멈출 위험이 있음. (native bridge와 다르게 queue와 같은 알고리즘을 사용하지 않아서, 무거운 작업이 실행되면 다른 작업에 자원을 나눠줄 수 없는 상황이 만들어질 수 있음.)

Expo와 New Architecture

  • Expo SDK 55 이상은 기본적으로 New Architecture를 적용하는 것이 강제화됨!

Note

단, 이전 버전은 설정 파일 (app.json)에서 newArchEnabled 값 설정으로 끌 수 있음.

newArchEnabled" : ture

Stack

  • 순서가 있는 흐름
<Stack.Screen />

Tab

  • 동등한 주요 화면 구분
<Tabs.Screen />

Drawer

  • 탭에 다 담기 어려운 구조
<Drawer.Screen />

2. Expo Router

2-1. Expo Router vs React Nativation

2-2. Expo Router 파일 기반 라우팅

  • index.tsx :
  • home.tsx, profile.tsx :
  • [id].tsx :

2-3. Stack Natigator

앱 시작될 때의 진입점에 해당하는 지점.

Push

router.push(href)

router.push('/Comment')

Warning

push를 반복하면 Stack이 쌓이면서 메모리 낭비로 이어질 수 있다.

Dismiss

router.dismiss(count)

router.dismiss(2)

Replace

router.replace(href)

router.replace('/Profile')

Note

로그인 완료 후 없어진 LoginScreen 히스토리 없애는 용도로 많이 상용됨.

Back

router.back() / pop()

router.back()

useLocalSearchParams

Warning

URL 기반 값이므로 숫자도 문자로됨

3. Deep Link

Deep Link란?

알림창에서 알림과 관련된 페이지로 바로 이동하게 되는데 사용하는 기술

Note

Expo Go 환경에서 제한이 있을 수 있음.

Custom Scheme

앱만 이해하는 URL을 활용하여 앱의 화면을 이동하는 기술

myapp://profile/1
  • 장점
    • 설정이 간단
    • 빠른 테스트가 가능
  • 단점
    • 앱이 없으면 동작하지 않음
    • 보안 취약점이 존재함(hijack 공격)

Note

hijack 공격이란?

import { View, Text, Button } from "react-native";
import { Link } from "expo-router";
 
export default function Home() {
  return (
    <View>
      <Text>Home</Text>
      <Link href="/profile/1" asChild>
        <Button title="Go Profile" />
      </Link>
    </View>
  );
}
import { useLocalSearchParams } from "expo-router";
import { View, Text } from "react-native";
 
export default function Profile() {
  const { id } = useLocalSearchParams();
 
  return (
    <View>
      <Text>Profile ID: {id}</Text>
    </View>
  );
}

웹 링크인데 앱에서 접근 가능하게 하여 화면 이동하는 기술

https://myapp.com/profile/1
  • 장점
    • 앱이 없어도 웹으로 fallback 가능
  • 단점
    • 설정이 복잡
    • 추가 서버 필요

Expo Router 설정

4. 실습