통합 공통 질문
Q. NetworkError는 어떻게 처리해야 하나요?
A. 사용자에게 알리고 재시도하거나 원래 로직을 진행하세요:
Web Javascript 통합의 경우
function handleNetworkError(response) {
if (confirm('네트워크 오류가 발생했습니다. 다시 시도하시겠습니까?')) {
nfStart(keys, callback); // 재시도
} else {
performOriginalLogic(); // 계속 진행
}
}
Android 통합의 경우
- Kotlin
- Java
private val callback = object : NetfunnelCallback() {
override fun onNetworkError(statusCode: Int, message: String) {
when (statusCode) {
1001 -> {
// 네트워크 연결되지 않음
showNetworkErrorDialog()
}
1002 -> {
// 네트워크 타임아웃 - 재시도
retryWithDelay()
}
}
}
}
private fun retryWithDelay() {
Handler(Looper.getMainLooper()).postDelayed({
Netfunnel.nfStart(projectKey, segmentKey, callback, this)
}, 2000)
}
private final NetfunnelCallback callback = new NetfunnelCallback() {
@Override
public void onNetworkError(int statusCode, @NonNull String message) {
switch (statusCode) {
case 1001:
// 네트워크 연결되지 않음
showNetworkErrorDialog();
break;
case 1002:
// 네트워크 타임아웃 - 재시도
retryWithDelay();
break;
}
}
};
private void retryWithDelay() {
new Handler(Looper.getMainLooper()).postDelayed(() -> {
Netfunnel.INSTANCE.nfStart(projectKey, segmentKey, callback, this);
}, 2000);
}
Q. 키를 반환하는 것을 잊어버리면 어떻게 되나요?
A. 키는 서버 타임아웃에 의해 자동으로 반환될 수 있지만, 이로 인해 병목 현상이 발생할 수 있습니다. 항상 명시적으로 반환하세요:
Web Javascript 통합의 경우
// 추천: 항상 키 반환
nfStart(keys, function(response) {
if (response.status === 'Success') {
performAction()
.then(() => nfStop(keys))
.catch(() => nfStop(keys)); // 오류 발생 시에도 반환
}
});
Android 통합의 경우
- Kotlin
- Java
// 추천: 항상 키 반환
private val callback = object : NetfunnelCallback() {
override fun onSuccess(statusCode: Int, message: String) {
performAction()
.onSuccess {
Netfunnel.nfStop(projectKey, segmentKey, completeCallback)
}
.onFailure {
Netfunnel.nfStop(projectKey, segmentKey, completeCallback) // 에러가 발생해도 반환
}
}
}
// 추천: 항상 키 반환
private final NetfunnelCallback callback = new NetfunnelCallback() {
@Override
public void onSuccess(int statusCode, @NonNull String message) {
performAction()
.onSuccess(() -> {
Netfunnel.INSTANCE.nfStop(projectKey, segmentKey, completeCallback);
})
.onFailure(() -> {
Netfunnel.INSTANCE.nfStop(projectKey, segmentKey, completeCallback); // 에러가 발생해도 반환
});
}
};
Q. NetFUNNEL 통합을 어떻게 디버깅하나요?
A. 로깅을 활성화하고 콘솔을 확인하세요:
Web Javascript 통합의 경우
<script
src="https://agent-lib.stclab.com/agents/client/javascript/netfunnel-javascript-agent.js"
data-nf-client-id="your-client-id"
data-nf-print-log="true"
></script>
이후 DevTools 콘솔에서 NetFUNNEL 로그 메시지를 확인하세요.
Android 통합의 경우
- Kotlin
- Java
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}",
printLog = true // 로깅 활성화
)
Netfunnel.INSTANCE.initialize(
"{{CLIENT_ID}}"
);
이후 Logcat에서 NetFUNNEL 로그 메시지를 확인하세요.
Q. URL 트리거와 코드 기반 방법을 모두 사용할 수 있나요?
A. 네, 단일 서비스 내에서 두 방법을 함께 사용할 수 있습니다:
- URL 트리거를 페이지 진입 속도 제어에 사용
- 코드 기반을 비즈니스 동시 사용자 수 제어에 사용
// 랜딩 페이지 보호를 위한 URL 트리거
// (콘솔에서 구성)
// 로그인을 위한 기본 제어
function handleLogin() {
Netfunnel.nfStart("login_project", "login_segment", loginCallback);
}
// 결제를 위한 구간 제어
function startCheckout() {
Netfunnel.nfStartSection("checkout_project", "checkout_segment", checkoutCallback);
}
일반적인 패턴:
- 페이지 진입 보호를 위해 URL 트리거 통합 사용
- 진입점(로그인, 주요 기능)에 기본 제어 (코드 기반 통합) 사용 - 화면 로드 후 빠른 키 반환
- 중요한 프로세스(결제, 결제 처리)에 구간 제어 (코드 기반 통합) 사용 - 전체 프로세스 완료까지 키 보유
그러나 운영 복잡성을 줄이기 위해 하나의 방법을 우선적으로 사용하는 것이 권장됩니다.
Q. 같은 앱에서 기본 제어와 구간 제어를 모두 사용할 수 있나요?
A. 예, 같은 애플리케이션에서 두 방법을 모두 사용할 수 있습니다:
iOS
- Swift
- Objective-C
// 로그인을 위한 기본 제어
func handleLogin() {
Netfunnel.shared.nfStart(projectKey: "login_project", segmentKey: "login_segment")
}
// 체크아웃을 위한 구간 제어
func startCheckout() {
Netfunnel.shared.nfStartSection(projectKey: "checkout_project", segmentKey: "checkout_segment")
}
// 로그인을 위한 기본 제어
- (void)handleLogin {
[[Netfunnel shared] nfStartWithProjectKey:@"login_project" segmentKey:@"login_segment"];
}
// 체크아웃을 위한 구간 제어
- (void)startCheckout {
[[Netfunnel shared] nfStartSectionWithProjectKey:@"checkout_project" segmentKey:@"checkout_segment"];
}
일반적인 패턴:
- 진입점(로그인, 주요 기능)에는 기본 제어 (코드 기반 통합) 사용 - 뷰 컨트롤러 로드 후 빠른 키 반환
- 중요한 프로세스(체크아웃, 결제)에는 구간 제어 (코드 기반 통합) 사용 - 전체 프로세스 완료까지 키 보유
Android
- Kotlin
- Java
// 로그인용 기본 제어
fun handleLogin() {
Netfunnel.nfStart("login_project", "login_segment", loginCallback, this)
}
// 체크아웃용 구간 제어
fun startCheckout() {
Netfunnel.nfStartSection("checkout_project", "checkout_segment", checkoutCallback, this)
}
// 로그인용 기본 제어
public void handleLogin() {
Netfunnel.INSTANCE.nfStart("login_project", "login_segment", loginCallback, this);
}
// 체크아웃용 구간 제어
public void startCheckout() {
Netfunnel.INSTANCE.nfStartSection("checkout_project", "checkout_segment", checkoutCallback, this);
}
일반적인 패턴:
- 진입 지점(로그인, 주요 기능)에는 기본 제어 (코드 기반 통합) 사용 - Activity 로드 후 빠른 키 반환
- 중요한 프로세스(체크아웃, 결제)에는 구간 제어 (코드 기반 통합) 사용 - 전체 프로세스 완료까지 키 보유
Q. NetFUNNEL을 여러 번 초기화할 수 있나요?
A. 아니요, NetFUNNEL은 Application 클래스에서 한 번만 초기화해야 합니다. 여러 번 초기화하면 예기치 않은 동작이 발생할 수 있습니다.