Back to Projects
logo

KB 리핏 (KB Refit)

2025.07 - 2025.08
thumb

KB IT’s Your Life 6기 금융권 웹 개발자 부트캠프 종합 실무 프로젝트로, KB스타뱅킹 위에서 전자영수증 및 사업자를 위한 영수처리, 병원비 보험처리 서비스를 마이데이터와 연동하였다고 가정하고 개발한 서비스입니다.

Team & Role

FE 2명, BE 4명

Team Leader, Front-end

Tech Stack

CoreVue3Nuxt.js 4TypeScriptTurborepoPWA
StylingTailwindCSS
State ManagementTanstack-QueryPinia

참여 활동

  • Turborepo를 활용한 모노레포 구성 (일반 사용자, 사장님, Admin 전용 페이지 분리)
  • Middleware를 활용한 Auth 로직 구성 (페이지 권한 별 예외 처리 로직 구현)
  • Firebase Cloud Storage 연동 및 이미지 업로드, 다운로드 기능 개발
  • i18n, Google Sheets 연동을 통한 다국어 지원(한국어, 영어) 및 JSON 생성 Script 개발
  • vitest를 활용한 페이지 별 UI 로직 테스트 코드 작성 및 husky를 활용한 커밋 전 테스트 연동
  • vue transition, custom hook, pinia를 활용한 다형성 훅(useFunnel) 커스텀 구현
  • PWA 웹앱 구성을 위한 Manifest 작성 및 적용

성과

코드 품질

501건

PR 및 코드 리뷰 시스템화를 통한 협업 진행

웹 성능 지표

90점+

Lighthouse 웹 성능 최적화 지표 '좋음' 달성

수상 내역

최우수

KB IT's Your Life 최우수 교육생 선정

트러블 슈팅

# Vue 반응성 시스템과 TanStack Query 충돌로 인한 무한 루프 에러 해결

Problem

Nuxt 배포(Vercel) 환경에서 페이지 진입 시 'Maximum call stack size exceeded' 에러와 함께 브라우저가 멈추는 무한 루프 현상이 발생했습니다. 로컬 개발 환경에서는 발생하지 않아 이전 배포 이력을 트래킹한 결과, TanStack Query의 useMutation 훅 추가 이후 발생한 문제임을 확인했습니다.

Solution

문제의 핵심은 useMutation의 mutationKey에 Pinia의 반응형 객체(store)를 통째로 전달한 것에 있었습니다. Vue의 반응성 시스템이 store를 읽는 순간 이를 종속성으로 등록(track)하고, 평가와 렌더링이 반복되며 무한 루프(trigger)를 유발한 것입니다. 이를 해결하기 위해 mutationKey에 반응형 객체를 직접 넣지 않고, store.businessNumber, store.category와 같이 원시값(Primitive Type)으로 해체 및 구조 분해하여 전달하는 방식으로 코드를 전면 수정했습니다.

✨ 개선 결과

  • mutationKey에 Pinia Store(반응형 객체) 대신 원시값을 명시적으로 전달함으로써, 불필요한 재렌더링과 track/trigger 무한 루프 고리를 완벽하게 끊어냈습니다.
  • 로컬 환경에서는 감춰져 있던 문제를 배포 환경(Vercel)의 엄격한 평가 타이밍에서 발견하고 트래킹하여, 사용자가 직면할 수 있는 크리티컬한 에러(브라우저 멈춤 현상)를 조기에 차단했습니다.

Before

무한 루프 (브라우저 다운)

After

정상 렌더링

Learned
  • Vue의 반응성 시스템(Reactivity)이 어떻게 동작(track/trigger)하는지, 그리고 Proxy 객체가 렌더링에 미치는 영향을 깊이 이해하게 되었습니다.
  • TanStack Query가 내부적으로 키(Key)를 기반으로 상태를 관리하는 원리를 파악하고, 프레임워크와 외부 라이브러리를 혼용할 때 발생할 수 있는 라이프사이클 충돌 문제를 경험했습니다.
  • 단순히 동작하는 코드를 짜는 것을 넘어, 상태 관리 도구(Pinia, React Query 등)의 내부 동작 방식을 정확히 알고 원시값과 참조값을 구분하여 사용해야 함을 체감했습니다.
Maximum call stack size exceeded 에러 로그
Vercel 배포 환경에서 발생한 Call Stack 초과 에러
500 Internal Server Error 에러 로그
Vercel 배포 환경에서 mutationKey에 반응형 객체를 전달하여 발생한 500 Internal Server Error 에러
문제 발생 코드
commit 이력을 통해 역추적한 문제가 발생한 코드
AI와 분석한 에러 원인
AI 도구를 활용하여 분석한 에러 원인