React와 TypeScript를 기반으로 서비스의 핵심 UI/UX를 설계하고 구현했습니다.
AI 커리어 플래너의 핵심은 사용자의 진로 계획 데이터를 마인드맵, 간트차트, 칸반보드라는 세 가지 다른 형태로 동시에 보여주는 것이었습니다. 사용자가 한 쪽 뷰에서 데이터를 수정하면, 나머지 뷰에도 즉시 일관되게 반영되어야 했습니다. 이 과정에서 발생할 수 있는 복잡한 상태 동기화 문제를 해결하는 것이 가장 큰 기술적 도전이었습니다.
전역 상태 관리의 복잡성을 줄이고, 컴포넌트 간의 불필요한 리렌더링을 최소화하기 위해 Jotai를 도입했습니다. Redux나 Context API와 달리, Jotai는 상태를 '원자(Atom)' 단위로 작게 나누어 관리할 수 있어 필요한 컴포넌트만 정밀하게 리렌더링하는 것이 가능했습니다.
상태 업데이트 흐름 (State Update Flow)
데이터 구독 및 UI 렌더링 (UI Subscription & Rendering)
[그림 1] Jotai를 활용한 상태 관리 흐름도
위 구조처럼 커리어 데이터의 핵심 상태를 careerDataAtom으로 정의하고, 각 시각화 컴포넌트(마인드맵, 간트, 칸반)는 이 Atom을 구독하도록 설계했습니다. 사용자가 마인드맵에서 노드를 수정하면 careerDataAtom의 상태가 변경되고, 이 변경 사항은 즉시 간트차트와 칸반보드에 반영됩니다.
// 예시: 커리어 데이터 Atom 정의import { atom } from 'jotai';interface CareerNode {id: string;label: string;startDate?: Date;endDate?: Date;status?: 'todo' | 'in-progress' | 'done';}export const careerDataAtom = atom<CareerNode[]>([]);// 파생 Atom을 사용하여 특정 뷰에 필요한 데이터만 계산export const mindmapNodesAtom = atom((get) =>get(careerDataAtom).map(node => ({ id: node.id, data: { label: node.label } })));
Jotai 기반 아키텍처를 통해 상태 관리 로직을 중앙화하고 컴포넌트 간의 결합도를 낮춤으로써, 코드의 유지보수성을 크게 향상시켰습니다. 또한, 불필요한 렌더링을 방지하여 드래그 앤 드롭과 같은 복잡한 인터랙션에서도 부드러운 사용자 경험을 제공할 수 있었습니다.