-
Funnel에서의 상태관리 고민React 2024. 1. 30. 17:03
현재 구조는 최상위 컴포넌트인 OnboardingPage에서 모든 상태를 useState를 통해 관리하고 있다.
const OnBoardingPage = () => { const { Funnel, setStep } = useFunnel(ONBOARDING_FORM_STEP, ONBOARDING_FORM_STEP[0]); const [gifteeName, setGifteeName] = useState<string>(''); const [imageUrl, setImageUrl] = useState<string>(''); const [deliveryDate, setDeliveryDate] = useState<string>(''); const [tournamentStartDate, setTournamentStartDate] = useState<string>(''); const [tournamentDuration, setTournamentDuration] = useState<string>(''); const [fileName, setFileName] = useState<string>(''); const [invitationCode, setInvitationCode] = useState<string>(''); const [presignedUrl, setPresignedUrl] = useState<string>(''); const [imageFile, setImageFile] = useState<File | null>(null); const [roomId, setRoomId] = useState<number>(0);
그리고 각 퍼널 단계마다 필요한 상태를 props로 내려주고 있다.
<Funnel.Step name='NAME'> <OnBoardingHeader step={1} onClick={handleFirstHistoryClick} /> {/* step01 */} <NameInput onNext={() => setStep(() => 'THUMBNAIL')} setGifteeName={setGifteeName} gifteeName={onboardingInfo.gifteeName} /> </OnBoardingPageWrapper> </Funnel.Step> <Funnel.Step name='THUMBNAIL'> <OnBoardingPageWrapper> <OnBoardingHeader step={2} /> {/* step02 */} <ThumbnailInput onNext={() => setStep(() => 'PRESENT')} setFileName={setFileName} setImageFile={setImageFile} /> </OnBoardingPageWrapper> </Funnel.Step> . . .
이렇게 step05까지 설계되어있다.
프로젝트를 진행하면서도 계속해서 이런 구조에 대한 의문이 생겼었다.
최상위 컴포넌트에서 상태를 관리하는 이 구조가 정말 최선인가?
물론 장점도 있는 것 같다.
어떤 상태가 어디에 전달되는지 명시적이기 때문에 보다 쉽게 이해할 수 있다는 것이다.
그러나, 여러 걱정이 앞서는 것도 또한 사실이다.
혹여나 퍼널의 단계마다 데이터 전달이 잘 안되지 않을까?
컴포넌트간의 상태를 공유하기 어렵지는 않을까?
상태의 일관성을 유지하기 어렵지는 않을까?
향후 온보딩에 더 많은 정보가 필요하다면, 유지보수에 어려움이 있지는 않을까?
또한,
이러한 구조는 커스텀 훅으로 분리하기엔 어렵지 않은가?
그렇다는 말은 곧, 각 퍼널 단계마다의 코드가 길어지고, 관심사에 따라 분리하기 어렵다는 판단이 들었다.
그렇다면 어떤 구조가 최선일까??
현재 코드의 특징은 다음과 같이 정리할 수 있을 것이다.
1. 단계별로 데이터를 수집한다
-> 퍼널의 각 단계에서 데이터를 수집하고 최종적으로 전체 데이터를 서버에 전달하는 형태
2. 데이터의 일부만 필요한 경우가 있다.
현재로썬, 필요한 데이터가 단순하기에 useState로 관리하는 것도 좋아보이긴 한다.
그러나, 추후 단계가 더 추가되거나, 필요한 상태가 더 복잡해진다면, 지금처럼 useState로 계속해서 관리하기엔 힘들 것 같다는 생각이다.
context API를 도입해보면 어떨까?
아무래도 시도해보지 않은 구현 방식이기에 러닝 커브가 있을 것이고, 코드의 복잡도가 조금은 올라갈 수 있다.
그렇지만 상태 변경이 필요한 경우 중앙에서 한번에 수정할 수 있기에 코드의 일관성을 좀 더 유지할 수 있다는 장점이 있을 것 같다.
결국 나의 고민을 정리하자면, 아래와 같다.
추후 유지보수 측면에서 미리 리팩토링을 진행하는 것
vs
아직 단순한 데이터만 필요하니 최상위 컴포넌트에서 props로 전달해주는 현재 구조
추후에는 context API를 이용하여 리팩토링하는 과정을 블로그에 포스팅 해보겠다.
'React' 카테고리의 다른 글
모던 리액트 Deep dive - 클래스, 클로져 (3) 2024.02.18 모던 리액트 Deep Dive - 리액트 개발을 위해 꼭 알아야 할 JS (1) 2024.02.12 왕초보가 작성한 토스 퍼널의 아주 기초적인 사용법 (0) 2024.01.19 리액트에서 .env 사용하기 (카카오 로그인) (0) 2023.11.06 [React] to do app 만들기 (0) 2023.07.11