PromleeBlog
sitemapaboutMe

posting thumbnail
Expo 딥링크 - 쿼리 파라미터로 데이터 전달하고 받기
Expo Deep Linking - Passing and Receiving Data with Query Parameters

📅

🚀

들어가기 전에🔗

오늘은 Expo 앱 개발에서 사용자 경험을 향상시키는 중요한 기술 중 하나인
딥링크(Deep Link)
에 대해 알아보겠습니다.
특히 딥링크를 통해 특정 화면으로 이동하면서, 필요한 데이터를 함께 전달하는 방법, 즉
쿼리 파라미터
를 사용하는 방법을 집중적으로 살펴보겠습니다.


혹시 웹사이트 링크를 클릭했는데 웹 브라우저가 아닌 특정 앱의 특정 화면으로 바로 열리는 경험을 해보신 적 있나요?
이것이 바로 딥링크입니다. 앱 외부(다른 앱, 웹사이트, 푸시 알림 등)에서 앱 내부의 특정 콘텐츠나 기능으로 사용자를 직접 안내하는 편리한 길잡이 역할을 합니다.


이번 글에서는 Expo 프로젝트에서 어떻게 딥링크를 설정하고, URL에 쿼리 파라미터를 붙여 데이터를 전달하며, 앱의 특정 페이지에서 그 데이터를 받아서 활용하는지 Expo Router를 중심으로 단계별로 쉽게 알아보겠습니다.

🚀

딥링크와 쿼리 파라미터, 왜 필요할까요?🔗

딥링크란 무엇일까요?🔗

딥링크는 웹의 URL(주소)처럼 앱에도 고유한 주소를 부여하여, 앱 외부에서도 앱 내부의 특정 화면이나 기능에 직접 접근할 수 있게 해주는 기술입니다.
만약 딥링크가 없다면, 사용자는 링크를 클릭해도 앱의 첫 화면으로만 이동하거나, 앱 스토어로 이동하여 앱을 직접 찾아 실행한 후 원하는 화면까지 여러 단계를 거쳐야 할 것입니다.

쿼리 파라미터는 왜 사용할까요?🔗

때로는 단순히 특정 화면으로 이동하는 것뿐만 아니라,
추가적인 정보
를 함께 전달해야 할 때가 있습니다.
이럴 때 사용하는 것이 바로
쿼리 파라미터
입니다. URL 경로 뒤에 ? 기호를 붙이고, key=value 형태로 필요한 데이터를 여러 개 전달할 수 있습니다 (& 기호로 구분).


예시: myapp://products/detail?productId=123&category=electronics
쿼리 파라미터를 사용하면 딥링크를 통해 사용자를 원하는 화면으로 안내하는 동시에, 해당 화면을 구성하는 데 필요한 구체적인 정보까지 전달할 수 있어 매우 유용합니다.

🚀

Expo 딥링크 설정하기 (Expo Router 기준)🔗

Expo 프로젝트에서 딥링크를 사용하려면 먼저 몇 가지 설정을 해주어야 합니다. Expo Router를 사용하면 이 과정이 매우 간단합니다.

1. URL 스킴(Scheme) 설정🔗

앱을 고유하게 식별할 URL 스킴을 정해야 합니다.
예를 들어 앱 이름이 'My Awesome App'이라면 'myawesomeapp' 같은 스킴을 사용할 수 있습니다. 이 스킴은 앱의 app.json 또는 app.config.js 파일에서 설정합니다.
app.json
{
  "expo": {
    "name": "My Awesome App",
    "slug": "my-awesome-app",
    "scheme": "myawesomeapp", // 여기에 원하는 스킴을 입력합니다.
    "web": {
      "bundler": "metro"
    },
    "plugins": [
      "expo-router" // Expo Router를 사용하고 있다면 이 플러그인이 필요합니다.
    ]
    // ... 기타 설정 ...
  }
}
이 값이 딥링크 URL의 시작 부분이 됩니다 (예: myawesomeapp://...). 일반적으로 앱 이름과 관련되면서도 다른 앱과 겹치지 않는 고유한 이름을 사용하는 것이 좋습니다.
Expo CLI를 사용하여 프로젝트를 빌드하면, 이 scheme 설정이 네이티브 프로젝트 설정(iOS의 Info.plist, Android의 AndroidManifest.xml)에 자동으로 반영됩니다.
expo prebuild

2. Expo Router 파일 구조 활용🔗

Expo Router는 파일 시스템 기반 라우팅을 사용합니다. app 디렉토리 안의 파일 구조가 그대로 URL 경로와 매핑됩니다.
예를 들어, app/products/detail.tsx 라는 파일을 만들면, 이는 myawesomeapp://products/detail 이라는 경로에 해당하게 됩니다.
쿼리 파라미터는 이 경로 뒤에 붙여서 사용하며, 특정 파일을 만들 필요는 없습니다.

🚀

쿼리 파라미터를 포함한 딥링크 생성하기🔗

딥링크 URL은 앱 외부(푸시 알림, 웹사이트 링크, 마케팅 이메일 등)에서 사용됩니다. 쿼리 파라미터를 포함하여 URL을 만드는 것은 간단합니다. 정해진 스킴과 경로 뒤에 ?를 붙이고 key=value 쌍을 &로 연결하면 됩니다.
이렇게 생성된 URL을 사용자가 클릭하면, Expo 앱은 해당 URL을 해석하여 적절한 페이지로 이동하고, 쿼리 파라미터 정보를 해당 페이지 컴포넌트로 전달합니다.

🚀

딥링크로 전달된 파라미터 추출하기 (useLocalSearchParams)🔗

이제 앱의 특정 페이지에서 딥링크 URL에 포함된 쿼리 파라미터 값을 어떻게 가져와 사용하는지 알아보겠습니다. Expo Router는 이를 위한 편리한 훅인 useLocalSearchParams를 제공합니다.
예를 들어 app/products/detail.tsx 파일에서 productId 값을 추출해 보겠습니다.
// 파일 경로: app/products/detail.tsx
 
import { useLocalSearchParams } from 'expo-router';
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
 
export default function ProductDetailScreen() {
  // useLocalSearchParams 훅을 사용하여 현재 경로에 전달된 파라미터를 가져옵니다.
  // 제네릭 타입을 사용하여 파라미터의 타입을 명시할 수 있습니다.
  const params = useLocalSearchParams<{ productId?: string; category?: string }>();
 
  const productId = params.productId; // 'productId' 키로 값 추출
  const category = params.category;   // 'category' 키로 값 추출 (있다면)
 
  console.log('전달받은 Product ID:', productId);
  console.log('전달받은 Category:', category);
 
  // productId를 사용하여 상품 정보를 불러오는 등의 로직 수행 가능
  // useEffect(() => {
  //   if (productId) {
  //     fetchProductDetails(productId);
  //   }
  // }, [productId]);
 
  return (
    <View style={styles.container}>
      <Text style={styles.title}>상품 상세 페이지</Text>
      {productId ? (
        <Text>요청된 상품 ID: {productId}</Text>
      ) : (
        <Text>상품 ID가 전달되지 않았습니다.</Text>
      )}
      {category && ( // category 파라미터가 있을 경우 표시
        <Text>카테고리: {category}</Text>
      )}
    </View>
  );
}
 
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    padding: 20,
  },
  title: {
    fontSize: 24,
    fontWeight: 'bold',
    marginBottom: 20,
  },
});
  1. useLocalSearchParams 훅을 호출하면 현재 화면(라우트)에 해당하는 쿼리 파라미터들이 객체 형태로 반환됩니다.
  2. 반환된 객체(params)에서 필요한 파라미터 이름(예: productId, category)을 키로 사용하여 값을 꺼낼 수 있습니다.
  3. 타입스크립트를 사용한다면 제네릭 useLocalSearchParams<{ productId?: string; category?: string }>() 처럼 파라미터의 타입과 선택적 여부(?)를 명시해주면 코드 안정성을 높일 수 있습니다. 쿼리 파라미터 값은 항상 문자열 형태로 전달되므로, 숫자로 사용해야 한다면 parseInt() 등으로 변환해야 합니다.
  4. 추출한 값(productId)을 사용하여 화면에 필요한 데이터를 표시하거나, 해당 ID로 서버에 상세 정보를 요청하는 등의 후속 작업을 수행할 수 있습니다.

🚀

주의사항 및 테스트 팁🔗

🖐️
앱 스킴은 다른 앱과 충돌하지 않도록 최대한 고유하게 짓는 것이 중요합니다.

테스트 방법🔗

Expo Go 또는 개발 빌드 환경에서 터미널을 열고 다음 명령어를 사용하여 딥링크를 테스트할 수 있습니다. (명령어는 환경에 따라 조금 다를 수 있습니다.)
# Android 에뮬레이터/기기
npx uri-scheme open myawesomeapp://products/detail?productId=999 --android
 
# iOS 시뮬레이터/기기
npx uri-scheme open myawesomeapp://products/detail?productId=999 --ios
iOS 시뮬레이터에서는 'Hardware' > 'Open URL...' 메뉴를 사용할 수도 있습니다.
실제 기기에서는 메모장이나 메시지 앱에 URL을 입력하고 탭하여 테스트해볼 수 있습니다.

🚀

결론🔗

딥링크와 쿼리 파라미터는 사용자 경험을 매끄럽게 만들고 앱의 활용도를 높이는 강력한 도구입니다. 외부 링크를 통해 사용자를 앱의 특정 콘텐츠로 바로 안내하고 필요한 정보까지 전달함으로써, 사용자의 번거로움을 줄이고 앱 참여를 유도할 수 있습니다.
Expo Router의 useLocalSearchParams 훅을 사용하면 딥링크로 전달된 쿼리 파라미터를 매우 간편하게 추출하고 활용할 수 있습니다.

참고🔗