NextBlog

우리 팀만의 useFunnel 만들기

coverImg
이전 포스트와 연결됩니다.

목차

 

useFunnel 목표

두 버전을 고려하여 다음과 같은 방식으로 useFunnel을 사용할 수 있게 만들 예정입니다.
만들기 위해 두 버전의 라이브러리 소스코드를 참고하여 제작했습니다.
 
먼저 타입 지정은 각 stepstep별 context의 타입을 지정합니다.
 
그리고 useFunnel에서는 generic 타입으로 각 step의 context에 대한 타입을 정의하고, options를useFunnel에 전달합니다.
 
이는 최신 버전과 같이 options를 지정합니다.
이때 useFunnel은 FunnelsetStep함수, 현재 저장된 상태를 확인할 수 있는 context를 반환합니다.
이때 init의 context는 정의된 타입과 일치해야 합니다. 아닐 경우 에러로 사용자에게 알려줘야 합니다.
 
그리고 각 퍼널 추상화를 다음과 같이 만들고자 합니다.
 
Funnel.Step에서 각 스텝 별 이름을 지정합니다.
 
setStep에서는 현재 step을 generic type에 정의해주고, 넘어가고자 하는 step과 상태를 전달합니다.
이때 setStep내에서 전달하고자 하는 상태는 정의된 타입과 일치해야 합니다.
만약 다음과 같이 다른 상태가 들어온다면 에러가 발생해야 합니다.
 

useFunnel 타입 정의

이제 타입을 지정하고자 합니다. 타입은 두 버전의 useFunnel 라이브러리를 참고하였습니다.
 
options에서 사용할 타입을 지정하겠습니다. 먼저 특정 funnel에서의 state 타입을 지정합니다.
그리고 이를 활용하여 FunnelStateByContextMap을 만들어 generic type으로 funnel의 step, context 타입을 받아 FunnelState<…> | FunnelState<…> 와 같은 유니온 타입으로 만듭니다.
이를 활용하여 options의 타입을 다음과 같이 지정합니다.
이렇게 하면 다음과 같은 option 지정이 가능합니다.
 

useFunnel 구현

이제 useFunnel을 정의된 타입을 가지고 구현해보겠습니다.
 
useFunnel 내부에 queryString을 확인하며 현재 step 상태를 확인합니다.
다음으로 useFunnel 내부에서 상태를 관리하기 위해 contextMap을 선언하여 내부에서 step에 대한 상태를 선언합니다.
 
이때 초기 상태 값이 존재할 경우 initial 값으로 넣어줍니다.
그리고 FunnelComponent로 queryString에서 받고 있는 step 값으로 해당되는 퍼널을 렌더링 합니다.
 
이때 typescript는 런타임 에러를 잡을 수 없으므로 step == null 일 경우 에러를 내보냅니다.
 
다음으로 setStep 함수의 타입을 지정하겠습니다. 이는 위처럼 generic type으로 nextStep과 지정될 context의 타입을 제한합니다.
다음과 같이 react project이므로 queryString를 설정하며 현재 step을 관리하였습니다.
 
또한 setContextMap 함수로 useFunnel 내부에서 context를 관리하였습니다.
이때도 지정된 type에 맞춰 입력되어야 합니다.
 
Funnel component는 step에 맞는 퍼널을 찾아 렌더링하는 역할을 합니다.
 
기존에는 밑과 같이 해당되는 이름을 가진 타겟 컴포넌트만 렌더링 하였지만,
이번 useFunnel에서는 유효한 children만 추출 한 후, 해당되는 이름을 가진 퍼널을 렌더링 해 줍니다.
또한 애니메이션을 추가하여 퍼널 렌더링 시 애니메이션을 보여줍니다.
 

사용

실제 사용시 다음과 같이 사용됩니다.
이런식으로 우리 팀 서비스에 맞는 useFunnel을 개발하여 다음과 같은 이점이 있었습니다.