Project
Share project experiences and records
Share project experiences and records
Last edited: February 18, 2026
| 항목 | 내용 |
|---|---|
| 기간 | 2024.10 - 2025.12 |
| 역할 | 프론트엔드 개발 (지출, 집계, 앱 관리 주요 개발) |
| 기술 스택 | React 18, TypeScript, Vite, React Query v5, Redux Toolkit, Recoil, MUI |
| 아키텍처 | Feature-Sliced Design (FSD), MVVM (ViewModel 패턴) |
| 인프라 | Yarn Berry v4 모노레포 (5 apps + 3 packages), AWS (Terraform) |
╔═════════════════╗ ╔═════════════════╗ ╔═════════════════╗
║ SPEND SOURCE ║ ║ PROCESSING ║ ║ OUTPUT ║
╠═════════════════╣ ╠═════════════════╣ ╠═════════════════╣
║ ║ ║ ║ ║ ║
║ Manual Input ──╫──┐ ║ Spend Form ║ ║ Spend List ║
║ Invoice OCR ──╫──┼→║ (RHF + Yup) ║ ║ │ ║
║ Card Txn ──╫──┤ ║ │ ║ ║ ├→ Dashboard ║
║ CSV Upload ──╫──┘ ║ ▼ ║ ║ │ (8 Charts)║
║ ║ ║ Exchange Rate ║──→ ║ │ ║
║ ║ ║ │ ║ ║ └→ Detail ║
║ ║ ║ ▼ ║ ║ Panel ║
║ ║ ║ Custom Fields ║ ║ ║
╚═════════════════╝ ╚═════════════════╝ ╚═════════════════╝@packages/ui에 react-pdf 기반 뷰어 컴포넌트 추가@packages/core — OpenAPI Generator 기반 API 클라이언트 자동 생성@packages/ui — MUI 래핑 컴포넌트 라이브러리@packages/localization — i18next 공용 인스턴스 (en/ko/ja)Architecture
┌────────────────────────────────────────────────────┐
│ Yarn Berry v4 Monorepo │
├────────────────────────┬───────────────────────────┤
│ apps/ │ packages/ │
├────────────────────────┤───────────────────────────┤
│ admin-workspace │ @packages/core │
│ admin │ util functions + hooks │
│ launcher │ + Types (OpenAPI Gen) │
│ my-account ├───────────────────────────┤
│ storybook │ @packages/ui │
│ │ 80+ MUI Components │
│ ├───────────────────────────┤
│ │ @packages/localization │
│ │ i18next (en/ko/ja) │
└────────────────────────┴───────────────────────────┘
의존성 관계:
admin-workspace ──→ core, ui, localization
admin ──→ core, ui, localization
launcher ──→ ui, localization
my-account ──→ ui, localizationapp → pages → widgets → features → entities → sharedeslint-plugin-boundaries로 레이어 간 import 규칙 강제@lukemorales/query-key-factory)model/useXxxViewModel.ts로 비즈니스 로직 분리┌────────────────────────────────────────┐
│ app/ │
│ Providers, Store, Routes, API Config │
└───────────────────┬────────────────────┘
│ import
┌───────────────────▼────────────────────┐
│ pages/ │
│ Route-level Components │
└─────────┬─────────┴─────────┬──────────┘
│ │
┌─────────▼──────────────────────────────┐
│ widgets/ │
│ Composite Components (cross-feature) │
└───────────────────┬────────────────────┘
│
┌───────────────────▼────────────────────┐
│ features/ (35+ slices) │
│ Business Logic + UI per domain │
└───────────────────┬────────────────────┘
│
┌───────────────────▼────────────────────┐
│ entities/ (27 domains) │
│ Domain Models, Query Keys │
└───────────────────┬────────────────────┘
│
┌───────────────────▼────────────────────┐
│ shared/ │
│ Axios, Utils, Base UI, Config │
└────────────────────────────────────────┘
↑ 상위 레이어는 하위 레이어만 import 가능 (역방향 금지)
↑ 같은 레이어 간 cross-import 금지 (entities @x 패턴 예외)Claude, Cursor 등 생성형 AI 도구를 활용 중 남용 사례 발생.
| Problem | Solution |
| 하나의 파일안에 • Business Logic • UI Logic • 도메인별 조건 분기 • UI type 별 조건 분기 • Magic number • etc… 최대 코드 5,000 라인 파일. | 기존 코드를 리팩터링, 추가 기능 개발 등 활용할 수 있도록 OOP 원칙, FSD 설계 원칙, Code Review Skills 등 문서화. |
FilterBar — 필터 동적 추가/제거/초기화, 기본 설정 vs 사용자 추가 필터 구분FilterLocalSearch — 정적 옵션 선택 필터.FilterServerSearch — 동적 옵션 선택 필터.useTable 훅 — Tanstack Table 테이블 상태 관리 일반화 (정렬, 페이지네이션, 선택)@packages/ui의 pinned column 로직 공통화, Magic number 제거yarn core api:smp 명령어를 통해 타입 안전한 갱신 → 커뮤니케이션 비용 절감기존 코드의 useMemo, useCallback 남용으로 인한 동작 이상 다수 발견.
React Compiler 설정 추가 및 react-compiler-runtime 통합