딥 링크(Deep Link)는 홈 화면을 거치지 않고 모바일 애플리케이션 내의 특정 화면이나 콘텐츠로 사용자를 직접 안내하는 URL입니다. 웹사이트의 일반 링크와 달리 딥 링크는 앱을 활성화하고 즉시 대상 콘텐츠를 엽니다. Android Developers에 따르면, 올바르게 구성된 딥 링크는 콘텐츠에 도달하는 단계 수를 줄여 목표 작업으로의 전환율을 30~50% 향상시킵니다.
핵심 포인트
딥 링크(Deep Link)는 클릭 시 웹 페이지가 아닌 모바일 애플리케이션 내의 특정 화면을 여는 URI입니다. 이 기술은 모바일 플랫폼의 근본적인 문제를 해결합니다. 브라우저는 앱 화면을 직접 열 수 없으며, 딥 링크가 웹과 네이티브 코드 사이의 브리지를 만듭니다. 딥 링크가 없으면 사용자는 항상 홈 화면에 도달하여 원하는 콘텐츠로 수동으로 이동해야 합니다.
딥 링크의 아키텍처는 두 부분으로 구성됩니다. 스키마(scheme)는 어떤 앱이 링크를 처리할지 결정하고, 경로(path)는 앱 내의 특정 리소스(제품, 기사, 사용자 프로필 또는 설정 섹션)를 가리킵니다. 쿼리 매개변수(?source=push&campaign=summer)는 분석, 개인화 및 캠페인 기여도 분석을 위한 추가 컨텍스트를 전달합니다.
딥 링크와 일반 링크를 구분하는 것이 중요합니다. 일반 링크(https://example.com/product/42)는 브라우저에서 열리고 페이지의 웹 버전으로 이동합니다. 딥 링크(myapp://product/42)는 앱이 설치된 경우 동일한 콘텐츠의 네이티브 화면을 열지만, 앱이 설치되지 않은 경우 오류를 표시합니다. Universal Link(iOS)와 App Link(Android)는 완벽한 폴백 문제를 해결하기 위해 특별히 만들어졌습니다.
다양한 작업에는 다양한 유형의 딥 링크가 필요합니다. 일부 링크는 설치된 앱에서만 작동하고, 다른 링크는 설치를 기다릴 수 있으며, 또 다른 링크는 분석 컨텍스트를 전달합니다. 유형 선택은 사용 시나리오(광고 캠페인, 푸시 알림, 콘텐츠 공유 또는 이메일 뉴스레터)에 따라 다릅니다.
표준 딥 링크는 앱이 기기에 이미 설치된 경우에만 실행되는 기본 유형입니다. 사용자가 myapp://product/42 링크를 클릭하면 시스템이 등록된 스키마를 감지하고 원하는 화면에서 앱을 엽니다. 앱이 설치되지 않은 경우 브라우저는 “페이지를 찾을 수 없음” 오류를 표시하거나 아무 작업도 수행하지 않습니다. 이 유형은 이미 설치된 애플리케이션 내의 내비게이션에 적합합니다.
표준 딥 링크 설정은 간단합니다. 매니페스트(Android) 또는 Info.plist(iOS)에 URI 스키마를 등록하기만 하면 됩니다. 서버 확인이나 SSL 인증서가 필요하지 않습니다. 그러나 폴백이 없기 때문에 이 유형은 마케팅 캠페인에 적합하지 않은 것으로 간주됩니다. 앱이 없는 사용자의 트래픽 손실은 최대 60%에 달할 수 있습니다.
디퍼드 딥 링크는 일반 딥 링크의 주요 문제를 해결합니다. 앱이 설치되지 않은 경우에도 작동합니다. 사용자가 링크를 클릭 → 페이지(랜딩 페이지 또는 App Store/Google Play)를 봄 → 앱 설치 → 첫 실행 시 앱이 원본 링크의 컨텍스트를 받아 원하는 화면을 엽니다. 이 기술은 첫 실행까지 서버에 컨텍스트를 저장하는 중개 SDK(AppsFlyer, Branch, Adjust)가 필요합니다.
Branch는 디퍼드 딥 링크에서 가장 인기 있는 플랫폼 중 하나입니다. 모든 플랫폼에서 작동하는 단일 링크를 제공합니다. 사용자의 OS를 감지하고 앱 스토어로 리디렉션한 다음 설치 후 컨텍스트(프로모션 코드, 제품 ID, 캠페인 소스)를 전달합니다. Branch(2024)에 따르면 디퍼드 딥 링크는 광고 캠페인 전환율을 40~70% 향상시킵니다.
컨텍스트형 딥 링크는 트래픽 소스, 캠페인, 프로모션 코드, 리퍼러, 파트너 ID 등의 컨텍스트 매개변수로 보완된 일반 또는 디퍼드 딥 링크입니다. 매개변수는 URL로 전달되며 개인화를 위해 앱에서 처리됩니다. 환영 보너스 표시, 할인 제품 열기, 설치 분석 기록 등이 가능합니다.
UTM 태그(utm_source, utm_medium, utm_campaign)는 컨텍스트를 전달하는 표준 방법입니다. 모바일에서 컨텍스트형 딥 링크는 기여도 분석에 중요합니다. 이것이 없으면 앱 소유자는 어떤 채널(오가닉 트래픽, Facebook 광고, 이메일 뉴스레터 또는 QR 코드)이 사용자를 유치했는지 알 수 없습니다. 품질 기여도 분석을 위해서는 MMP(Mobile Measurement Partner)와의 통합이 필요합니다.
| 딥 링크 유형 | 설치 필요 | 설치 대기 | 컨텍스트 |
|---|---|---|---|
| 표준 | 예 | 아니요 | URL만 |
| 디퍼드 | 아니요 | 예 | 서버 저장 |
| 컨텍스트형 | 모두 | 모두 | UTM + 매개변수 |
iOS는 두 가지 메커니즘을 통해 딥 링크를 지원합니다. 기존의 Custom URL Scheme과 최신 Universal Link(iOS 9+)입니다. Custom URL Scheme은 Info.plist에 사용자 정의 스키마를 등록하여 작동합니다. 앱이 myapp://을 등록하면 iOS가 해당 링크를 클릭할 때 앱을 엽니다. 문제점: 스키마가 어떤 앱에도 등록되지 않은 경우 브라우저가 오류를 표시합니다.
iOS에서 딥 링크 처리는 AppDelegate 메서드 application(_:open:options:) 또는 SceneDelegate scene(_:openURLContexts:)을 통해 이루어집니다. 개발자는 URL을 추출하고 경로와 매개변수를 파싱한 다음 적절한 화면으로 이동합니다. SwiftUI를 사용하는 경우 OpenURLAction 또는 onChange(of: openURL)을 통해 처리가 수행됩니다. 앱 상태(시작되지 않음, 백그라운드, 활성)를 올바르게 처리하는 것이 중요합니다.
iOS의 보안은 엄격합니다. 모든 앱이 동일한 스키마를 등록하여 Custom URL Scheme을 가로챌 수 있습니다. 이는 잠재적인 취약점(URL 스키마 하이재킹)입니다. 따라서 Apple은 Universal Link를 더 안전한 대안으로 권장합니다. 확인된 도메인 소유자만 앱과 링크를 연결할 수 있습니다. Universal Link에 대한 자세한 내용은 Universal Link 문서를 참조하세요.
Android는 AndroidManifest.xml의 Intent Filter를 통해 딥 링크를 구현합니다. 앱은 특정 스키마(myapp://) 또는 특정 호스트와 경로를 처리하는 Activity를 정의합니다. 사용자가 딥 링크를 클릭하면 Android는 일치하는 Intent Filter가 있는 Activity를 찾아 엽니다. 일치하는 Activity가 여러 개인 경우 시스템은 앱 선택 대화상자를 표시합니다.
// AndroidManifest.xml - 딥 링크용 Intent Filter
<activity
android:name=".ui.ProductActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="product"
android:pathPrefix="/" />
</intent-filter>
</activity>
Android에서 딥 링크 처리는 Activity.onCreate() 또는 onNewIntent() 메서드에서 수행됩니다. 개발자는 Intent를 받아 URI를 추출하고 내비게이션을 실행합니다. Jetpack Navigation의 경우 Navigation Deep Link 구성 요소를 사용하여 내비게이션 그래프에서 딥 링크를 선언적으로 설명할 수 있습니다. Android App Link(Android 6.0+)는 Digital Asset Links를 통한 확인이 포함된 딥 링크의 진화형으로, 앱 선택 대화상자를 제거합니다.
Android 12+ 변경 사항을 고려하는 것이 중요합니다. API 31부터 시스템은 딥 링크를 처리하는 Activity에 exported=true를 명시적으로 선언해야 하며 Intent Filter의 정확성을 확인합니다. Google Play Store는 게시 시 App Link 확인을 검사합니다. 확인이 없으면 딥 링크가 존재하지 않는 웹사이트 페이지로 연결될 경우 Google이 업데이트를 거부할 수 있습니다.
딥 링크 설정에는 두 플랫폼에 공통적인 여러 단계가 포함됩니다. 첫 번째 단계는 스키마와 URL 구조를 정의하는 것입니다. Universal Link 및 App Link와의 호환성을 위해 사용자 정의 스키마 대신 https 스키마를 사용하는 것이 좋습니다. URL 구조는 웹사이트 구조를 반영해야 합니다: /product/42, /profile/john, /settings/notifications. 이렇게 하면 유지 관리와 검색 엔진의 콘텐츠 색인이 간소화됩니다.
두 번째 단계는 앱 코드에서 딥 링크를 처리하는 것입니다. Android의 경우 nav_graph에서 선언적 딥 링크와 함께 Jetpack Navigation을 사용하는 것이 좋습니다. iOS의 경우 OpenURLAction 처리가 포함된 SwiftUI NavigationStack을 사용하는 것이 좋습니다. 콜드 스타트(앱이 시작되지 않음), 웜 스타트(백그라운드), 활성(화면에 표시됨)의 세 가지 앱 상태를 처리하는 것이 중요합니다. 각 상태에는 다른 내비게이션 로직이 필요합니다.
딥 링크 테스트는 별도의 작업입니다. Android Studio는 Intent Filter 확인을 위한 App Links Assistant 도구를 제공합니다. iOS에서는 시작 인수를 통해 URL을 전달하여 Xcode를 통해 테스트합니다. CI 확인(자동 딥 링크 내비게이션 및 예상 화면이 열렸는지 확인)을 설정하는 것이 좋습니다. 디퍼드 딥 링크의 경우 테스트에는 “설치 → 첫 실행 → 컨텍스트”의 전체 주기가 포함됩니다. 테스트 없이 앱 내비게이션이 업데이트되면 딥 링크가 자주 손상됩니다.
자주 묻는 질문
일반 링크(https://site.com/page)는 브라우저에서 열립니다. 딥 링크(myapp://page 또는 확인이 포함된 https://site.com/page)는 모바일 앱 내의 화면을 엽니다. 딥 링크는 프로모션 코드, 트래픽 소스, 리퍼러 ID 등의 컨텍스트도 전달할 수 있습니다.
URI 스키마는 어떤 앱이 링크를 처리할지 결정하는 URL 접두사입니다(예: myapp://, vk://, tg://). 시스템은 라우팅에 스키마를 사용합니다. 이 스키마를 등록한 앱을 찾아 처리를 위해 URL을 전달합니다.
사용자가 링크 클릭 → 서비스(Branch, AppsFlyer)가 컨텍스트 저장 → App Store/Google Play로 리디렉션 → 설치 및 첫 실행 후 SDK가 저장된 컨텍스트를 앱에 전달 → 앱이 원하는 화면을 엽니다(마치 사용자가 이미 앱을 설치한 것처럼).
일반 딥 링크 — 아니요. 디퍼드 딥 링크 — 예, 앱 스토어로 리디렉션하고 컨텍스트를 저장하는 중간 페이지를 통해 가능합니다. Universal Link와 App Link는 앱이 설치되지 않은 경우 폴백으로 웹사이트를 엽니다.
Android에서는 adb 사용: adb shell am start -W -a android.intent.action.VIEW -d “myapp://product/42”. iOS에서는 — xcrun simctl openurl booted “myapp://product/42”. 두 플랫폼 모두 Firebase Dynamic Links 및 Branch 테스트 콘솔을 사용할 수 있습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.