에 대해 알아보겠습니다.
특히 딥링크를 통해 특정 화면으로 이동하면서, 필요한 데이터를 함께 전달하는 방법, 즉
쿼리 파라미터
를 사용하는 방법을 집중적으로 살펴보겠습니다.
혹시 웹사이트 링크를 클릭했는데 웹 브라우저가 아닌 특정 앱의 특정 화면으로 바로 열리는 경험을 해보신 적 있나요?
이것이 바로 딥링크입니다. 앱 외부(다른 앱, 웹사이트, 푸시 알림 등)에서 앱 내부의 특정 콘텐츠나 기능으로 사용자를 직접 안내하는 편리한 길잡이 역할을 합니다.
이번 글에서는 Expo 프로젝트에서 어떻게 딥링크를 설정하고, URL에 쿼리 파라미터를 붙여 데이터를 전달하며, 앱의 특정 페이지에서 그 데이터를 받아서 활용하는지 Expo Router를 중심으로 단계별로 쉽게 알아보겠습니다.
딥링크는 웹의 URL(주소)처럼 앱에도 고유한 주소를 부여하여, 앱 외부에서도 앱 내부의 특정 화면이나 기능에 직접 접근할 수 있게 해주는 기술입니다.
만약 딥링크가 없다면, 사용자는 링크를 클릭해도 앱의 첫 화면으로만 이동하거나, 앱 스토어로 이동하여 앱을 직접 찾아 실행한 후 원하는 화면까지 여러 단계를 거쳐야 할 것입니다.
앱을 고유하게 식별할 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 Router는 파일 시스템 기반 라우팅을 사용합니다. app 디렉토리 안의 파일 구조가 그대로 URL 경로와 매핑됩니다.
예를 들어, app/products/detail.tsx 라는 파일을 만들면, 이는 myawesomeapp://products/detail 이라는 경로에 해당하게 됩니다.
쿼리 파라미터는 이 경로 뒤에 붙여서 사용하며, 특정 파일을 만들 필요는 없습니다.
이제 앱의 특정 페이지에서 딥링크 URL에 포함된 쿼리 파라미터 값을 어떻게 가져와 사용하는지 알아보겠습니다. Expo Router는 이를 위한 편리한 훅인 useLocalSearchParams를 제공합니다.
예를 들어 app/products/detail.tsx 파일에서 productId 값을 추출해 보겠습니다.
// 파일 경로: app/products/detail.tsximport { 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, },});
useLocalSearchParams 훅을 호출하면 현재 화면(라우트)에 해당하는 쿼리 파라미터들이 객체 형태로 반환됩니다.
반환된 객체(params)에서 필요한 파라미터 이름(예: productId, category)을 키로 사용하여 값을 꺼낼 수 있습니다.
타입스크립트를 사용한다면 제네릭 useLocalSearchParams<{ productId?: string; category?: string }>() 처럼 파라미터의 타입과 선택적 여부(?)를 명시해주면 코드 안정성을 높일 수 있습니다. 쿼리 파라미터 값은 항상 문자열 형태로 전달되므로, 숫자로 사용해야 한다면 parseInt() 등으로 변환해야 합니다.
추출한 값(productId)을 사용하여 화면에 필요한 데이터를 표시하거나, 해당 ID로 서버에 상세 정보를 요청하는 등의 후속 작업을 수행할 수 있습니다.
딥링크와 쿼리 파라미터는 사용자 경험을 매끄럽게 만들고 앱의 활용도를 높이는 강력한 도구입니다. 외부 링크를 통해 사용자를 앱의 특정 콘텐츠로 바로 안내하고 필요한 정보까지 전달함으로써, 사용자의 번거로움을 줄이고 앱 참여를 유도할 수 있습니다.
Expo Router의 useLocalSearchParams 훅을 사용하면 딥링크로 전달된 쿼리 파라미터를 매우 간편하게 추출하고 활용할 수 있습니다.