API 레퍼런스

Sophonz Browser SDK의 모든 공개 API 메서드에 대한 완전한 레퍼런스입니다.

TIP — Sophonz Browser SDK API

SophonzSDK 객체는 웹 애플리케이션에서 RUM(Real User Monitoring)과 OpenTelemetry 기능을 초기화하고 관리하는 역할을 담당합니다. 이 객체는 세션 기록, 사용자 행동 추적, 예외 기록 등 다양한 기능을 제공합니다.

Sophonz Browser SDK를 사용하면 프론트엔드 애플리케이션에서 이벤트를 Sophonz로 전송하도록 설정할 수 있습니다. 이를 통해 네트워크 요청과 예외를 백엔드 이벤트와 함께 단일 타임라인에서 확인할 수 있습니다.

아래 내용은 SophonzSDK 객체에 대한 API를 설명합니다. 이 객체는 window.SophonzSDK에 존재합니다. 패키지로 설치한 경우 import SophonzSDK from "@sophonz/browser-sdk"를 통해 객체를 가져올 수 있습니다. 이 객체는 계측을 수행 중에 커스텀하게 데이터를 수집하거나 앱이 실행되는 중에 발생한 비즈니스 로직에 의한 계측 결과를 추가할 수 있도록 합니다.

메서드 목록

init

SophonzSDK.init(config: SophonzSDKConfig): void

초기 설정을 통해 SophonzSDK 인스턴스를 초기화합니다. 초기화 설정은 설정 옵션을 참고하세요.

  • 매개변수:
    • config (SophonzSDKConfig): 초기화 설정을 담은 객체입니다.
      • collectorUrl (string): 콜렉터 주소 (필수)
      • appName (string): 앱 이름 (필수)
      • appKey (string): 앱 키 (필수)
      • appVersion (string): 앱 버전 (필수)
      • 기타 선택적 설정들...

NOTE — Service Status 기반 계측 제어

init() 호출 시 이전에 저장된 서비스 상태(isCollecting)가 false인 경우 계측이 자동으로 비활성화됩니다. 또한 init()이 호출되면 Exporter 실패 카운터가 리셋됩니다.

deinit

SophonzSDK.deinit(): void

SophonzSDK 인스턴스를 종료하고 모든 계측을 중단합니다. 세션 레코더도 함께 종료됩니다.

  • 동작:
    • Exporter 이벤트 리스너 제거
    • OpenTelemetry 계측 종료
    • 세션 레코더 종료
    • OpAMP 클라이언트 정리
// 계측 종료 예시
SophonzSDK.deinit();

NOTE — 자동 deinit

Drop Policy가 활성화된 상태에서 Exporter 실패 횟수가 targetDropCount에 도달하면 deinit()이 자동으로 호출됩니다.

inited

SophonzSDK.inited: boolean

SophonzSDK가 초기화되었는지 여부를 반환합니다.

  • 반환값: (boolean): 초기화 여부
if (SophonzSDK.inited) {
  console.log('SophonzSDK is initialized');
}

stopSessionRecorder

SophonzSDK.stopSessionRecorder(): void

세션 기록기를 중지합니다.

resumeSessionRecorder

SophonzSDK.resumeSessionRecorder(): void

중지된 세션 기록기를 재개합니다.

addAction

특정 애플리케이션 이벤트(예: 가입, 제출 등)를 명시적으로 추적하기 위해 이벤트 이름과 선택적 이벤트 메타데이터를 포함하여 addAction 함수를 호출할 수 있습니다.

SophonzSDK.addAction(name: string, attributes?: Attributes): void

사용자 행동을 기록합니다.

  • 매개변수:
    • name (string): 행동의 이름
    • attributes (Attributes, 선택 사항): 추가 속성
SophonzSDK.addAction('Form-Completed', {
  formId: 'signup-form',
  formName: 'Signup Form',
  formType: 'signup',
});

recordException

SophonzSDK.recordException(error: any, attributes?: Attributes): void

예외를 기록합니다.

  • 매개변수:
    • error (any): 기록할 예외 객체
    • attributes (Attributes, 선택 사항): 추가 속성

recordLog

사용자 정의 로그를 기록합니다.

  • 매개변수:
    • message (string): 사용자 정의 로그 메시지
    • attributes (Record<string, string>, 선택 사항): 사용자 정의 추가 속성
SophonzSDK.recordLog(message: string, attributes?: Record<string, string>): void

특정 이벤트에 대한 기록을 남기고 싶은 경우(예: API 사용량 초과, 사용자 행동 등) recordLog 함수를 호출하여 로그를 기록할 수 있습니다. 이 로그는 Sophonz 대시보드에서 검색 및 필터링할 수 있습니다.

SophonzSDK.recordLog('API 사용량 초과', {
  userId: 'user_123',
  url: 'https://api.sophonz.com/usage',
})

userEvent

사용자 이벤트를 추적하고 분석하기 위한 API입니다. 특정 사용자 행동이나 비즈니스 로직의 시작과 끝을 측정하여 전체 duration을 계측할 수 있습니다.

userEvent: {
  start(name?: string, attributes?: Attributes): string;
  end(id: string, attributes?: Attributes): void;
  getActive(): UserEventInstance | undefined;
  cancel(id: string): void;
}

사용자 이벤트는 다음과 같은 주요 메서드를 제공합니다:

  • start(): 사용자 이벤트를 시작하고 고유한 이벤트 ID 반환
  • end(): 지정된 ID의 이벤트를 완료하고 span 기록
  • getActive(): 현재 활성화된 이벤트 정보 반환
  • cancel(): 지정된 ID의 이벤트를 취소 (span 기록 안 함)

자세한 사용 방법은 사용자 이벤트 계측 섹션을 참조하세요.

userEvent.start

SophonzSDK.userEvent.start(name?: string, attributes?: Attributes): string

사용자 이벤트를 시작하고 고유한 이벤트 ID를 반환합니다. 이 시점부터 발생하는 모든 계측(fetch, console, exception 등)이 이 이벤트의 컨텍스트로 그룹화됩니다.

  • 매개변수:
    • name (string, optional): 이벤트 이름 (기본값: user-event-[randomId])
    • attributes (Attributes, optional): 이벤트에 추가할 커스텀 속성
  • 반환값: 이벤트의 고유 식별자 (string)

userEvent.end

SophonzSDK.userEvent.end(id: string, attributes?: Attributes): void

지정된 ID의 사용자 이벤트를 완료하고 span을 기록합니다. 전체 duration이 자동으로 계산되어 기록됩니다.

  • 매개변수:
    • id (string, required): start()에서 반환된 이벤트 ID
    • attributes (Attributes, optional): 이벤트 완료 시 추가할 속성

userEvent.getActive

SophonzSDK.userEvent.getActive(): UserEventInstance | undefined

현재 활성화된 사용자 이벤트 정보를 반환합니다.

  • 반환값: 활성 이벤트 인스턴스 또는 undefined

userEvent.cancel

SophonzSDK.userEvent.cancel(id: string): void

지정된 ID의 사용자 이벤트를 취소합니다. span을 기록하지 않습니다.

  • 매개변수:
    • id (string, required): 취소할 이벤트 ID

고급 API

사용자 이벤트는 복잡한 워크플로우를 위한 추가 메서드들을 제공합니다:

  • with(id, fn): 특정 이벤트 컨텍스트에서 함수 실행
  • withActive(fn): 현재 활성 이벤트 컨텍스트에서 함수 실행
  • switchTo(id): 특정 이벤트로 컨텍스트 전환
  • getActiveContext(): 현재 활성 컨텍스트 반환
  • hasActiveUserEvent(): 활성 이벤트 존재 여부 확인
  • getContext(id): 특정 이벤트의 컨텍스트 반환

자세한 내용은 사용자 이벤트 계측 문서를 참조하세요.

사용 예시

// 버튼 클릭 이벤트 추적
function handleButtonClick() {
  // 이벤트 시작
  const eventId = SophonzSDK.userEvent.start('button-click', {
    'button.name': 'submit',
    'page.url': window.location.href,
  });
 
  // 비즈니스 로직 실행
  performBusinessLogic()
    .then(result => {
      // 성공 시 이벤트 완료
      SophonzSDK.userEvent.end(eventId, {
        'action.result': 'success',
        'items.count': result.count,
      });
    })
    .catch(error => {
      // 에러 시 이벤트 완료
      SophonzSDK.userEvent.end(eventId, {
        'action.result': 'error',
        'error.message': error.message,
      });
    });
}
 
// 폼 제출 이벤트 추적
function handleFormSubmit() {
  const eventId = SophonzSDK.userEvent.start('form-submission', {
    'form.type': 'contact',
    'form.fields': 'name,email,message',
  });
 
  try {
    validateForm();
    submitForm();
 
    SophonzSDK.userEvent.end(eventId, {
      'submission.result': 'success',
    });
  } catch (error) {
    SophonzSDK.userEvent.end(eventId, {
      'submission.result': 'error',
      'error.type': error.constructor.name,
    });
    throw error;
  }
}
 
// 이벤트 취소 예시
function handleCancellableOperation() {
  const eventId = SophonzSDK.userEvent.start('file-upload');
 
  // 사용자가 취소한 경우
  if (userCancelled) {
    SophonzSDK.userEvent.cancel(eventId);
    return;
  }
 
  // 정상 처리
  uploadFile().then(() => {
    SophonzSDK.userEvent.end(eventId);
  });
}

setScreenAttribute

SophonzSDK.setScreenAttribute(name: string): void

Sophonz Browser SDK는 기본적으로 화면 이름을 자동으로 수집합니다. 하지만 특정 화면에 대해 더 많은 정보를 제공하고 싶다면 setScreenAttribute 함수를 사용하여 화면 속성을 직접 설정할 수 있습니다. 이 함수는 화면 이름을 지정하고 현재 URL을 전역 변수에 기록합니다.

이 함수는 동적(Dynamic) 방식으로 동작합니다. 즉, 현재 페이지의 URL(location.href)이 변경되지 않는 한, 이 메서드로 설정한 화면 이름을 기준으로 성능을 측정하게 됩니다. 만약 URL이 바뀌게 되면, screenNameOption 설정에 따라 화면 이름이 자동으로 초기화됩니다.

따라서 화면 이름을 지속적으로 유지하면서 정확한 성능 데이터를 수집하려면, URL이 변경되거나 화면 전환이 일어날 때마다 setScreenAttribute 메서드를 다시 호출하는 것이 좋습니다.

이렇게 계측된 각 화면의 성능 데이터는 Sophonz 대시보드의 화면 분석 기능에서 고유한 화면 이름 기준으로 분석됩니다.

/**
 * `setScreenAttribute` 함수는 전달된 속성 값을 저장하고, 마지막 URL을 전역 변수에 기록합니다.
 *
 * @param {string} attribute - `attribute` 매개변수는 화면(screen)에 설정하고자 하는 속성을 나타내는 문자열입니다.
 */
function setScreenAttribute(attribute: string) {
  savedScreenAttribute = attribute;
  lastUrl = window?.location?.href;
}

enableAdvancedNetworkCapture

네트워크 캡처를 동적으로 활성화하거나 비활성화하려면 필요에 따라 enableAdvancedNetworkCapture 또는 disableAdvancedNetworkCapture 함수를 호출하기만 하면 됩니다.

WARNING — 네트워크 캡처 활성화

네트워크 캡처를 활성화하면 Sophonz Browser SDK가 네트워크 요청을 수집합니다. 이 기능은 성능 모니터링 및 디버깅에 유용하지만, bodyheader에 담긴 민감한 정보가 함께 계측됩니다. 개인 정보 보호 및 보안 요구 사항을 준수해야 합니다. 사용하기 전에 관련 법률 및 규정을 확인하세요.

SophonzSDK.enableAdvancedNetworkCapture(): void

disableAdvancedNetworkCapture

네트워크 캡처를 동적으로 활성화하거나 비활성화하려면 필요에 따라 enableAdvancedNetworkCapture 또는 disableAdvancedNetworkCapture 함수를 호출하기만 하면 됩니다.

SophonzSDK.disableAdvancedNetworkCapture(): void

setGlobalAttributes

메타데이터는 계측하는 데 필요한 추가 정보를 제공합니다. 이는 클라이언트 세션 중 언제든지 호출할 수 있습니다. 현재 클라이언트 세션과 호출 이후의 모든 이벤트는 메타데이터와 연결됩니다.

다른 추가 값들은 이벤트 검색에 사용할 수 있도록 지정할 수 있습니다.

SophonzSDK.setGlobalAttributes(attributes: Record<string, string>): void

전역 속성을 설정합니다.

  • 매개변수:
    • attributes (Record<string, string>): 설정할 전역 속성 객체
SophonzSDK.setGlobalAttributes({
  teamName: "your-team-name",
  groupName: "your-group-name",
  // 기타 사용자 지정 속성...
});

getDeviceId

SophonzSDK.getDeviceId(): string | null

웹뷰 환경에서 네이티브 앱의 디바이스 ID를 조회합니다. 이 메서드는 Sophonz Android/iOS SDK와 연동된 웹뷰 환경에서만 유효한 값을 반환합니다.

  • 반환값: (string | null): 디바이스 ID 또는 null (웹뷰가 아니거나 네이티브 리소스가 없는 경우)

동작 방식:

  • Android WebView: window.SophonzNative.getResources()를 통해 네이티브 리소스에서 device.id를 조회
  • iOS WebView: window.__sophonz_resources에서 device.id를 조회
  • 일반 웹 브라우저: null 반환
// 디바이스 ID 조회
const deviceId = SophonzSDK.getDeviceId();
 
if (deviceId) {
  console.log('Device ID:', deviceId);
  // 디바이스 ID를 활용한 로직 수행
} else {
  console.log('웹뷰 환경이 아니거나 디바이스 ID를 조회할 수 없습니다.');
}

NOTE — 웹뷰 전용 기능

이 API는 Sophonz Android/iOS SDK가 설치된 네이티브 앱 내의 웹뷰에서만 정상 동작합니다. 일반 웹 브라우저 환경에서는 항상 null을 반환합니다.

setUserIdAttribute

사용자 ID를 추가하면 Sophonz 대시보드에서 세션과 이벤트를 검색/필터링할 수 있습니다. 이는 클라이언트 세션 중 언제든지 호출할 수 있습니다. 현재 클라이언트 세션과 호출 이후의 모든 이벤트는 사용자 ID와 연결됩니다.

setUserIdAttribute(userId: string): void

(userId: string) => void

사용자 ID 속성을 설정합니다.

  • 매개변수:
    • userId (string): 사용자 ID
window.SophonzSDK.setUserIdAttribute("_sophonz_user_0001");

커스텀 사용자 ID를 지정하여 특정 사용자의 세션 분석 시 활용할 수 있습니다.

getSessionId

getSessionId(): string | undefined

현재 세션의 ID를 반환합니다.

  • 반환값: (string | undefined): 세션 ID 또는 정의되지 않음
const sessionId = SophonzSDK.getSessionId();

getSessionUrl

getSessionUrl(): string | undefined

현재 계측 중인 세션에 대한 Sophonz 세션 상세 링크를 반환합니다. 반환된 URL로 이동하면 해당 세션의 트레이스·로그·세션 리플레이를 Sophonz 대시보드에서 바로 확인할 수 있습니다.

  • 반환값: (string | undefined): Sophonz 세션 상세 링크 또는 정의되지 않음

attachToReactErrorBoundary

React를 사용하는 경우, React error boundary 내에서 발생하는 오류를 자동으로 캡처하기 위해 error boundary 컴포넌트를 attachToReactErrorBoundary 함수에 전달할 수 있습니다.

// ErrorBoundary를 가져옵니다 (react-error-boundary를 예제로 사용)
import { ErrorBoundary } from 'react-error-boundary';
 
// ErrorBoundary 컴포넌트에 연결하여 해당 컴포넌트 내에서 발생하는 모든 오류를 감지합니다.
SophonzSDK.attachToReactErrorBoundary(ErrorBoundary);
attachToReactErrorBoundary(errorBoundary: ErrorBoundaryComponent): void
  • 매개변수:
    • errorBoundary (ErrorBoundaryComponent): 연결할 Error Boundary 컴포넌트
// ErrorBoundary 가져오기 (예시로 react-error-boundary를 사용)
import { ErrorBoundary } from 'react-error-boundary';
 
// ErrorBoundary 컴포넌트에 연결하여 모든 인스턴스에서 발생하는 오류를 캡처합니다.
SophonzSDK.attachToReactErrorBoundary(ErrorBoundary);

getServiceStatus

SophonzSDK.getServiceStatus(): ServiceStatusResponse | null

현재 저장된 서비스 상태를 조회합니다.

  • 반환값: (ServiceStatusResponse | null): 서비스 상태 객체 또는 null
interface ServiceStatusResponse {
  isCollecting: boolean;    // 계측 수집 활성화 여부
  dropPolicy: boolean;      // Drop Policy 활성화 여부
  targetDropCount: number;  // 실패 임계값
  token: string;            // 서버에서 발급한 토큰
}
 
// 사용 예시
const status = SophonzSDK.getServiceStatus();
if (status) {
  console.log('Is collecting:', status.isCollecting);
  console.log('Drop policy enabled:', status.dropPolicy);
  console.log('Target drop count:', status.targetDropCount);
}

recordExporterFailure

SophonzSDK.recordExporterFailure(): boolean

Exporter 실패를 수동으로 기록합니다. 주로 내부적으로 사용되지만, 커스텀 Exporter를 사용하는 경우 수동으로 호출할 수 있습니다.

  • 반환값: (boolean): 임계값에 도달하여 계측이 중단되었으면 true, 아니면 false
// 커스텀 Exporter에서 실패 시 호출
const shouldStop = SophonzSDK.recordExporterFailure();
if (shouldStop) {
  console.log('Threshold reached, instrumentation stopped');
}

recordExporterSuccess

SophonzSDK.recordExporterSuccess(): void

Exporter 성공을 수동으로 기록합니다. 주로 내부적으로 사용됩니다.

NOTE — 실패 카운터 동작

recordExporterSuccess()를 호출해도 실패 카운터는 리셋되지 않습니다. 실패 카운터는 init() 호출 시에만 리셋됩니다.

CORS 요청에 대한 리소스 타이밍 활성화

프론트엔드 애플리케이션이 다른 도메인으로 API 요청을 하는 경우, 선택적으로 요청과 함께 Timing-Allow-Origin 헤더를 보내도록 활성화할 수 있습니다. 이를 통해 Sophonz Browser SDK는 PerformanceResourceTiming을 통해 DNS 조회, 응답 다운로드 등과 같은 요청에 대한 상세한 리소스 타이밍 정보를 캡처할 수 있습니다.

expresscors 패키지를 사용하는 경우, 다음 코드를 사용하여 헤더를 활성화할 수 있습니다:

var cors = require('cors');
var onHeaders = require('on-headers');
 
// ... 기타 코드
 
app.use(function (req, res, next) {
  onHeaders(res, function () {
    var allowOrigin = res.getHeader('Access-Control-Allow-Origin');
    if (allowOrigin) {
      res.setHeader('Timing-Allow-Origin', allowOrigin);
    }
  });
  next();
});
app.use(cors());