Ver3.0 ๐ฑ ๋ชจ๋ฐ์ผ ๋ถ์๊ณผ Firebase Analytics๋ก์ฌ์ฉ์ ํ๋ ์๋ฒฝ ์ถ์ ํ๊ธฐ

๐ฑ ๋ชจ๋ฐ์ผ ๋ถ์๊ณผ Firebase Analytics๋ก
์ฌ์ฉ์ ํ๋ ์๋ฒฝ ์ถ์ ํ๊ธฐ
๋ฐ์ดํฐ๋ก ์ฝ๋ ์ฌ์ฉ์์ ๋ง์, ์ฑ ์ฑ๊ณต์ ๋น๋ฐ ์ด์ ๐
์์ฆ ์ฑ ํ๋ ๋ง๋ค๋ฉด ๋์ด ์๋์์? ๐ค
"์ฐ๋ฆฌ ์ฑ ์ฌ๋๋ค์ด ์ง์ง ์ฐ๊ธด ํ๋ ๊ฑด๊ฐ?", "์ด๋์ ์ดํํ๋ ๊ฑฐ์ง?", "์ด ๊ธฐ๋ฅ์ ์ ์๋ฌด๋ ์ ์ฐ์ง?"
์ด๋ฐ ๊ณ ๋ฏผ๋ค, ๊ฐ๋ฐ์๋ผ๋ฉด ํ ๋ฒ์ฏค ํด๋ดค์ ๊ฑฐ์ผ.
๋ฐ๋ก ์ฌ๊ธฐ์ ๋ฑ์ฅํ๋ ๊ฒ ๋ชจ๋ฐ์ผ ๋ถ์(Mobile Analytics)์ด์ผ!
ํนํ Firebase Analytics๋ ๊ตฌ๊ธ์ด ์ ๊ณตํ๋ ๋ฌด๋ฃ ๋ถ์ ๋๊ตฌ๋ก, ์ฑ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ์ง์ง ํซํ ํด์ด์ง.
์ค๋์ ์ด ์น๊ตฌ๋ฅผ ์ด๋ป๊ฒ ํ์ฉํด์ ์ฌ์ฉ์ ํ๋์ ์ถ์ ํ๊ณ , ์ฑ์ ๊ฐ์ ํ ์ ์๋์ง ์น๊ตฌ์ฒ๋ผ ํธํ๊ฒ ์๋ ค์ค๊ฒ! ๐
๐ฏ ๋ชจ๋ฐ์ผ ๋ถ์์ด ๋ญ๊ธธ๋ ์ด๋ ๊ฒ ์ค์ํ ๊น?
์์งํ ๋งํด์, ์ฑ ๋ง๋ค๊ณ ์ถ์ํ๋ ๊ฑด ์์์ผ ๋ฟ์ด์ผ.
์ง์ง ๊ฒ์์ ๊ทธ ๋ค์๋ถํฐ ์์๋๊ฑฐ๋ ! ๐ฎ
๋ชจ๋ฐ์ผ ๋ถ์์ ์ฝ๊ฒ ๋งํด์ "์ฑ ์์์ ์ฌ์ฉ์๋ค์ด ๋ญ ํ๋์ง ๋ชฐ๋(?) ์ง์ผ๋ณด๋ ๊ฒ"์ด์ผ.
๋ฌผ๋ก ํฉ๋ฒ์ ์ด๊ณ ์ค๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋ง์ด์ง! ๐
์๋ฅผ ๋ค์ด๋ณผ๊ฒ:
- ์ฌ์ฉ์๊ฐ ์ฑ์ ์ด์์ ๋ ๊ฐ์ฅ ๋จผ์ ๋ณด๋ ํ๋ฉด์?
- ์ด๋ค ๋ฒํผ์ ๊ฐ์ฅ ๋ง์ด ํด๋ฆญํ๋?
- ์ด๋ ๋จ๊ณ์์ ์ฑ์ ์ข
๋ฃํ๋?
- ํน์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ฐ ์ผ๋ง๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋?
์ด๋ฐ ์ ๋ณด๋ค์ด ์์ด๋ฉด, ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฒ ๋ญ์ง, ๋ถํธํ ๊ฒ ๋ญ์ง ๋ฐ์ดํฐ๋ก ์ ์ ์์ด.
๊ทธ๋ฅ "์ด๋ด ๊ฒ ๊ฐ์๋ฐ?"๋ผ๋ ์ถ์ธก์ด ์๋๋ผ, ํฉํธ ๊ธฐ๋ฐ์ ํ์คํ ์ธ์ฌ์ดํธ๋ฅผ ์ป๋ ๊ฑฐ์ง! ๐ก
๐ฌ ์ค์ ์ฌ๋ก๋ก ๋ณด๋ ๋ถ์์ ํ
์ด๋ค ์ผํ ์ฑ์ด ์์๋๋ฐ, ๊ฐ๋ฐํ์ "๊ฒฐ์ ๋ฒํผ์ด ๋๋ฌด ์์์ ํด๋ฆญ๋ฅ ์ด ๋ฎ์ ๊ฑฐ์ผ"๋ผ๊ณ ์๊ฐํ๋.
๊ทธ๋ฐ๋ฐ Firebase Analytics๋ก ๋ถ์ํด๋ณด๋๊น, ๋ฒํผ ํฌ๊ธฐ๋ ๋ฌธ์ ๊ฐ ์๋์์ด!
์ง์ง ๋ฌธ์ ๋ ๊ฒฐ์ ์ง์ ์ ๋์ค๋ ๋ฐฐ์ก๋น ์๋ด๊ฐ ๋๋ฌด ๋ฆ๊ฒ ํ์๋ผ์ ์ฌ์ฉ์๋ค์ด ๋๋ผ์ ์ดํํ๋ ๊ฑฐ์์ง.
๋ฐฐ์ก๋น๋ฅผ ์ฅ๋ฐ๊ตฌ๋ ๋จ๊ณ์์ ๋ฏธ๋ฆฌ ๋ณด์ฌ์ฃผ๋๊น ์ ํ์จ์ด 35%๋ ์ฌ๋๋ค๊ณ ํด! ๐
์ด๊ฒ ๋ฐ๋ก ๋ฐ์ดํฐ ๋ถ์์ ํ์ด์ผ. ์ถ์ธก์ด ์๋ ์ฌ์ค์ ์๋ ค์ฃผ๊ฑฐ๋ !
๐ฅ Firebase Analytics, ๋๋ ๋๊ตฌ๋?
Firebase Analytics๋ ๊ตฌ๊ธ์ด ์ ๊ณตํ๋ ๋ฌด๋ฃ ์ฑ ๋ถ์ ํ๋ซํผ์ด์ผ.
"๋ฌด๋ฃ"๋ผ๋ ๋ง์ ํนํ์ง ์์์ด? ๋๋ ์ฒ์์ ๊ทธ๋ฌ์ด! ๐
๊ทผ๋ฐ ์ง์ง ์ฅ์ ์ ๋ฌด๋ฃ๋ผ๋ ๊ฒ๋ง์ด ์๋์ผ:
โจ Firebase Analytics์ ํต์ฌ ์ฅ์ ๋ค
1. ์์ ๋ฌด๋ฃ ๐ฐ
์ ์ฌ์ฉ๋ ์ ํ ์์ด ๋ฌด์ ํ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์ถ์ ํ ์ ์์ด.
๋ค๋ฅธ ์ ๋ฃ ๋ถ์ ๋๊ตฌ๋ค์ ์ฌ์ฉ์ ์๋ ์ด๋ฒคํธ ์์ ๋ฐ๋ผ ๊ณผ๊ธ๋๋๋ฐ, Firebase๋ ๊ทธ๋ฐ ๊ฑฐ ์์ด!
2. ์ค์๊ฐ ๋ฐ์ดํฐ โก
์ง๊ธ ์ด ์๊ฐ ์ฌ์ฉ์๋ค์ด ๋ญ ํ๊ณ ์๋์ง ์ค์๊ฐ์ผ๋ก ๋ณผ ์ ์์ด.
๋ง์น CCTV ๋ณด๋ฏ์ด... ์๋ ๊ทธ๊ฑด ์ข ๋ฌด์ญ๊ณ , ๋์๋ณด๋๋ก ๊น๋ํ๊ฒ ๋ณผ ์ ์์ง! ๐บ
3. ๋ค๋ฅธ Firebase ์๋น์ค์ ํตํฉ ๐
Firebase Cloud Messaging, Remote Config, A/B Testing ๋ฑ ๋ค๋ฅธ Firebase ๊ธฐ๋ฅ๋ค๊ณผ ์๋ฒฝํ๊ฒ ์ฐ๋๋ผ.
ํ ๋ฒ ์ค์ ํด๋๋ฉด ์ ์ฒด ์ํ๊ณ๋ฅผ ํ์ฉํ ์ ์๋ค๋ ๊ฑฐ์ง!
4. ์๋ ์์ง ์ด๋ฒคํธ ๐ค
์ฑ ์ค์น, ์ฒซ ์คํ, ์ธ์
์์ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ์ด๋ฒคํธ๋ค์ ์๋์ผ๋ก ์์งํด์ค.
๊ฐ๋ฐ์๊ฐ ๋ฐ๋ก ์ฝ๋ ์งค ํ์ ์์ด ๋ง์ด์ผ!
5. BigQuery ์ฐ๋ ๐
๊ณ ๊ธ ๋ถ์์ด ํ์ํ๋ฉด BigQuery๋ก ์์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ผ ์ ์์ด.
SQL ์ฟผ๋ฆฌ๋ก ์ํ๋ ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ ์ ์๋ค๋ ๋ป์ด์ง!
๐ ์ฌ๋ฅ๋ท์์ ๋ฐฐ์ฐ๋ Firebase ํ์ฉ๋ฒ
Firebase Analytics๊ฐ ์ฒ์์ด๋ผ๋ฉด ํผ์ ๊ณต๋ถํ๊ธฐ ๋ง๋งํ ์ ์์ด.
์ฌ๋ฅ๋ท์๋ ์ค๋ฌด ๊ฒฝํ์ด ํ๋ถํ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์๋ค์ด ๋ง์์, 1:1 ๋ฉํ ๋ง์ด๋ ํ๋ก์ ํธ ์ปจ์คํ
์ ๋ฐ์ ์ ์์ด.
ํนํ ์ค์ ์ฑ์ Firebase๋ฅผ ์ ์ฉํ๋ฉด์ ์๊ธฐ๋ ์ธ์ธํ ์ด์๋ค์ ๊ฒฝํ์์๊ฒ ๋ฐฐ์ฐ๋ ๊ฒ ํจ์ฌ ๋น ๋ฅด๊ฑฐ๋ ! ๐ช
๐ ๏ธ Firebase Analytics ์์ํ๊ธฐ: ์ค์น๋ถํฐ ์ค์ ๊น์ง
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Firebase Analytics๋ฅผ ๋ด ์ฑ์ ์ ์ฉํด๋ณด์!
์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์์ผ๋๊น ๊ฑฑ์ ๋ง! ๐
๐ฑ 1๋จ๊ณ: Firebase ํ๋ก์ ํธ ์์ฑ
๋จผ์ Firebase Console(console.firebase.google.com)์ ์ ์ํด์ผ ํด.
๊ตฌ๊ธ ๊ณ์ ๋ง ์์ผ๋ฉด ๋๊ตฌ๋ ๋ฌด๋ฃ๋ก ์์ํ ์ ์์ด!
1. "ํ๋ก์ ํธ ์ถ๊ฐ" ๋ฒํผ ํด๋ฆญ
2. ํ๋ก์ ํธ ์ด๋ฆ ์
๋ ฅ (์: "MyAwesomeApp")
3. Google Analytics ์ฌ์ฉ ์ค์ (๊ธฐ๋ณธ์ ์ผ๋ก ์ฒดํฌ๋์ด ์์)
4. Analytics ๊ณ์ ์ ํ ๋๋ ์๋ก ์์ฑ
5. ํ๋ก์ ํธ ์์ฑ ์๋ฃ! ๐
๐ฒ 2๋จ๊ณ: ์ฑ ๋ฑ๋กํ๊ธฐ
ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์์ผ๋ฉด ์ด์ ๋ด ์ฑ์ ๋ฑ๋กํด์ผ ํด.
iOS ์ฑ์ธ์ง, Android ์ฑ์ธ์ง์ ๋ฐ๋ผ ๊ณผ์ ์ด ์กฐ๊ธ ๋ฌ๋ผ์ ธ.
Android ์ฑ์ ๊ฒฝ์ฐ:
- Android ์์ด์ฝ ํด๋ฆญ
- ํจํค์ง ์ด๋ฆ ์
๋ ฅ (์: com.mycompany.myapp)
- ์ฑ ๋๋ค์ ์
๋ ฅ (์ ํ์ฌํญ)
- google-services.json ํ์ผ ๋ค์ด๋ก๋
- ์ด ํ์ผ์ ์ฑ์ app/ ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌ
iOS ์ฑ์ ๊ฒฝ์ฐ:
- iOS ์์ด์ฝ ํด๋ฆญ
- Bundle ID ์
๋ ฅ
- ์ฑ ๋๋ค์ ์
๋ ฅ (์ ํ์ฌํญ)
- GoogleService-Info.plist ํ์ผ ๋ค์ด๋ก๋
- Xcode ํ๋ก์ ํธ์ ์ด ํ์ผ ์ถ๊ฐ
ํ ์คํธ ๋ฐ์ดํฐ๊ฐ ์ค์ ์ฌ์ฉ์ ๋ฐ์ดํฐ์ ์์ด๋ฉด ๋ถ์์ด ์๋ง์ด ๋๊ฑฐ๋ .
๋ณดํต ํจํค์ง๋ช ์ .dev๋ .staging์ ๋ถ์ฌ์ ๊ตฌ๋ถํด.
๐ง 3๋จ๊ณ: SDK ์ค์น ๋ฐ ์ด๊ธฐํ
์ด์ ์ค์ ์ฝ๋ ์์
์ด ํ์ํด. ํ์ง๋ง ๊ฑฑ์ ๋ง, ๋ณต์กํ์ง ์์!
Android (Kotlin) ์์ :
// build.gradle (ํ๋ก์ ํธ ๋ ๋ฒจ)
buildscript {
dependencies {
classpath 'com.google.gms:google-services:4.3.15'
}
}
// build.gradle (์ฑ ๋ ๋ฒจ)
plugins {
id 'com.google.gms.google-services'
}
dependencies {
implementation platform('com.google.firebase:firebase-bom:32.7.0')
implementation 'com.google.firebase:firebase-analytics-ktx'
}
// MainActivity.kt
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.ktx.Firebase
class MainActivity : AppCompatActivity() {
private lateinit var firebaseAnalytics: FirebaseAnalytics
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Firebase Analytics ์ด๊ธฐํ
firebaseAnalytics = Firebase.analytics
// ์ด์ ์ฌ์ฉ ์ค๋น ์๋ฃ!
}
}
iOS (Swift) ์์ :
// Podfile
pod 'Firebase/Analytics'
// AppDelegate.swift
import Firebase
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Firebase ์ด๊ธฐํ
FirebaseApp.configure()
return true
}
}
// ์ด๋ ViewController์์๋ ์ฌ์ฉ ๊ฐ๋ฅ
import FirebaseAnalytics
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Analytics ์ฌ์ฉ ์ค๋น ์๋ฃ!
}
}
React Native ์์ :
// ์ค์น
npm install @react-native-firebase/app
npm install @react-native-firebase/analytics
// App.js
import analytics from '@react-native-firebase/analytics';
function App() {
useEffect(() => {
// ์ฑ ์์ ์ ์๋์ผ๋ก ์ด๊ธฐํ๋จ
console.log('Firebase Analytics ์ค๋น ์๋ฃ!');
}, []);
return (
// ์ฑ ์ปดํฌ๋ํธ
);
}
Flutter ์์ :
// pubspec.yaml
dependencies:
firebase_core: ^2.24.2
firebase_analytics: ^10.8.0
// main.dart
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
static FirebaseAnalytics analytics = FirebaseAnalytics.instance;
@override
Widget build(BuildContext context) {
return MaterialApp(
// ์ฑ ์ค์
);
}
}
๋ณด๋ค์ํผ ํ๋ซํผ๋ง๋ค ์กฐ๊ธ์ฉ ๋ค๋ฅด์ง๋ง, ๊ธฐ๋ณธ ๊ฐ๋
์ ๊ฐ์:
1. Firebase SDK ์ถ๊ฐ
2. ์ด๊ธฐํ ์ฝ๋ ์์ฑ
3. Analytics ์ธ์คํด์ค ์์ฑ
์ด ์ธ ๋จ๊ณ๋ง ๊ฑฐ์น๋ฉด ๊ธฐ๋ณธ ์ค์ ์ ๋! ๐
๐ ์ด๋ฒคํธ ๋ก๊น : ์ฌ์ฉ์ ํ๋ ์ถ์ ์ ํต์ฌ
์, ์ด์ ์ง์ง ์ฌ๋ฏธ์๋ ๋ถ๋ถ์ด์ผ! ๐ช
์ด๋ฒคํธ ๋ก๊น
์ "์ฌ์ฉ์๊ฐ ์ด๋ฐ ํ๋์ ํ์ด์!"๋ผ๊ณ Firebase์๊ฒ ์๋ ค์ฃผ๋ ๊ฑฐ์ผ.
Firebase Analytics์๋ ํฌ๊ฒ ๋ ๊ฐ์ง ์ข
๋ฅ์ ์ด๋ฒคํธ๊ฐ ์์ด:
1. ์๋ ์์ง ์ด๋ฒคํธ (Automatically Collected Events)
์ด๊ฑด ๋๊ฐ ์๋ฌด๊ฒ๋ ์ ํด๋ Firebase๊ฐ ์์์ ์์งํด์ฃผ๋ ์ด๋ฒคํธ๋ค์ด์ผ.
์ ๋ง ํธํ์ง? ๐
์ฃผ์ ์๋ ์์ง ์ด๋ฒคํธ๋ค:
- first_open: ์ฑ์ ์ฒ์ ์ค์นํ๊ณ ์คํํ์ ๋
- session_start: ์๋ก์ด ์ธ์
์ด ์์๋ ๋
- screen_view: ์๋ก์ด ํ๋ฉด์ ๋ณผ ๋
- app_update: ์ฑ์ด ์
๋ฐ์ดํธ๋์์ ๋
- app_remove: ์ฑ์ด ์ญ์ ๋์์ ๋ (Android๋ง)
- os_update: OS๊ฐ ์
๋ฐ์ดํธ๋์์ ๋
์ด๋ฐ ๊ธฐ๋ณธ ์ด๋ฒคํธ๋ค๋ง์ผ๋ก๋ ๊ฝค ๋ง์ ์ธ์ฌ์ดํธ๋ฅผ ์ป์ ์ ์์ด!
2. ์ปค์คํ
์ด๋ฒคํธ (Custom Events)
์ด๊ฑด ๋๊ฐ ์ง์ ์ ์ํ๊ณ ๋ก๊น
ํ๋ ์ด๋ฒคํธ์ผ.
์ฑ์ ํน์ฑ์ ๋ง๊ฒ ์ํ๋ ํ๋์ ์ถ์ ํ ์ ์์ง!
์๋ฅผ ๋ค์ด ์ผํ ์ฑ์ด๋ผ๋ฉด:
- ์ํ ์์ธ ํ์ด์ง ์กฐํ
- ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ
- ์์๋ฆฌ์คํธ ์ถ๊ฐ
- ๊ฒ์ ์คํ
- ํํฐ ์ ์ฉ
- ๋ฆฌ๋ทฐ ์์ฑ
์ด๋ฐ ๊ฒ๋ค์ ๋ชจ๋ ์ด๋ฒคํธ๋ก ๋ง๋ค ์ ์์ด!
๐จ ์ปค์คํ
์ด๋ฒคํธ ๋ก๊น
์ค์ ์์
์ด์ ์ค์ ์ฝ๋๋ก ์ด๋ป๊ฒ ์ด๋ฒคํธ๋ฅผ ๋ก๊น
ํ๋์ง ๋ณผ๊น?
Android (Kotlin) ์์ :
// ๊ธฐ๋ณธ ์ด๋ฒคํธ ๋ก๊น
firebaseAnalytics.logEvent("button_click") {
param("button_name", "login_button")
param("screen_name", "home_screen")
}
// ์ํ ์กฐํ ์ด๋ฒคํธ
firebaseAnalytics.logEvent("view_item") {
param("item_id", "SKU_12345")
param("item_name", "๋ฌด์ ์ด์ดํฐ")
param("item_category", "์ ์์ ํ")
param("price", 89000.0)
}
// ๊ตฌ๋งค ์๋ฃ ์ด๋ฒคํธ (์ถ์ฒ ์ด๋ฒคํธ)
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.PURCHASE) {
param(FirebaseAnalytics.Param.TRANSACTION_ID, "T_12345")
param(FirebaseAnalytics.Param.VALUE, 89000.0)
param(FirebaseAnalytics.Param.CURRENCY, "KRW")
param(FirebaseAnalytics.Param.ITEMS, bundleOf(
"item_id" to "SKU_12345",
"item_name" to "๋ฌด์ ์ด์ดํฐ",
"quantity" to 1
))
}
// ๊ฒ์ ์ด๋ฒคํธ
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SEARCH) {
param(FirebaseAnalytics.Param.SEARCH_TERM, "๋ธ๋ฃจํฌ์ค ์ด์ดํฐ")
}
// ๋ ๋ฒจ์
์ด๋ฒคํธ (๊ฒ์ ์ฑ)
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.LEVEL_UP) {
param(FirebaseAnalytics.Param.LEVEL, 5)
param(FirebaseAnalytics.Param.CHARACTER, "์ ์ฌ")
}
iOS (Swift) ์์ :
// ๊ธฐ๋ณธ ์ด๋ฒคํธ ๋ก๊น
Analytics.logEvent("button_click", parameters: [
"button_name": "login_button",
"screen_name": "home_screen"
])
// ์ํ ์กฐํ ์ด๋ฒคํธ
Analytics.logEvent("view_item", parameters: [
"item_id": "SKU_12345",
"item_name": "๋ฌด์ ์ด์ดํฐ",
"item_category": "์ ์์ ํ",
"price": 89000.0
])
// ๊ตฌ๋งค ์๋ฃ ์ด๋ฒคํธ
Analytics.logEvent(AnalyticsEventPurchase, parameters: [
AnalyticsParameterTransactionID: "T_12345",
AnalyticsParameterValue: 89000.0,
AnalyticsParameterCurrency: "KRW",
AnalyticsParameterItems: [
[
"item_id": "SKU_12345",
"item_name": "๋ฌด์ ์ด์ดํฐ",
"quantity": 1
]
]
])
// ๊ณต์ ์ด๋ฒคํธ
Analytics.logEvent(AnalyticsEventShare, parameters: [
AnalyticsParameterContentType: "product",
AnalyticsParameterItemID: "SKU_12345",
AnalyticsParameterMethod: "kakao"
])
React Native ์์ :
import analytics from '@react-native-firebase/analytics';
// ๊ธฐ๋ณธ ์ด๋ฒคํธ ๋ก๊น
await analytics().logEvent('button_click', {
button_name: 'login_button',
screen_name: 'home_screen',
});
// ์ํ ์กฐํ ์ด๋ฒคํธ
await analytics().logEvent('view_item', {
item_id: 'SKU_12345',
item_name: '๋ฌด์ ์ด์ดํฐ',
item_category: '์ ์์ ํ',
price: 89000,
});
// ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ
await analytics().logEvent('add_to_cart', {
item_id: 'SKU_12345',
item_name: '๋ฌด์ ์ด์ดํฐ',
quantity: 1,
price: 89000,
});
// ํ๋ฉด ์กฐํ ์ถ์
await analytics().logScreenView({
screen_name: 'ProductDetail',
screen_class: 'ProductDetailScreen',
});
Flutter ์์ :
import 'package:firebase_analytics/firebase_analytics.dart';
// ๊ธฐ๋ณธ ์ด๋ฒคํธ ๋ก๊น
await FirebaseAnalytics.instance.logEvent(
name: 'button_click',
parameters: {
'button_name': 'login_button',
'screen_name': 'home_screen',
},
);
// ์ํ ์กฐํ ์ด๋ฒคํธ
await FirebaseAnalytics.instance.logEvent(
name: 'view_item',
parameters: {
'item_id': 'SKU_12345',
'item_name': '๋ฌด์ ์ด์ดํฐ',
'item_category': '์ ์์ ํ',
'price': 89000.0,
},
);
// ๊ตฌ๋งค ์ด๋ฒคํธ
await FirebaseAnalytics.instance.logPurchase(
value: 89000.0,
currency: 'KRW',
parameters: {
'transaction_id': 'T_12345',
'items': [
{
'item_id': 'SKU_12345',
'item_name': '๋ฌด์ ์ด์ดํฐ',
'quantity': 1,
}
],
},
);
// ํ๋ฉด ์ถ์
await FirebaseAnalytics.instance.logScreenView(
screenName: 'ProductDetail',
screenClass: 'ProductDetailScreen',
);
โ ๏ธ ์ด๋ฒคํธ ๋ก๊น ์ ์ฃผ์์ฌํญ
1. ์ด๋ฒคํธ ์ด๋ฆ ๊ท์น
- ์ต๋ 40์๊น์ง ๊ฐ๋ฅ
- ์๋ฌธ์๋ก ์์ํด์ผ ํจ
- ์๋ฌธ์, ์ซ์, ์ธ๋์ค์ฝ์ด(_)๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- ๋์๋ฌธ์ ๊ตฌ๋ถ ์ ํจ (์๋์ผ๋ก ์๋ฌธ์๋ก ๋ณํ๋จ)
2. ํ๋ผ๋ฏธํฐ ์ ํ
- ์ด๋ฒคํธ๋น ์ต๋ 25๊ฐ์ ํ๋ผ๋ฏธํฐ
- ํ๋ผ๋ฏธํฐ ์ด๋ฆ๋ 40์ ์ ํ
- ํ๋ผ๋ฏธํฐ ๊ฐ์ 100์ ์ ํ
3. ๊ฐ์ธ์ ๋ณด ๋ณดํธ
- ์ด๋ฉ์ผ, ์ ํ๋ฒํธ, ์ฃผ๋ฏผ๋ฒํธ ๊ฐ์ ๊ฐ์ธ์๋ณ์ ๋ณด๋ ์ ๋ ๋ก๊น
ํ์ง ๋ง ๊ฒ!
- GDPR, CCPA ๊ฐ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฒ๊ท๋ฅผ ์ค์ํด์ผ ํด
4. ์ด๋ฒคํธ ์ ์ ํ
- ์ฑ๋น ์ต๋ 500๊ฐ์ ๊ณ ์ ์ด๋ฒคํธ ์ด๋ฆ
- ๊ทธ ์ด์์ ์๋์ผ๋ก ๋ฌด์๋จ
- ๋ฐ๋ผ์ ์ด๋ฒคํธ ์ค๊ณ๋ฅผ ์ ์คํ๊ฒ ํด์ผ ํด!
๐ฏ ์ถ์ฒ ์ด๋ฒคํธ (Recommended Events) ํ์ฉํ๊ธฐ
Firebase๋ ์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ์ด๋ฒคํธ๋ค์ "์ถ์ฒ ์ด๋ฒคํธ"๋ก ๋ฏธ๋ฆฌ ์ ์ํด๋จ์ด.
์ด๊ฑธ ์ฌ์ฉํ๋ฉด ์ข์ ์ ์ด ๋ญ๋๊ณ ?
1. ์๋ ๋ฆฌํฌํธ ์์ฑ: Firebase Console์์ ์๋์ผ๋ก ์์ ๋ฆฌํฌํธ๋ฅผ ๋ง๋ค์ด์ค
2. Google Ads ์ฐ๋: ๊ด๊ณ ์บ ํ์ธ ์ต์ ํ์ ๋ฐ๋ก ํ์ฉ ๊ฐ๋ฅ
3. ํ์คํ: ์
๊ณ ํ์ค์ ๋ฐ๋ฅด๋๊น ๋ค๋ฅธ ๋๊ตฌ์ ๋น๊ตํ๊ธฐ ์ฌ์
์ฃผ์ ์ถ์ฒ ์ด๋ฒคํธ๋ค์ ์นดํ
๊ณ ๋ฆฌ๋ณ๋ก ์ ๋ฆฌํด๋ณผ๊ฒ! ๐
๐ ์ด์ปค๋จธ์ค ๊ด๋ จ ์ถ์ฒ ์ด๋ฒคํธ
| ์ด๋ฒคํธ ์ด๋ฆ | ์ค๋ช | ์ฃผ์ ํ๋ผ๋ฏธํฐ |
|---|---|---|
| view_item | ์ํ ์์ธ ํ์ด์ง ์กฐํ | item_id, item_name, price |
| add_to_cart | ์ฅ๋ฐ๊ตฌ๋์ ์ํ ์ถ๊ฐ | item_id, quantity, value |
| remove_from_cart | ์ฅ๋ฐ๊ตฌ๋์์ ์ํ ์ ๊ฑฐ | item_id, quantity |
| begin_checkout | ๊ฒฐ์ ํ๋ก์ธ์ค ์์ | value, currency, items |
| add_payment_info | ๊ฒฐ์ ์ ๋ณด ์ ๋ ฅ | payment_type |
| purchase | ๊ตฌ๋งค ์๋ฃ | transaction_id, value, currency |
| refund | ํ๋ถ ์ฒ๋ฆฌ | transaction_id, value |
๐ฎ ๊ฒ์ ๊ด๋ จ ์ถ์ฒ ์ด๋ฒคํธ
| ์ด๋ฒคํธ ์ด๋ฆ | ์ค๋ช | ์ฃผ์ ํ๋ผ๋ฏธํฐ |
|---|---|---|
| level_start | ๋ ๋ฒจ ์์ | level_name |
| level_end | ๋ ๋ฒจ ์๋ฃ | level_name, success |
| level_up | ๋ ๋ฒจ์ | level, character |
| post_score | ์ ์ ๊ธฐ๋ก | score, level, character |
| unlock_achievement | ์ ์ ๋ฌ์ฑ | achievement_id |
| spend_virtual_currency | ๊ฐ์ ํํ ์ฌ์ฉ | value, virtual_currency_name |
| earn_virtual_currency | ๊ฐ์ ํํ ํ๋ | value, virtual_currency_name |
๐ฑ ์ผ๋ฐ ์ฑ ๊ด๋ จ ์ถ์ฒ ์ด๋ฒคํธ
| ์ด๋ฒคํธ ์ด๋ฆ | ์ค๋ช | ์ฃผ์ ํ๋ผ๋ฏธํฐ |
|---|---|---|
| login | ๋ก๊ทธ์ธ | method (google, facebook ๋ฑ) |
| sign_up | ํ์๊ฐ์ | method |
| search | ๊ฒ์ ์คํ | search_term |
| share | ์ฝํ ์ธ ๊ณต์ | content_type, item_id, method |
| tutorial_begin | ํํ ๋ฆฌ์ผ ์์ | - |
| tutorial_complete | ํํ ๋ฆฌ์ผ ์๋ฃ | - |
๐ก ์ถ์ฒ ์ด๋ฒคํธ ์ฌ์ฉ ์์
์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ผํ ์ฑ ์๋๋ฆฌ์ค๋ก ์๋ฅผ ๋ค์ด๋ณผ๊ฒ:
// ์ฌ์ฉ์๊ฐ ์ํ ๋ชฉ๋ก์์ ์ํ์ ํด๋ฆญํ์ ๋
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT) {
param(FirebaseAnalytics.Param.CONTENT_TYPE, "product")
param(FirebaseAnalytics.Param.ITEM_ID, "SKU_12345")
}
// ์ํ ์์ธ ํ์ด์ง ์ง์
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.VIEW_ITEM) {
param(FirebaseAnalytics.Param.ITEM_ID, "SKU_12345")
param(FirebaseAnalytics.Param.ITEM_NAME, "๋ฌด์ ์ด์ดํฐ")
param(FirebaseAnalytics.Param.ITEM_CATEGORY, "์ ์์ ํ")
param(FirebaseAnalytics.Param.PRICE, 89000.0)
}
// ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.ADD_TO_CART) {
param(FirebaseAnalytics.Param.ITEM_ID, "SKU_12345")
param(FirebaseAnalytics.Param.ITEM_NAME, "๋ฌด์ ์ด์ดํฐ")
param(FirebaseAnalytics.Param.QUANTITY, 1)
param(FirebaseAnalytics.Param.VALUE, 89000.0)
param(FirebaseAnalytics.Param.CURRENCY, "KRW")
}
// ๊ฒฐ์ ์์
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.BEGIN_CHECKOUT) {
param(FirebaseAnalytics.Param.VALUE, 89000.0)
param(FirebaseAnalytics.Param.CURRENCY, "KRW")
param(FirebaseAnalytics.Param.ITEMS, bundleOf(
"item_id" to "SKU_12345",
"item_name" to "๋ฌด์ ์ด์ดํฐ",
"quantity" to 1
))
}
// ๊ฒฐ์ ์ ๋ณด ์
๋ ฅ
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.ADD_PAYMENT_INFO) {
param(FirebaseAnalytics.Param.PAYMENT_TYPE, "credit_card")
}
// ๊ตฌ๋งค ์๋ฃ!
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.PURCHASE) {
param(FirebaseAnalytics.Param.TRANSACTION_ID, "T_${System.currentTimeMillis()}")
param(FirebaseAnalytics.Param.VALUE, 89000.0)
param(FirebaseAnalytics.Param.CURRENCY, "KRW")
param(FirebaseAnalytics.Param.TAX, 8900.0)
param(FirebaseAnalytics.Param.SHIPPING, 3000.0)
param(FirebaseAnalytics.Param.ITEMS, bundleOf(
"item_id" to "SKU_12345",
"item_name" to "๋ฌด์ ์ด์ดํฐ",
"quantity" to 1,
"price" to 89000.0
))
}
์ด๋ ๊ฒ ์ฌ์ฉ์์ ๊ตฌ๋งค ์ฌ์ (Customer Journey)์ ๋จ๊ณ๋ณ๋ก ์ถ์ ํ๋ฉด,
์ด๋ ๋จ๊ณ์์ ์ดํ์ด ๋ง์ด ๋ฐ์ํ๋์ง ์ ํํ ์ ์ ์์ด! ๐ฏ
๐ค ์ฌ์ฉ์ ์์ฑ (User Properties) ์ค์ ํ๊ธฐ
์ด๋ฒคํธ๊ฐ "์ฌ์ฉ์๊ฐ ๋ญ ํ๋์ง"๋ฅผ ์ถ์ ํ๋ค๋ฉด,
์ฌ์ฉ์ ์์ฑ์ "์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง"๋ฅผ ์ ์ํ๋ ๊ฑฐ์ผ.
์๋ฅผ ๋ค์ด:
- ๋์ด๋: 20๋, 30๋, 40๋...
- ์ฑ๋ณ: ๋จ์ฑ, ์ฌ์ฑ, ๊ธฐํ
- ๊ด์ฌ์ฌ: ํจ์
, ์ ์์ ํ, ์คํฌ์ธ ...
- ํ์ ๋ฑ๊ธ: ์ผ๋ฐ, VIP, VVIP
- ์ ํธ ์ธ์ด: ํ๊ตญ์ด, ์์ด, ์ผ๋ณธ์ด...
์ด๋ฐ ์์ฑ๋ค์ ์ค์ ํด๋๋ฉด, ๋์ค์ ๋ถ์ํ ๋ ์์ฒญ ์ ์ฉํด!
"30๋ ์ฌ์ฑ VIP ํ์๋ค์ ์ด๋ค ์ํ์ ๋ง์ด ๋ณด๋?" ๊ฐ์ ์ธ๊ทธ๋จผํธ ๋ถ์์ด ๊ฐ๋ฅํ๊ฑฐ๋ . ๐
๐ง ์ฌ์ฉ์ ์์ฑ ์ค์ ์์
// Android (Kotlin)
firebaseAnalytics.setUserProperty("age_group", "30s")
firebaseAnalytics.setUserProperty("gender", "female")
firebaseAnalytics.setUserProperty("membership_level", "vip")
firebaseAnalytics.setUserProperty("favorite_category", "fashion")
firebaseAnalytics.setUserProperty("preferred_language", "ko")
// iOS (Swift)
Analytics.setUserProperty("30s", forName: "age_group")
Analytics.setUserProperty("female", forName: "gender")
Analytics.setUserProperty("vip", forName: "membership_level")
// React Native
await analytics().setUserProperty('age_group', '30s');
await analytics().setUserProperty('gender', 'female');
await analytics().setUserProperty('membership_level', 'vip');
// Flutter
await FirebaseAnalytics.instance.setUserProperty(
name: 'age_group',
value: '30s',
);
await FirebaseAnalytics.instance.setUserProperty(
name: 'membership_level',
value: 'vip',
);
์ฌ์ฉ์ ID ์ค์ ํ๊ธฐ
๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ๊ฒฝ์ฐ, ๊ณ ์ ID๋ฅผ ์ค์ ํ ์๋ ์์ด.
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ์ ์ํด๋ ํ๋์ ์ฌ์ฉ์๋ก ์ถ์ ํ ์ ์์ง!
// Android (Kotlin)
firebaseAnalytics.setUserId("user_12345")
// iOS (Swift)
Analytics.setUserID("user_12345")
// React Native
await analytics().setUserId('user_12345');
// Flutter
await FirebaseAnalytics.instance.setUserId(id: 'user_12345');
- ์ฌ์ฉ์ ์์ฑ์ ์ต๋ 25๊ฐ๊น์ง๋ง ์ค์ ๊ฐ๋ฅํด
- ์์ฑ ์ด๋ฆ์ 24์, ๊ฐ์ 36์ ์ ํ
- ๊ฐ์ธ์๋ณ์ ๋ณด(PII)๋ ์ ๋ ์ฌ์ฉํ๋ฉด ์ ๋ผ!
- ์ฌ์ฉ์ ID๋ ์ด๋ฉ์ผ์ด๋ ์ ํ๋ฒํธ ๊ฐ์ ๊ฑด ์ฐ์ง ๋ง๊ณ , ๋ด๋ถ ๊ณ ์ ID๋ฅผ ์ฌ์ฉํด์ผ ํด
๐ Firebase Console์์ ๋ฐ์ดํฐ ๋ถ์ํ๊ธฐ
์, ์ด์ ์ด์ฌํ ์ด๋ฒคํธ๋ฅผ ๋ก๊น
ํ์ผ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด๋ณผ ์ฐจ๋ก์ผ! ๐
Firebase Console์ ์ ๋ง ์ง๊ด์ ์ด๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์.
๐ฅ ์ค์๊ฐ ๋์๋ณด๋ (DebugView)
๊ฐ๋ฐ ์ค์๋ DebugView๋ฅผ ์ฌ์ฉํ๋ฉด ์ง์ง ํธํด!
์ค์๊ฐ์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ฐํ๋ ๊ฑธ ๋ณผ ์ ์๊ฑฐ๋ .
DebugView ํ์ฑํ ๋ฐฉ๋ฒ:
Android:
// ํฐ๋ฏธ๋์์ ์คํ
adb shell setprop debug.firebase.analytics.app [ํจํค์ง๋ช
]
// ์์
adb shell setprop debug.firebase.analytics.app com.mycompany.myapp
// ๋นํ์ฑํ
adb shell setprop debug.firebase.analytics.app .none.
iOS:
// Xcode์์ Edit Scheme > Run > Arguments
// Arguments Passed On Launch์ ์ถ๊ฐ:
-FIRDebugEnabled
// ๋นํ์ฑํํ๋ ค๋ฉด:
-FIRDebugDisabled
์ด๋ ๊ฒ ์ค์ ํ๊ณ ์ฑ์ ์คํํ๋ฉด, Firebase Console์ DebugView ๋ฉ๋ด์์
์ค์๊ฐ์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ฐํ๋ ๊ฑธ ๋ณผ ์ ์์ด! ๋ง์น ๋ก๊ทธ๋ฅผ ๋ณด๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ. ๐
๐ ์ฃผ์ ๋ฆฌํฌํธ ๋ฉ๋ด ์ดํด๋ณด๊ธฐ
1. ์ด๋ฒคํธ (Events)
์ฌ๊ธฐ์๋ ๋ชจ๋ ์ด๋ฒคํธ์ ๋ฐ์ ํ์๋ฅผ ๋ณผ ์ ์์ด.
- ์ง๋ 30๋ถ, 24์๊ฐ, 7์ผ, 30์ผ ๋จ์๋ก ํํฐ๋ง ๊ฐ๋ฅ
- ๊ฐ ์ด๋ฒคํธ๋ฅผ ํด๋ฆญํ๋ฉด ์์ธ ์ ๋ณด ํ์ธ
- ํ๋ผ๋ฏธํฐ๋ณ ๋ถํฌ๋ ํ์ธ ๊ฐ๋ฅ
์๋ฅผ ๋ค์ด "add_to_cart" ์ด๋ฒคํธ๋ฅผ ํด๋ฆญํ๋ฉด:
- ์ด ๋ช ๋ฒ ๋ฐ์ํ๋์ง
- ์ด๋ค ์ํ์ด ๊ฐ์ฅ ๋ง์ด ๋ด๊ฒผ๋์ง
- ์๊ฐ๋๋ณ ์ถ์ด๋ ์ด๋ค์ง
์ด๋ฐ ์ ๋ณด๋ค์ ํ๋์ ๋ณผ ์ ์์ง! ๐
2. ์ ํ (Conversions)
ํน์ ์ด๋ฒคํธ๋ฅผ "์ ํ ์ด๋ฒคํธ"๋ก ํ์ํ ์ ์์ด.
์๋ฅผ ๋ค์ด "purchase", "sign_up" ๊ฐ์ ์ค์ํ ์ด๋ฒคํธ๋ค ๋ง์ด์ผ.
์ ํ ์ด๋ฒคํธ๋ก ํ์ํ๋ฉด:
- ๋์๋ณด๋ ์๋จ์ ๋ณ๋๋ก ํ์๋จ
- Google Ads์ ์๋ ์ฐ๋๋จ
- ์ ํ์จ ์ถ์ ์ด ์ฌ์์ง
3. ์ ์ฌ๊ณ ๊ฐ (Audiences)
์ด๊ฑด ์ง์ง ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด์ผ! ๐
ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ง๋ค ์ ์์ด.
์๋ฅผ ๋ค์ด:
- "์ง๋ 7์ผ๊ฐ 3๋ฒ ์ด์ ๊ตฌ๋งคํ ์ฌ์ฉ์"
- "์ฅ๋ฐ๊ตฌ๋์ ๋ด์์ง๋ง ๊ตฌ๋งคํ์ง ์์ ์ฌ์ฉ์"
- "ํํ ๋ฆฌ์ผ์ ์๋ฃํ์ง ์์ ์ ๊ท ์ฌ์ฉ์"
์ด๋ ๊ฒ ๋ง๋ ์ ์ฌ๊ณ ๊ฐ์:
- Firebase Cloud Messaging์ผ๋ก ํธ์ ์๋ฆผ ๋ฐ์ก
- Remote Config๋ก ๋ค๋ฅธ ์ค์ ์ ์ฉ
- Google Ads๋ก ๋ฆฌํ๊ฒํ
๊ด๊ณ
์ด๋ฐ ๊ฒ๋ค์ด ๊ฐ๋ฅํด์ ธ! ๐ฏ
4. ํผ๋ ๋ถ์ (Funnel Analysis)
์ฌ์ฉ์์ ์ฌ์ ์ ๋จ๊ณ๋ณ๋ก ์ถ์ ํ ์ ์์ด.
์๋ฅผ ๋ค์ด ์ผํ ์ฑ์ ๊ตฌ๋งค ํผ๋:
๐ ๊ตฌ๋งค ํผ๋ ์์
1๋จ๊ณ: ์ํ ์กฐํ (view_item) - 1,000๋ช
โ ์ ํ์จ 50%
2๋จ๊ณ: ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ (add_to_cart) - 500๋ช
โ ์ ํ์จ 60%
3๋จ๊ณ: ๊ฒฐ์ ์์ (begin_checkout) - 300๋ช
โ ์ ํ์จ 70%
4๋จ๊ณ: ๊ฒฐ์ ์ ๋ณด ์
๋ ฅ (add_payment_info) - 210๋ช
โ ์ ํ์จ 85%
5๋จ๊ณ: ๊ตฌ๋งค ์๋ฃ (purchase) - 178๋ช
์ต์ข
์ ํ์จ: 17.8%
์ด๋ ๊ฒ ๋ณด๋ฉด ์ด๋ ๋จ๊ณ์์ ์ดํ์ด ๋ง์์ง ํ๋์ ์ ์ ์์ง?
์ ์์์์๋ "์ํ ์กฐํ โ ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ" ๋จ๊ณ์์ 50%๊ฐ ์ดํํ๋ค!
์ฌ๊ธฐ๋ฅผ ๊ฐ์ ํ๋ฉด ์ ์ฒด ์ ํ์จ์ ํฌ๊ฒ ๋์ผ ์ ์์ ๊ฑฐ์ผ! ๐ก
5. ๊ฒฝ๋ก ๋ถ์ (Path Analysis)
์ฌ์ฉ์๋ค์ด ์ฑ ์์์ ์ด๋ค ๊ฒฝ๋ก๋ก ์ด๋ํ๋์ง ์๊ฐํํด์ค.
๋ง์น ์ง๋๋ฅผ ๋ณด๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ! ๐บ๏ธ
์๋ฅผ ๋ค์ด:
- ํ ํ๋ฉด โ ๊ฒ์ โ ์ํ ์์ธ โ ์ฅ๋ฐ๊ตฌ๋ โ ๊ฒฐ์
- ํ ํ๋ฉด โ ์นดํ
๊ณ ๋ฆฌ โ ์ํ ๋ชฉ๋ก โ ์ํ ์์ธ โ ๋ค๋ก๊ฐ๊ธฐ
์ด๋ฐ ํจํด๋ค์ ๋ถ์ํ๋ฉด:
- ์ฌ์ฉ์๋ค์ด ์ ํธํ๋ ๋์ ํ์
- ๋ถํ์ํ ๋จ๊ณ ์ ๊ฑฐ
- UI/UX ๊ฐ์ ํฌ์ธํธ ๋ฐ๊ฒฌ
์ด๋ฐ ๊ฒ ๊ฐ๋ฅํด์ ธ!
6. ์ฝํธํธ ๋ถ์ (Cohort Analysis)
๊ฐ์ ์๊ธฐ์ ์ฑ์ ์ค์นํ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ํ๋์ ์ถ์ ํ๋ ๊ฑฐ์ผ.
์๋ฅผ ๋ค์ด "1์์ ๊ฐ์
ํ ์ฌ์ฉ์๋ค"์ ๋ฆฌํ
์
(์ฌ๋ฐฉ๋ฌธ์จ)์ ๋ณผ ์ ์์ง.
์ด๊ฑธ๋ก ์ ์ ์๋ ๊ฒ๋ค:
- ์ ๊ท ์ฌ์ฉ์์ ์ ์ฐฉ๋ฅ
- ์
๋ฐ์ดํธ ์ ํ ๋น๊ต
- ๋ง์ผํ
์บ ํ์ธ ํจ๊ณผ
- ์์ฆ๋ณ ์ฌ์ฉ์ ํ๋ ์ฐจ์ด
๐ผ ์ค๋ฌด ํ: ๋ฐ์ดํฐ ๋ถ์ ๋ฃจํด ๋ง๋ค๊ธฐ
๋งค์ผ ์์นจ ์ถ๊ทผํ๋ฉด ์ด๋ฐ ๋ฃจํด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒดํฌํด๋ด:
1. ์ค์๊ฐ ๋์๋ณด๋ ํ์ธ (5๋ถ)
- ํ์ฌ ํ์ฑ ์ฌ์ฉ์ ์
- ์ค๋ ๋ฐ์ํ ์ฃผ์ ์ด๋ฒคํธ
- ์๋ฌ๋ ์ด์ ์งํ๋ ์๋์ง
2. ์ ์ผ ๋ฆฌํฌํธ ํ์ธ (10๋ถ)
- DAU (Daily Active Users)
- ์ฃผ์ ์ ํ ์ด๋ฒคํธ ๋ฐ์ ํ์
- ์ ์ผ ๋๋น ์ฆ๊ฐ๋ฅ
3. ์ฃผ๊ฐ ํธ๋ ๋ ๋ถ์ (๋งค์ฃผ ์์์ผ, 30๋ถ)
- ์ง๋์ฃผ ๋๋น ๋ณํ
- ํผ๋ ์ ํ์จ ๋ณํ
- ์ ๊ท ์ฌ์ฉ์ ์ ์
๊ฒฝ๋ก
4. ์๊ฐ ์ฌ์ธต ๋ถ์ (๋งค์ ์ด, 2์๊ฐ)
- ์ฝํธํธ ๋ถ์
- ์ฌ์ฉ์ ์ธ๊ทธ๋จผํธ๋ณ ํ๋ ํจํด
- ๊ฐ์ ๊ณผ์ ๋์ถ ๋ฐ ์ฐ์ ์์ ์ค์
์ด๋ฐ ๋ฃจํด์ ๋ง๋ค์ด๋๋ฉด ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ์ด ํจ์ฌ ์ฌ์์ ธ! ๐
๐จ ๊ณ ๊ธ ํ์ฉ: BigQuery ์ฐ๋ํ๊ธฐ
Firebase Console์ ๊ธฐ๋ณธ ๋ฆฌํฌํธ๋ก๋ ๋ถ์กฑํ๋ค๋ฉด?
BigQuery์ ์ฐ๋ํด์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ถ์ํ ์ ์์ด! ๐
BigQuery๋ ๊ตฌ๊ธ์ ํด๋ผ์ฐ๋ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค์ธ๋ฐ,
SQL ์ฟผ๋ฆฌ๋ก ์์ฒญ๋๊ฒ ํฐ ๋ฐ์ดํฐ๋ ๋น ๋ฅด๊ฒ ๋ถ์ํ ์ ์์ด.
๐ BigQuery ์ฐ๋ ๋ฐฉ๋ฒ
1. Firebase Console โ ํ๋ก์ ํธ ์ค์
2. ํตํฉ ํญ โ BigQuery
3. "BigQuery์ ์ฐ๊ฒฐ" ํด๋ฆญ
4. ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ์ต์
์ ํ
- ์ผ์ผ ๋ด๋ณด๋ด๊ธฐ: ๋งค์ผ ํ ๋ฒ ๋ฐ์ดํฐ ์ ์ก (๋ฌด๋ฃ)
- ์คํธ๋ฆฌ๋ฐ: ์ค์๊ฐ ๋ฐ์ดํฐ ์ ์ก (์ ๋ฃ)
5. ์ฐ๊ฒฐ ์๋ฃ!
์ฐ๋ํ๋ฉด Firebase ๋ฐ์ดํฐ๊ฐ ์๋์ผ๋ก BigQuery ํ
์ด๋ธ๋ก ๋ค์ด๊ฐ.
ํ
์ด๋ธ ๊ตฌ์กฐ๋ ์ด๋ ๊ฒ ์๊ฒผ์ด:
-- ํ
์ด๋ธ๋ช
: analytics_[ํ๋ก์ ํธID].events_[๋ ์ง]
-- ์์: analytics_12345.events_20240115
SELECT
event_name,
COUNT(*) as event_count,
COUNT(DISTINCT user_pseudo_id) as unique_users
FROM `analytics_12345.events_20240115`
WHERE event_name = 'purchase'
GROUP BY event_name;
๐ก ์ ์ฉํ BigQuery ์ฟผ๋ฆฌ ์์ ๋ค
1. ์ผ๋ณ ํ์ฑ ์ฌ์ฉ์ ์ (DAU)
SELECT
event_date,
COUNT(DISTINCT user_pseudo_id) as dau
FROM `analytics_12345.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20240101' AND '20240131'
GROUP BY event_date
ORDER BY event_date;
2. ์ํ๋ณ ๊ตฌ๋งค ํ์ ๋ฐ ๋งค์ถ
SELECT
(SELECT value.string_value FROM UNNEST(event_params)
WHERE key = 'item_name') as product_name,
COUNT(*) as purchase_count,
SUM((SELECT value.double_value FROM UNNEST(event_params)
WHERE key = 'value')) as total_revenue
FROM `analytics_12345.events_*`
WHERE event_name = 'purchase'
AND _TABLE_SUFFIX BETWEEN '20240101' AND '20240131'
GROUP BY product_name
ORDER BY total_revenue DESC
LIMIT 10;
3. ์ฌ์ฉ์๋ณ ์ธ์ ๊ธธ์ด ๋ถ์
WITH session_data AS (
SELECT
user_pseudo_id,
(SELECT value.int_value FROM UNNEST(event_params)
WHERE key = 'engagement_time_msec') / 1000 as session_duration_sec
FROM `analytics_12345.events_*`
WHERE event_name = 'user_engagement'
AND _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', CURRENT_DATE())
)
SELECT
CASE
WHEN session_duration_sec < 30 THEN '0-30์ด'
WHEN session_duration_sec < 60 THEN '30-60์ด'
WHEN session_duration_sec < 180 THEN '1-3๋ถ'
WHEN session_duration_sec < 300 THEN '3-5๋ถ'
ELSE '5๋ถ ์ด์'
END as duration_range,
COUNT(*) as user_count
FROM session_data
GROUP BY duration_range
ORDER BY
CASE duration_range
WHEN '0-30์ด' THEN 1
WHEN '30-60์ด' THEN 2
WHEN '1-3๋ถ' THEN 3
WHEN '3-5๋ถ' THEN 4
ELSE 5
END;
4. ํผ๋ ์ ํ์จ ๊ณ์ฐ
WITH funnel_events AS (
SELECT
user_pseudo_id,
MAX(CASE WHEN event_name = 'view_item' THEN 1 ELSE 0 END) as viewed,
MAX(CASE WHEN event_name = 'add_to_cart' THEN 1 ELSE 0 END) as added_cart,
MAX(CASE WHEN event_name = 'begin_checkout' THEN 1 ELSE 0 END) as started_checkout,
MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) as purchased
FROM `analytics_12345.events_*`
WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY user_pseudo_id
)
SELECT
SUM(viewed) as step1_view,
SUM(added_cart) as step2_cart,
SUM(started_checkout) as step3_checkout,
SUM(purchased) as step4_purchase,
ROUND(SUM(added_cart) / SUM(viewed) * 100, 2) as conversion_1_to_2,
ROUND(SUM(started_checkout) / SUM(added_cart) * 100, 2) as conversion_2_to_3,
ROUND(SUM(purchased) / SUM(started_checkout) * 100, 2) as conversion_3_to_4,
ROUND(SUM(purchased) / SUM(viewed) * 100, 2) as overall_conversion
FROM funnel_events;
BigQuery๋ฅผ ์ฌ์ฉํ๋ฉด Firebase Console์์๋ ๋ถ๊ฐ๋ฅํ
๋ณต์กํ ๋ถ์๋ ์์ ์์ ๋กญ๊ฒ ํ ์ ์์ด! ๐ช
- ์ผ์ผ ๋ด๋ณด๋ด๊ธฐ๋ ๋ฌด๋ฃ์ผ! (์คํธ๋ฆฌ๋ฐ๋ง ์ ๋ฃ)
- ์ฟผ๋ฆฌ ์คํ ์ ์ค์บ๋๋ ๋ฐ์ดํฐ์์ ๋ฐ๋ผ ๊ณผ๊ธ๋ผ
- WHERE ์ ๋ก ๋ ์ง ๋ฒ์๋ฅผ ์ ํํ๋ฉด ๋น์ฉ ์ ์ฝ
- ์์ฃผ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ๋ ๋ทฐ(View)๋ก ๋ง๋ค์ด๋๋ฉด ํธํด
- ๋งค์ 1TB๊น์ง๋ ๋ฌด๋ฃ ์ฟผ๋ฆฌ ํ ๋น๋์ด ์์ด!
๐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ์ ๋ฐ์ดํฐ ๋ณด์
๋ฐ์ดํฐ ๋ถ์๋ ์ค์ํ์ง๋ง, ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ ๋ ์ค์ํด! ๐ก๏ธ
ํนํ ์์ฆ์ GDPR, CCPA ๊ฐ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฒ๊ท๊ฐ ์๊ฒฉํ๊ฑฐ๋ .
โ๏ธ ์ค์ํด์ผ ํ ์ฃผ์ ์์น๋ค
1. ๊ฐ์ธ์๋ณ์ ๋ณด(PII) ์์ง ๊ธ์ง
์ ๋๋ก ์์งํ๋ฉด ์ ๋๋ ๊ฒ๋ค:
- ์ด๋ฉ์ผ ์ฃผ์
- ์ ํ๋ฒํธ
- ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ
- ์ ์ฉ์นด๋ ๋ฒํธ
- ์ค๋ช
- ์ ํํ ์์น ์ ๋ณด (GPS ์ขํ)
๋์ ์ด๋ ๊ฒ ํด:
- ์ฌ์ฉ์ ID๋ ๋ด๋ถ ๊ณ ์ ID ์ฌ์ฉ
- ์์น๋ ๋์ ์์ค์ผ๋ก๋ง (์: "์์ธ", "๋ถ์ฐ")
- ๋์ด๋ ๋ฒ์๋ก (์: "20-29์ธ")
2. ๋ฐ์ดํฐ ์์ง ๋์ ๋ฐ๊ธฐ
์ฑ ์ฒซ ์คํ ์ ์ฌ์ฉ์์๊ฒ ๋ช
ํํ๊ฒ ์๋ ค์ผ ํด:
// Android ์์
val dialog = AlertDialog.Builder(this)
.setTitle("๋ฐ์ดํฐ ์์ง ๋์")
.setMessage("""
์ฑ ๊ฐ์ ์ ์ํด ๋ค์ ์ ๋ณด๋ฅผ ์์งํฉ๋๋ค:
- ์ฑ ์ฌ์ฉ ํจํด
- ๊ธฐ๊ธฐ ์ ๋ณด (๋ชจ๋ธ, OS ๋ฒ์ )
- ๋๋ต์ ์ธ ์์น (๋์ ์์ค)
๊ฐ์ธ์๋ณ์ ๋ณด๋ ์์งํ์ง ์์ต๋๋ค.
๋์ํ์๊ฒ ์ต๋๊น?
""".trimIndent())
.setPositiveButton("๋์") { _, _ ->
// Analytics ํ์ฑํ
firebaseAnalytics.setAnalyticsCollectionEnabled(true)
}
.setNegativeButton("๊ฑฐ๋ถ") { _, _ ->
// Analytics ๋นํ์ฑํ
firebaseAnalytics.setAnalyticsCollectionEnabled(false)
}
.show()
3. ๋ฐ์ดํฐ ์์ง ๋นํ์ฑํ ์ต์
์ ๊ณต
์ฌ์ฉ์๊ฐ ์ธ์ ๋ ๋ฐ์ดํฐ ์์ง์ ๊ฑฐ๋ถํ ์ ์์ด์ผ ํด:
// ์ค์ ํ๋ฉด์์
fun disableAnalytics() {
firebaseAnalytics.setAnalyticsCollectionEnabled(false)
// ์ฌ์ฉ์ ์์ฑ๋ ์ด๊ธฐํ
firebaseAnalytics.resetAnalyticsData()
}
// iOS
Analytics.setAnalyticsCollectionEnabled(false)
Analytics.resetAnalyticsData()
// React Native
await analytics().setAnalyticsCollectionEnabled(false);
// Flutter
await FirebaseAnalytics.instance.setAnalyticsCollectionEnabled(false);
4. ๋ฐ์ดํฐ ๋ณด๊ด ๊ธฐ๊ฐ ์ค์
Firebase Console์์ ๋ฐ์ดํฐ ๋ณด๊ด ๊ธฐ๊ฐ์ ์ค์ ํ ์ ์์ด:
- ํ๋ก์ ํธ ์ค์ โ ๋ฐ์ดํฐ ์ค์
- ์ฌ์ฉ์ ๋ฐ์ดํฐ ๋ณด๊ด: 2๊ฐ์ ๋๋ 14๊ฐ์ ์ ํ
- ์ด๋ฒคํธ ๋ฐ์ดํฐ ๋ณด๊ด: 2๊ฐ์ ๋๋ 14๊ฐ์ ์ ํ
๋ฒ์ ์ผ๋ก ํ์ํ ๊ธฐ๊ฐ๋ง ๋ณด๊ดํ๋ ๊ฒ ์ข์!
5. ์ด๋ฆฐ์ด ๋์ ์ฑ์ ํน๋ณ ๊ท์
13์ธ ๋ฏธ๋ง ์ด๋ฆฐ์ด ๋์ ์ฑ์ด๋ผ๋ฉด:
- COPPA (๋ฏธ๊ตญ ์๋ ์จ๋ผ์ธ ๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ฒ) ์ค์
- ๋ง์ถค ๊ด๊ณ ๋นํ์ฑํ
- ๋ฆฌ๋ง์ผํ
๋นํ์ฑํ
- ํน์ Analytics ๊ธฐ๋ฅ ์ ํ
// ์ด๋ฆฐ์ด ๋์ ์ฑ ์ค์
firebaseAnalytics.setUserProperty("allow_personalized_ads", "false")
// iOS
Analytics.setUserProperty("false", forName: "allow_personalized_ads")
๐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ์ฒดํฌ๋ฆฌ์คํธ
โ
๊ฐ์ธ์๋ณ์ ๋ณด(PII)๋ฅผ ์ด๋ฒคํธ๋ ์ฌ์ฉ์ ์์ฑ์ ํฌํจํ์ง ์์๋๊ฐ?
โ
๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ๋ฐฉ์นจ์ ๋ฐ์ดํฐ ์์ง ๋ด์ฉ์ ๋ช
์ํ๋๊ฐ?
โ
์ฌ์ฉ์์๊ฒ ๋ฐ์ดํฐ ์์ง ๋์๋ฅผ ๋ฐ์๋๊ฐ?
โ
๋ฐ์ดํฐ ์์ง ๊ฑฐ๋ถ ์ต์
์ ์ ๊ณตํ๋๊ฐ?
โ
์ ์ ํ ๋ฐ์ดํฐ ๋ณด๊ด ๊ธฐ๊ฐ์ ์ค์ ํ๋๊ฐ?
โ
์ด๋ฆฐ์ด ๋์ ์ฑ์ด๋ผ๋ฉด COPPA๋ฅผ ์ค์ํ๋๊ฐ?
โ
GDPR ์ ์ฉ ๋์์ด๋ผ๋ฉด ๋ฐ์ดํฐ ์ญ์ ์์ฒญ ํ๋ก์ธ์ค๊ฐ ์๋๊ฐ?
โ
๋ฐ์ดํฐ ์ ์ถ ์ ๋์ ๊ณํ์ด ์๋ฆฝ๋์ด ์๋๊ฐ?
๐ ์ค์ ํ์ฉ ์ฌ๋ก: ์ฑ ๊ฐ์ ํ๋ก์ ํธ
์ด๋ก ์ ์ถฉ๋ถํ ๋ฐฐ์ ์ผ๋, ์ด์ ์ค์ ๋ก ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์ฌ๋ก๋ฅผ ๋ณผ๊น?
๊ฐ์์ ์์ ๋ฐฐ๋ฌ ์ฑ "๋ง์๋ค"๋ฅผ ์๋ก ๋ค์ด๋ณผ๊ฒ! ๐
๐ฑ ์ฌ๋ก: "๋ง์๋ค" ์ฑ์ ์ฃผ๋ฌธ ์๋ฃ์จ ๊ฐ์ ํ๋ก์ ํธ
๋ฌธ์ ์ํฉ:
- ์ฑ ๋ค์ด๋ก๋๋ ๋ง์๋ฐ ์ค์ ์ฃผ๋ฌธ์ ์ ์
- ์ฃผ๋ฌธ ์๋ฃ์จ์ด ์
๊ณ ํ๊ท ๋ณด๋ค ๋ฎ์
- ์ด๋๊ฐ ๋ฌธ์ ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ ๐ฐ
1๋จ๊ณ: ํํฉ ํ์
๋จผ์ Firebase Analytics๋ก ํผ๋์ ๋ถ์ํ์ด:
๐ ์ด๊ธฐ ํผ๋ ๋ถ์ ๊ฒฐ๊ณผ
1. ์ฑ ์คํ: 10,000๋ช
(100%)
2. ์์์ ๊ฒ์: 7,000๋ช
(70%) โ
์ํธ
3. ๋ฉ๋ด ์ ํ: 4,500๋ช
(64%) โ ๏ธ ์ฒซ ๋ฒ์งธ ์ดํ ์ง์
4. ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ: 2,800๋ช
(62%) โ ๏ธ ๋ ๋ฒ์งธ ์ดํ ์ง์
5. ์ฃผ๋ฌธํ๊ธฐ ํด๋ฆญ: 1,900๋ช
(68%) โ ๏ธ ์ธ ๋ฒ์งธ ์ดํ ์ง์
6. ๊ฒฐ์ ์ ๋ณด ์
๋ ฅ: 1,200๋ช
(63%) โ ์ต๋ ์ดํ ์ง์ !
7. ์ฃผ๋ฌธ ์๋ฃ: 950๋ช
(79%) โ
์ํธ
์ต์ข
์ ํ์จ: 9.5% (์
๊ณ ํ๊ท 15%)
๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ "์ฃผ๋ฌธํ๊ธฐ โ ๊ฒฐ์ ์ ๋ณด ์
๋ ฅ" ๋จ๊ณ์์
37%๋ ์ดํํ๋ค๋ ๊ฑฐ์์ด! ๐จ
2๋จ๊ณ: ์์ธ ๋ถ์
ํด๋น ๋จ๊ณ์์ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์์ธํ ์ถ์ ํ์ด:
// ์ฃผ๋ฌธํ๊ธฐ ๋ฒํผ ํด๋ฆญ ์
firebaseAnalytics.logEvent("order_button_click") {
param("cart_value", cartTotal)
param("item_count", itemCount)
param("restaurant_id", restaurantId)
}
// ๊ฒฐ์ ํ๋ฉด ์ง์
์
firebaseAnalytics.logEvent("payment_screen_view") {
param("load_time_ms", loadTime)
}
// ๊ฒฐ์ ์ ๋ณด ์
๋ ฅ ์์
firebaseAnalytics.logEvent("payment_info_start") {
param("payment_method", paymentMethod)
}
// ๊ฒฐ์ ํ๋ฉด ์ดํ ์
firebaseAnalytics.logEvent("payment_screen_exit") {
param("time_spent_sec", timeSpent)
param("info_completed", isCompleted)
}
๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ ๊ฒฐ๊ณผ:
- ๊ฒฐ์ ํ๋ฉด ๋ก๋ฉ ์๊ฐ์ด ํ๊ท 4.2์ด (๋๋ฌด ๋๋ฆผ!)
- ์ฌ์ฉ์์ 68%๊ฐ 30์ด ์ด๋ด์ ์ดํ
- ์นด๋ ์ ๋ณด ์
๋ ฅ ํผ์ด ๋ณต์กํจ (15๊ฐ ํ๋)
- ๋ชจ๋ฐ์ผ ํค๋ณด๋ ๋๋ฌธ์ ํ๋ฉด์ด ๊ฐ๋ ค์ง
3๋จ๊ณ: ๊ฐ์ ์คํ
๋ฌธ์ ๋ฅผ ํ์
ํ์ผ๋ ์ด์ ๊ฐ์ ํ ์ฐจ๋ก!
๊ฐ์ 1 ๊ฒฐ์ ํ๋ฉด ๋ก๋ฉ ์ต์ ํ
- ์ด๋ฏธ์ง ์์ถ ๋ฐ lazy loading
- ๋ถํ์ํ API ํธ์ถ ์ ๊ฑฐ
- ๋ก๋ฉ ์๊ฐ 4.2์ด โ 1.8์ด๋ก ๋จ์ถ โก
๊ฐ์ 2 ๊ฐํธ ๊ฒฐ์ ์ต์
์ถ๊ฐ
- ์นด์นด์คํ์ด, ๋ค์ด๋ฒํ์ด, ํ ์ค ์ฐ๋
- ์ํด๋ฆญ ๊ฒฐ์ ๊ฐ๋ฅ
- ์นด๋ ์ ๋ณด ์
๋ ฅ ํ๋ 15๊ฐ โ 3๊ฐ๋ก ์ถ์
๊ฐ์ 3 UI/UX ๊ฐ์
- ํค๋ณด๋ ์ฌ๋ผ์ฌ ๋ ํ๋ฉด ์๋ ์คํฌ๋กค
- ์
๋ ฅ ํ๋ ํฌ๊ธฐ ํ๋
- ์ค์๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ ์ถ๊ฐ
4๋จ๊ณ: A/B ํ
์คํ
๊ฐ์ ๋ ๋ฒ์ ์ ๋ฐ๋ก ์ ์ฒด ๋ฐฐํฌํ์ง ์๊ณ ,
Firebase Remote Config์ A/B Testing์ ํ์ฉํ์ด:
// Remote Config๋ก ๊ธฐ๋ฅ ํ๋๊ทธ ์ค์
val remoteConfig = Firebase.remoteConfig
remoteConfig.fetchAndActivate().addOnCompleteListener {
val useNewPaymentFlow = remoteConfig.getBoolean("new_payment_flow")
if (useNewPaymentFlow) {
// ์๋ก์ด ๊ฒฐ์ ํ๋ฉด
showNewPaymentScreen()
} else {
// ๊ธฐ์กด ๊ฒฐ์ ํ๋ฉด
showOldPaymentScreen()
}
}
์ฌ์ฉ์์ 50%์๊ฒ๋ง ์ ๋ฒ์ ์ ๋ณด์ฌ์ฃผ๊ณ ,
๋๋จธ์ง 50%๋ ๊ธฐ์กด ๋ฒ์ ์ ์ ์งํ์ด.
2์ฃผ๊ฐ ํ
์คํธํ ๊ฒฐ๊ณผ:
๐ A/B ํ ์คํธ ๊ฒฐ๊ณผ
๊ธฐ์กด ๋ฒ์ (Control Group)
- ๊ฒฐ์ ํ๋ฉด ์ง์
โ ์๋ฃ: 63%
- ํ๊ท ์์ ์๊ฐ: 2๋ถ 15์ด
- ์ดํ๋ฅ : 37%
๊ฐ์ ๋ฒ์ (Test Group)
- ๊ฒฐ์ ํ๋ฉด ์ง์
โ ์๋ฃ: 84% ๐
- ํ๊ท ์์ ์๊ฐ: 45์ด โก
- ์ดํ๋ฅ : 16% โจ
์ ํ์จ 33% ํฅ์!
ํต๊ณ์ ์ผ๋ก ์ ์๋ฏธํ ๊ฒฐ๊ณผ (p-value < 0.01)
5๋จ๊ณ: ์ ์ฒด ๋ฐฐํฌ ๋ฐ ๋ชจ๋ํฐ๋ง
A/B ํ
์คํธ ๊ฒฐ๊ณผ๊ฐ ์ข์ผ๋๊น ์ ์ฒด ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌ!
๊ทธ๋ฆฌ๊ณ ๊ณ์ ๋ชจ๋ํฐ๋งํ๋ฉด์ ์ถ๊ฐ ๊ฐ์ ์ ์ ์ฐพ์์ด.
// ๊ฐ์ ํ ์ถ๊ฐ ์ด๋ฒคํธ ๋ก๊น
firebaseAnalytics.logEvent("simple_payment_used") {
param("payment_provider", provider) // kakao, naver, toss
param("completion_time_sec", completionTime)
}
firebaseAnalytics.logEvent("payment_error") {
param("error_type", errorType)
param("error_message", errorMessage)
param("payment_provider", provider)
}
์ต์ข
๊ฒฐ๊ณผ:
ํ๋ก์ ํธ ์์ 3๊ฐ์ ํ:
- ์ ์ฒด ์ฃผ๋ฌธ ์๋ฃ์จ: 9.5% โ 14.2% (49% ์ฆ๊ฐ!)
- ์ ์ฃผ๋ฌธ ๊ฑด์: 28,500๊ฑด โ 42,300๊ฑด
- ์ฌ์ฉ์ ๋ง์กฑ๋: 3.2์ โ 4.1์ (5์ ๋ง์ )
- ์ฑ ๋ฆฌ๋ทฐ ํ์ : 3.8์ โ 4.5์
๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ ํํ ํ์
ํ๊ณ ๊ฐ์ ํ ๊ฒฐ๊ณผ,
๋น์ฆ๋์ค ์ฑ๊ณผ๋ ํฌ๊ฒ ํฅ์๋์ด! ๐
๐ก ์ด ์ฌ๋ก์์ ๋ฐฐ์ธ ์
1. ์ถ์ธกํ์ง ๋ง๊ณ ์ธก์ ํ๋ผ
"์ด๊ฒ ๋ฌธ์ ์ผ ๊ฒ ๊ฐ์"๊ฐ ์๋๋ผ ๋ฐ์ดํฐ๋ก ํ์ธํด์ผ ํด
2. ํผ๋ ๋ถ์์ผ๋ก ๋ณ๋ชฉ ์ง์ ์ฐพ๊ธฐ
์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ๋จ๊ณ๋ณ๋ก ๋๋ ์ ์ด๋๊ฐ ๋ฌธ์ ์ธ์ง ํ์
3. ์์ธ ์ด๋ฒคํธ ๋ก๊น
์ผ๋ก ์์ธ ๋ถ์
๋จ์ํ "์ดํํ๋ค"๊ฐ ์๋๋ผ "์ ์ดํํ๋์ง" ์์์ผ ํด
4. A/B ํ
์คํ
์ผ๋ก ๊ฒ์ฆ
๊ฐ์ ์์ด ์ ๋ง ํจ๊ณผ๊ฐ ์๋์ง ์คํ์ผ๋ก ์ฆ๋ช
5. ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง
ํ ๋ฒ ๊ฐ์ ํ๊ณ ๋์ด ์๋๋ผ ๊ณ์ ๊ด์ฐฐํ๊ณ ๊ฐ์
๐ ๏ธ ์ค๋ฌด์์ ์์ฃผ ํ๋ ์ค์์ ํด๊ฒฐ๋ฒ
Firebase Analytics๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ฉด ๋๊ตฌ๋ ์ค์๋ฅผ ํด.
๋๋ ์ฒ์์ ๋ง์ด ํค๋งธ๊ฑฐ๋ ! ๐
์์ฃผ ํ๋ ์ค์๋ค๊ณผ ํด๊ฒฐ๋ฒ์ ์ ๋ฆฌํด๋ดค์ด.
โ ์ค์ 1: ๋๋ฌด ๋ง์ ์ด๋ฒคํธ ๋ก๊น
๋ฌธ์ :
๋ชจ๋ ๋ฒํผ ํด๋ฆญ, ๋ชจ๋ ํ๋ฉด ์ ํ์ ๋ค ๋ก๊น
ํ๋ ค๊ณ ํด.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋ฒคํธ๊ฐ 500๊ฐ๋ฅผ ๋์ด์ ์ผ๋ถ๊ฐ ๋ฌด์๋จ.
ํด๊ฒฐ:
- ๋น์ฆ๋์ค ๋ชฉํ์ ๊ด๋ จ๋ ์ค์ํ ์ด๋ฒคํธ๋ง ๋ก๊น
- ๋น์ทํ ์ด๋ฒคํธ๋ ํ๋๋ก ํตํฉํ๊ณ ํ๋ผ๋ฏธํฐ๋ก ๊ตฌ๋ถ
- ์: "button_click_login", "button_click_signup" โ "button_click" (type: "login")
โ ์ค์ 2: ๊ฐ๋ฐ/ํ
์คํธ ๋ฐ์ดํฐ ํผ์
๋ฌธ์ :
๊ฐ๋ฐ์๋ค์ ํ
์คํธ ๋ฐ์ดํฐ๊ฐ ์ค์ ์ฌ์ฉ์ ๋ฐ์ดํฐ์ ์์.
๋ถ์ ๊ฒฐ๊ณผ๊ฐ ์๊ณก๋จ.
ํด๊ฒฐ:
- ๊ฐ๋ฐ์ฉ Firebase ํ๋ก์ ํธ ๋ณ๋ ์์ฑ
- ํ๋ก๋์
๋น๋์์๋ง Analytics ํ์ฑํ
- ๋ด๋ถ ํ
์คํฐ IP ํํฐ๋ง
// ๋๋ฒ๊ทธ ๋น๋์์๋ Analytics ๋นํ์ฑํ
if (BuildConfig.DEBUG) {
firebaseAnalytics.setAnalyticsCollectionEnabled(false)
}
// ๋๋ ์ฌ์ฉ์ ์์ฑ์ผ๋ก ๊ตฌ๋ถ
if (isInternalTester) {
firebaseAnalytics.setUserProperty("user_type", "internal_tester")
}
โ ์ค์ 3: ์ด๋ฒคํธ ์ด๋ฆ ์ผ๊ด์ฑ ๋ถ์กฑ
๋ฌธ์ :
- "userLogin", "user_login", "UserLogin" ๋ฑ ์ ๊ฐ๊ฐ
- ๋์ค์ ๋ถ์ํ ๋ ํท๊ฐ๋ฆผ
ํด๊ฒฐ:
- ์ด๋ฒคํธ ์ด๋ฆ ๊ท์น ๋ฌธ์ํ
- ์์๋ก ์ ์ํด์ ์ฌ์ฉ
// ์ด๋ฒคํธ ์ด๋ฆ ์์ ์ ์
object AnalyticsEvents {
const val USER_LOGIN = "user_login"
const val USER_SIGNUP = "user_signup"
const val PRODUCT_VIEW = "product_view"
const val PRODUCT_PURCHASE = "product_purchase"
const val CART_ADD = "cart_add"
const val CART_REMOVE = "cart_remove"
}
object AnalyticsParams {
const val ITEM_ID = "item_id"
const val ITEM_NAME = "item_name"
const val ITEM_CATEGORY = "item_category"
const val VALUE = "value"
const val CURRENCY = "currency"
}
// ์ฌ์ฉ
firebaseAnalytics.logEvent(AnalyticsEvents.PRODUCT_VIEW) {
param(AnalyticsParams.ITEM_ID, productId)
param(AnalyticsParams.ITEM_NAME, productName)
}
โ ์ค์ 4: ํ๋ผ๋ฏธํฐ ๊ฐ ํ์
๋ถ์ผ์น
๋ฌธ์ :
๊ฐ์ ํ๋ผ๋ฏธํฐ์ธ๋ฐ ์ด๋จ ๋๋ ๋ฌธ์์ด, ์ด๋จ ๋๋ ์ซ์๋ก ์ ์ก.
BigQuery์์ ๋ถ์ํ ๋ ํ์
์๋ฌ ๋ฐ์.
ํด๊ฒฐ:
- ํ๋ผ๋ฏธํฐ ํ์
์ ๋ช
ํํ ์ ์
- ํฌํผ ํจ์ ์ฌ์ฉ
// ํฌํผ ํจ์ ์ ์
fun logProductView(productId: String, productName: String, price: Double) {
firebaseAnalytics.logEvent(AnalyticsEvents.PRODUCT_VIEW) {
param(AnalyticsParams.ITEM_ID, productId)
param(AnalyticsParams.ITEM_NAME, productName)
param(AnalyticsParams.VALUE, price) // ํญ์ Double
param(AnalyticsParams.CURRENCY, "KRW") // ํญ์ String
}
}
// ์ฌ์ฉ
logProductView("SKU_123", "๋ฌด์ ์ด์ดํฐ", 89000.0)
โ ์ค์ 5: ๋คํธ์ํฌ ์ํ ๋ฏธ๊ณ ๋ ค
๋ฌธ์ :
์คํ๋ผ์ธ ์ํ์์ ๋ฐ์ํ ์ด๋ฒคํธ๊ฐ ์์ค๋จ.
ํด๊ฒฐ:
Firebase Analytics๋ ์๋์ผ๋ก ์คํ๋ผ์ธ ์ด๋ฒคํธ๋ฅผ ํ์ ์ ์ฅํ๊ณ
์จ๋ผ์ธ ์ํ๊ฐ ๋๋ฉด ์ ์กํด์ค. ํ์ง๋ง ์ฑ์ด ๊ฐ์ ์ข
๋ฃ๋๋ฉด ์์ค๋ ์ ์์ผ๋
์ค์ํ ์ด๋ฒคํธ๋ ๋ก์ปฌ DB์๋ ์ ์ฅํ๋ ๊ฒ ์ข์.
โ ์ค์ 6: ํ๋ฉด ์ถ์ ๋๋ฝ
๋ฌธ์ :
์ผ๋ถ ํ๋ฉด์์๋ง screen_view ์ด๋ฒคํธ๋ฅผ ๋ก๊น
ํด์
์ฌ์ฉ์ ํ๋ฆ ๋ถ์์ด ๋ถ์์ ํจ.
ํด๊ฒฐ:
- Base Activity/Fragment์์ ์๋์ผ๋ก ๋ก๊น
// Android
abstract class BaseActivity : AppCompatActivity() {
protected lateinit var firebaseAnalytics: FirebaseAnalytics
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
firebaseAnalytics = Firebase.analytics
// ํ๋ฉด ์ด๋ฆ ์๋ ๋ก๊น
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) {
param(FirebaseAnalytics.Param.SCREEN_NAME, this::class.simpleName ?: "Unknown")
param(FirebaseAnalytics.Param.SCREEN_CLASS, this::class.java.name)
}
}
}
// iOS
class BaseViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
Analytics.logEvent(AnalyticsEventScreenView, parameters: [
AnalyticsParameterScreenName: String(describing: type(of: self)),
AnalyticsParameterScreenClass: String(describing: type(of: self))
])
}
}
โ Firebase Analytics ๋ฒ ์คํธ ํ๋ํฐ์ค ์ฒดํฌ๋ฆฌ์คํธ
์ค๊ณ ๋จ๊ณ
โ๏ธ ๋น์ฆ๋์ค ๋ชฉํ๋ฅผ ๋ช
ํํ ์ ์ํ๋๊ฐ?
โ๏ธ ์ถ์ ํ ํต์ฌ ์งํ(KPI)๋ฅผ ์ ์ ํ๋๊ฐ?
โ๏ธ ์ด๋ฒคํธ ๋ค์ด๋ฐ ๊ท์น์ ๋ฌธ์ํํ๋๊ฐ?
โ๏ธ ๊ฐ๋ฐ/์คํ
์ด์ง/ํ๋ก๋์
ํ๊ฒฝ์ ๋ถ๋ฆฌํ๋๊ฐ?
๊ตฌํ ๋จ๊ณ
โ๏ธ ์ถ์ฒ ์ด๋ฒคํธ๋ฅผ ์ต๋ํ ํ์ฉํ๋๊ฐ?
โ๏ธ ์ด๋ฒคํธ ์ด๋ฆ๊ณผ ํ๋ผ๋ฏธํฐ๋ฅผ ์์๋ก ์ ์ํ๋๊ฐ?
โ๏ธ ๊ฐ์ธ์๋ณ์ ๋ณด(PII)๋ฅผ ํฌํจํ์ง ์์๋๊ฐ?
โ๏ธ ๋ชจ๋ ์ฃผ์ ํ๋ฉด์์ screen_view๋ฅผ ๋ก๊น
ํ๋๊ฐ?
โ๏ธ ์ค์ํ ์ฌ์ฉ์ ์์ฑ์ ์ค์ ํ๋๊ฐ?
์ด์ ๋จ๊ณ
โ๏ธ ์ ๊ธฐ์ ์ผ๋ก ๋์๋ณด๋๋ฅผ ํ์ธํ๋๊ฐ?
โ๏ธ ์ด์ ์งํ ๋ฐ๊ฒฌ ์ ์๋ฆผ์ ๋ฐ๋๊ฐ?
โ๏ธ ๋ฐ์ดํฐ ๋ณด๊ด ๊ธฐ๊ฐ์ ์ ์ ํ ์ค์ ํ๋๊ฐ?
โ๏ธ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ์ ์ฑ
์ ์ค์ํ๋๊ฐ?
โ๏ธ ์ฌ์ฉ์์๊ฒ ๋ฐ์ดํฐ ์์ง ๋์๋ฅผ ๋ฐ์๋๊ฐ?
๐ ๋ ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด?
Firebase Analytics๋ ์ ๋ง ๋ฐฉ๋ํ ์ฃผ์ ์ผ.
์ด ๊ธ์์ ๋ค๋ฃฌ ๋ด์ฉ์ ๊ธฐ์ด๋ถํฐ ์ค๊ธ๊น์ง์ธ๋ฐ,
๋ ๊น์ด ์๊ฒ ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด ์ด๋ฐ ๊ฒ๋ค์ ๊ณต๋ถํด๋ด! ๐
๐ ๋ค์ ๋จ๊ณ ํ์ต ์ฃผ์ ๋ค
1. Google Analytics 4 (GA4) ์ฐ๋
Firebase Analytics๋ ์ฌ์ค GA4์ ๋ชจ๋ฐ์ผ ๋ฒ์ ์ด์ผ.
์น๊ณผ ์ฑ ๋ฐ์ดํฐ๋ฅผ ํตํฉํด์ ๋ถ์ํ ์ ์์ด.
2. Crashlytics์ ์ฐ๋
์ฑ ํฌ๋์ ๋ฐ์ ์ ์ด๋ค ์ด๋ฒคํธ ํ๋ฆ์์ ๋ฐ์ํ๋์ง ์ถ์ .
๋ฒ๊ทธ ์์ ์ฐ์ ์์ ๊ฒฐ์ ์ ๋์์ด ๋ผ.
3. Performance Monitoring
์ฑ ์ฑ๋ฅ ์งํ(๋ก๋ฉ ์๊ฐ, API ์๋ต ์๊ฐ ๋ฑ)๋ฅผ Analytics์ ํจ๊ป ๋ถ์.
4. Predictions (์์ธก)
๋จธ์ ๋ฌ๋์ผ๋ก ์ฌ์ฉ์ ํ๋ ์์ธก.
"์ด ์ฌ์ฉ์๊ฐ 7์ผ ๋ด์ ๊ตฌ๋งคํ ํ๋ฅ ์ 85%"
์ด๋ฐ ๊ฑธ ์๋์ผ๋ก ๊ณ์ฐํด์ค!
5. Cloud Functions ์ฐ๋
ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ์๋ฒ ๋ก์ง ์๋ ์คํ.
์: ๊ณ ์ก ๊ตฌ๋งค ์ ์๋์ผ๋ก VIP ๋ฑ๊ธ ์
๊ทธ๋ ์ด๋
6. Data Studio ๋ฆฌํฌํ
BigQuery ๋ฐ์ดํฐ๋ฅผ Google Data Studio๋ก ์๊ฐํ.
๊ฒฝ์์ง์๊ฒ ๋ณด๊ณ ํ ๋ฉ์ง ๋์๋ณด๋ ์ ์!
7. ๊ณ ๊ธ ์ธ๊ทธ๋จผํ
์ด์
๋ณต์กํ ์กฐ๊ฑด์ ์ฌ์ฉ์ ๊ทธ๋ฃน ์์ฑ ๋ฐ ๋ถ์.
์: "์ง๋ 30์ผ๊ฐ 3ํ ์ด์ ๊ตฌ๋งคํ์ง๋ง ์ต๊ทผ 7์ผ๊ฐ ์ ์ ์ ํ ์ฌ์ฉ์"
Firebase Analytics๋ฅผ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ค ๋ณด๋ฉด
์ฑ ์ด๋ ๋ฌธ์์ ์๋ ์ค๋ฌด ๋ ธํ์ฐ๊ฐ ํ์ํ ๋๊ฐ ๋ง์.
์ฌ๋ฅ๋ท์์๋ ์ค์ ๋ก ๋๊ท๋ชจ ์ฑ์ ์ด์ํ๋
์๋์ด ๊ฐ๋ฐ์๋ค์๊ฒ 1:1 ๋ฉํ ๋ง์ ๋ฐ์ ์ ์์ด.
ํนํ ์ด๋ฐ ๋ถ๋ถ์์ ๋์์ ๋ฐ์ ์ ์์ง:
- ์ฐ๋ฆฌ ์ฑ์ ๋ง๋ ์ด๋ฒคํธ ์ค๊ณ ์ ๋ต
- ๋ณต์กํ ํผ๋ ๋ถ์ ๋ฐฉ๋ฒ
- BigQuery ๊ณ ๊ธ ์ฟผ๋ฆฌ ์์ฑ
- ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ํ๋ก์ธ์ค ๊ตฌ์ถ
- A/B ํ ์คํธ ์ค๊ณ ๋ฐ ๋ถ์
ํผ์ ์ฝ์งํ๋ ์๊ฐ์ ์ค์ด๊ณ ์ถ๋ค๋ฉด ๊ณ ๋ คํด๋ด! ๐
๐ฌ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์, ์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ์ ๋ง ๋๋จํด! ๐
Firebase Analytics์ ๋ํด ๊ฝค ๋ง์ ๊ฑธ ๋ฐฐ์ ์ ๊ฑฐ์ผ.
ํต์ฌ๋ง ๋ค์ ์ ๋ฆฌํด๋ณผ๊ฒ:
๐ฏ ๊ธฐ์ตํด์ผ ํ ํต์ฌ ํฌ์ธํธ
1. ๋ฐ์ดํฐ๋ ๊ฑฐ์ง๋งํ์ง ์๋๋ค
์ถ์ธก์ด ์๋ ํฉํธ ๊ธฐ๋ฐ์ผ๋ก ์์ฌ๊ฒฐ์ ์ ํด์ผ ํด.
Firebase Analytics๋ ๊ทธ ํฉํธ๋ฅผ ์ ๊ณตํด์ฃผ๋ ๋๊ตฌ์ผ.
2. ์๊ฒ ์์ํ๊ณ ์ ์ง์ ์ผ๋ก ํ์ฅ
์ฒ์๋ถํฐ ๋ชจ๋ ๊ฑธ ์ถ์ ํ๋ ค๊ณ ํ์ง ๋ง.
ํต์ฌ ์ด๋ฒคํธ๋ถํฐ ์์ํด์ ํ์์ ๋ฐ๋ผ ์ถ๊ฐํด.
3. ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด๋ ์ ์ฑ๋ถ๊ฐ์นจ
์๋ฌด๋ฆฌ ์ข์ ๋ฐ์ดํฐ๋ผ๋ ๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ฅผ ์๋ฐํ๋ฉด ์ ๋ผ.
๋ฒ์ ๋ฌธ์ ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉ์ ์ ๋ขฐ๋ฅผ ์๊ฒ ๋ผ.
4. ๋ถ์์ ์๋จ์ด์ง ๋ชฉ์ ์ด ์๋๋ค
๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๊ฒ ์์ฒด๊ฐ ๋ชฉํ๊ฐ ์๋์ผ.
์ธ์ฌ์ดํธ๋ฅผ ๋์ถํ๊ณ ์ค์ ๋ก ๊ฐ์ ํ๋ ๊ฒ ์ค์ํด.
5. ์ง์์ ์ธ ํ์ต๊ณผ ๊ฐ์
Firebase Analytics๋ ๊ณ์ ์
๋ฐ์ดํธ๋๊ณ ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ผ.
๊พธ์คํ ๊ณต๋ถํ๊ณ ์คํํ๋ฉด์ ์ฑ์ฅํด์ผ ํด.
๐ ์ด์ ์์์ด์ผ!
์ด ๊ธ์ ์ฝ์ ๊ฒ๋ง์ผ๋ก๋ ์๋ฌด๊ฒ๋ ๋ณํ์ง ์์.
์ค์ํ ๊ฑด ์ค์ ๋ก ์ ์ฉํด๋ณด๋ ๊ฒ์ด์ผ! ๐ช
์ค๋ ๋น์ฅ ํ ์ ์๋ ๊ฒ๋ค:
1. Firebase ํ๋ก์ ํธ ์์ฑํ๊ธฐ
2. ๋ด ์ฑ์ Firebase SDK ์ถ๊ฐํ๊ธฐ
3. ์ฒซ ๋ฒ์งธ ์ปค์คํ
์ด๋ฒคํธ ๋ก๊น
ํ๊ธฐ
4. Firebase Console์์ ์ค์๊ฐ์ผ๋ก ํ์ธํ๊ธฐ
์์ ๊ฒ๋ถํฐ ์์ํด๋ด.
๊ทธ๋ฆฌ๊ณ ์ ์ ๋ ๋ณต์กํ ๋ถ์์ผ๋ก ๋์๊ฐ๋ฉด ๋ผ.
๋ฐ์ดํฐ ๋ถ์์ด ์ฒ์์ ์ด๋ ต๊ณ ๋ง๋งํ ์ ์์ด.
ํ์ง๋ง ํ ๋ฒ ์ต์ํด์ง๋ฉด, ๋ฐ์ดํฐ ์์ด๋
์ฑ ๊ฐ๋ฐ์ ํ ์ ์์ ์ ๋๋ก ์ค์ํ ๋๊ตฌ๊ฐ ๋ ๊ฑฐ์ผ! ๐
ํ์ด์ ๋น์ด! ๐
๊ทธ๋ฆฌ๊ณ ๊ถ๊ธํ ๊ฒ ์๊ฑฐ๋ ๋งํ๋ ๋ถ๋ถ์ด ์์ผ๋ฉด,
Firebase ๊ณต์ ๋ฌธ์๋ ์ปค๋ฎค๋ํฐ๋ฅผ ํ์ฉํด๋ด.
๋๋ ์ฌ๋ฅ๋ท์์ ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์๋ค์๊ฒ ์กฐ์ธ์ ๊ตฌํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ!
์, ์ด์ ๋๊ฐ์ ๋ฉ์ง ์ฑ์ ๋ง๋ค๊ณ ,
๋ฐ์ดํฐ๋ก ์ฌ์ฉ์๋ค์ ํ๋ณตํ๊ฒ ๋ง๋ค์ด๋ด! ๐
Happy Coding! ๐ปโจ
๐ ๊ณ์ ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ์ธ์!
Firebase Analytics๋ ์ฌ์ ์ ์์์ผ ๋ฟ์
๋๋ค.
๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ์ผ๋ก ๋ ๋์ ์ฑ์ ๋ง๋ค์ด๊ฐ์ธ์!
๐ฑ โ ๐ โ ๐ก โ ๐ โ ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.