[typescript] 타입스크립트와 GraphQL을 함께 사용하는 애널리틱스 추적 방법

GraphQL을 사용하여 클라이언트 측 데이터를 추적하는 것은 많은 혜택을 가져다 줍니다. 하지만 여기에는 복잡성도 따르며, 클라이언트 애플리케이션에서 어떻게 추적 데이터를 캡처하고 처리할지에 대한 고려 사항이 포함됩니다. 특히 타입스크립트 환경에서 GraphQL을 사용하는 경우에는 더 많은 고려가 필요합니다.

타입스크립트와 GraphQL

타입스크립트를 사용하면 GraphQL 쿼리와 뮤테이션에 타입 안정성을 부여할 수 있습니다. GraphQL 쿼리를 타입스크립트 파일로 정의하고, GraphQL 스키마로부터 생성된 타입을 사용하여 쿼리를 수행하는 함수들을 작성할 수 있습니다.

import { gql, TypedDocumentNode } from '@apollo/client';

interface User {
  id: number;
  name: string;
}

type GetUserQuery = TypedDocumentNode<{
  user: User;
}>;

const GET_USER = gql`
  query GetUser($userId: ID!) {
    user(id: $userId) {
      id
      name
    }
  }
`;

위 예시에서 GET_USER 쿼리는 GetUserQuery 타입으로 정의되어 있습니다. 이렇게 함으로써 우리는 런타임에서 쿼리의 구조와 반환 타입을 자동으로 검사할 수 있습니다.

추적 데이터 캡처

클라이언트 측에서 발생하는 이벤트를 추적하기 위해, 우리는 애널리틱스 라이브러리를 사용할 수 있습니다. 이를 통해 클라이언트의 상호작용과 행위를 추적하고 분석할 수 있습니다. 예를 들어 react-ga라이브러리를 사용하여 구현할 수 있습니다.

import ReactGA from 'react-ga';

ReactGA.initialize('YOUR_TRACKING_ID');
ReactGA.event({
  category: 'User',
  action: 'Logged in',
});

이제 이러한 추적 이벤트들을 GraphQL로 전송하는 방법에 대해서 생각해야 합니다. 예를 들어 여기서 우리는 Logged in 이벤트를 전송할 때, 현재 로그인한 사용자의 아이디를 함께 전송하고자 할 수 있습니다.

타입스크립트를 활용한 추적 데이터의 안정적인 전송

이제 타입스크립트를 사용하여 추적 이벤트 데이터의 타입 안정성을 확보해야 합니다. GraphQL 스키마를 기반으로 한 타입들을 사용하여 추적 데이터를 전송하는 함수들을 작성할 수 있습니다. 이를 통해 추가적인 런타임 에러를 방지할 수 있습니다.

import { MutationFunction, useMutation } from '@apollo/client';

interface LoginEvent {
  userId: number;
  action: string;
}

type TrackLoginMutation = MutationFunction<{
  trackLogin: boolean;
}, LoginEvent>;

const TRACK_LOGIN = gql`
  mutation TrackLogin($userId: ID!) {
    trackLogin(userId: $userId)
  }
`;

function useTrackLogin() {
  const [trackLogin] = useMutation(TRACK_LOGIN);

  return (event: LoginEvent) => {
    trackLogin({ variables: event });
  };
}

위의 예제는 LoginEvent 타입으로 추적 이벤트 데이터를 정의하고, TrackLoginMutation 타입으로 해당 이벤트를 전송하는 함수를 정의합니다.

결론

타입스크립트와 GraphQL을 함께 사용하면 클라이언트 애플리케이션에서의 데이터 추적 과정을 안전하게 관리할 수 있습니다. 타입 안전성을 확보하고, GraphQL 스키마를 기반으로 한 안정적인 데이터 전송 함수들을 작성하여 실수를 줄이고 유지보수성을 향상시킬 수 있습니다.