Remix에서 OpenReplay 사용하기

Remix 프로젝트에서 사용자 추적을 시작하는 방법을 알아봅니다.

Remix에서 OpenReplay 사용하기

OpenReplay 트래커를 Remix 기반 프로젝트에 설치하는 과정은 비교적 간단합니다.

Remix 프로젝트가 준비되었다면 app 폴더 안의 root.jsx 파일을 찾아, 플랫폼에서 프로젝트를 만들 때 OpenReplay가 제공한 SSR 코드를 포함합니다.

플랫폼에서 제공하는 코드를 그대로 사용해도 됩니다. 시작하는 데 필요한 최소한의 코드입니다. 그렇게 한다면 아래 그림과 같이 “Server-Side-Rendered (SSR)” 옵션을 선택해야 합니다.

snippet-code-screenshot.jpg

트래커를 싱글톤 인스턴스로 사용할 수 있으며, 이 방식을 권장합니다. 이렇게 하면 앱 어디에서든 트래커에 접근할 수 있습니다.

import { tracker } from '@openreplay/tracker'

tracker.configure({
  projectKey: 'YOUR_PROJECT_KEY',
  ingestPoint: "https://openreplay.mydomain.com/ingest", // when dealing with the self-hosted version of OpenReplay
});

이 예시에서는 샘플 모듈을 만들어 tracker.ts로 app 폴더 안에 저장합니다. 이 모듈은 트래커를 인스턴스화하고 시작하는 startTracker라는 함수를 내보냅니다.

import {v4 as uuidV4} from 'uuid'
import Tracker from '@openreplay/tracker'

function defaultGetUserId() {
    return uuidV4() 
}

type TrackerConfig = {
    projectKey: string,
    userIdEnabled?: boolean,
    getUserId?: () => string
}

export function startTracker(config: TrackerConfig) {
    let tracker = null;
    let userId = "";
   
    console.log("Starting tracker...")
    console.log("Custom configuration received: ", config)
        
    const getUserId = (config?.userIdEnabled && config?.getUserId) ? config.getUserId : defaultGetUserId
        
    const trackerConfig: TrackerConfig = {
        projectKey: config?.projectKey
    }
        
    console.log("Tracker configuration")
    console.log(trackerConfig)
    tracker = new Tracker(trackerConfig);
        
    if(config?.userIdEnabled) {
        userId = getUserId()
        tracker.setUserID(userId)
    }
     
    tracker.start();
      
    return {
        tracker,
        userId
    }
}

이 방식으로 OpenReplay의 Tracker 모듈을 가져오는 데 문제가 있다면 다음과 같이 동적 import를 사용해 보세요.

import {v4 as uuidV4} from 'uuid'

function defaultGetUserId() {
    return uuidV4() 
}

type TrackerConfig = {
    projectKey: string,
    userIdEnabled?: boolean,
    getUserId?: () => string
}

export function startTracker(config: TrackerConfig) {
    let tracker = null;
    let Tracker = null
    let userId = "";
    
    (async () => {
				//dynamic import 
        Tracker  = (await import('@openreplay/tracker')).default 
        console.log("Starting tracker...")
        console.log("Custom configuration received: ", config)
        
        const getUserId = (config?.userIdEnabled && config?.getUserId) ? config.getUserId : defaultGetUserId
        
        const trackerConfig: TrackerConfig = {
            projectKey: config?.projectKey
        }
        
        console.log("Tracker configuration")
        console.log(trackerConfig)
        tracker = new Tracker(trackerConfig);
        
        if(config?.userIdEnabled) {
            userId = getUserId()
            tracker.setUserID(userId)
        }
        
        
        tracker.start();
        
    })()
    
    return {
        tracker,
        userId
    }
}

2단계. 프로젝트에 코드와 트래커 추가하기

Section titled 2단계. 프로젝트에 코드와 트래커 추가하기

이제 다음 명령으로 프로젝트에 트래커 패키지를 설치해야 합니다.

$ npm install @openreplay/tracker

위 코드가 그대로 동작하도록 uuid 패키지도 설치해야 합니다.

이 작업을 마치면 트래킹을 시작할 준비가 거의 끝났습니다. 다만 프로젝트 키를 ENV 변수로 설정한 뒤 이를 config 객체에 담아 트래커에 전달해야 합니다(이 객체는 startTracker 함수가 받습니다).

Remix에서 ENV 변수 로드하기

Section titled Remix에서 ENV 변수 로드하기

ENV 변수는 백엔드에서 접근할 수 있으므로, ENV 변수를 포함해 외부 데이터를 로드하는 데 사용할 수 있는 loader 함수를 활용합니다.

그런 다음 useLoaderData 훅을 사용해 하이드레이션 이후 컴포넌트에서 로드된 데이터에 접근할 수 있도록 합니다.

root.tsx 파일(TypeScript를 사용하지 않는다면 jsx 파일) 안에 다음 함수를 추가합니다.

type LoaderData = {
  ENV: {
    projectKey: string | undefined
  }
};

export const loader: LoaderFunction = async ({ }) => {
  return json<LoaderData>({
    ENV: {
      projectKey: process.env.OPENREPLAY_PROJECT_KEY
    }
  });
};

프로젝트 키를 OPENREPLAY_PROJECT_KEY ENV 변수에 설정하고 있다는 점에 주목하세요.

이 값을 loader 함수 실행 결과의 일부로 반환하면, 다음과 같이 메인 컴포넌트에서 useLoaderData 훅을 사용할 수 있습니다.

export default function App() {

  let loaderData = useLoaderData()

  useEffect(() => {
    startTracker({
      projectKey:  loaderData.ENV.projectKey
    })
  }, []) 

  return (
    <html lang="en">
      <head>
        <Meta />
        <Links />
      </head>
      <body>
        <Outlet />
        <ScrollRestoration />
        <Scripts />
        <LiveReload />
      </body>
    </html>
  );
}

컴포넌트의 내용은 목적에 따라 달라질 수 있지만, 이 예시는 페이지가 하이드레이션된 후 올바른 프로젝트 키로 트래커를 시작하는 역할을 합니다.

3단계. 향상된 디버깅 경험을 누려 보세요!

Section titled 3단계. 향상된 디버깅 경험을 누려 보세요!

이제 애플리케이션을 배포하면 됩니다.

테스트를 시작하면 탭을 닫은 지 몇 분 후에 리플레이가 목록에 표시됩니다(실수로 탭을 닫은 것이 아님을 확인하기 위한 것입니다).

Remix 기반 애플리케이션의 전체 코드는 이 저장소에서 확인할 수 있습니다.

Remix 기반 프로젝트에 트래커를 설정하는 중 문제가 있다면 Slack 커뮤니티로 문의하여 개발자에게 직접 질문하세요!