Vue.js 미드레벨 기술면접

Vue.js 미드레벨 (3~7년) 종합 5문항 조회수 103 · 2026-06-15 (월) 19:10:54
1 상태 관리 아키텍처
Medium

Q. Vue 3 애플리케이션에서 전역 상태 관리를 위해 Pinia 대신 Composable만으로 상태를 관리하는 것과 비교했을 때, Pinia를 사용하는 것의 장점은 무엇이며, 어떤 기준으로 둘 중 하나를 선택해야 하는지 설명해주세요.

A. 모범답안

Pinia는 DevTools 통합으로 시간 여행 디버깅과 상태 추적이 가능하고, 코드 스플리팅과 트리 쉐이킹이 자동으로 지원되며, TypeScript 지원이 우수하고 타입 추론이 자동으로 됩니다. SSR 환경에서 서버/클라이언트 상태 분리가 명확하고, 플러그인 시스템을 통한 확장성이 뛰어납니다. Composable은 간단한 전역 상태나 UI 로직 재사용에 적합하고, Pinia는 복잡한 비즈니스 로직, 여러 컴포넌트가 공유하는 상태, 디버깅이 중요한 경우에 적합합니다. 프로젝트 규모가 크고 여러 개발자가 협업하며 상태 변경 추적이 중요하다면 Pinia를 선택하는 것이 좋습니다.

핵심 포인트
  • • DevTools 통합과 디버깅 기능
  • • 코드 스플리팅 및 번들 최적화
  • • SSR 환경에서의 상태 관리
  • • 프로젝트 규모와 복잡도에 따른 선택 기준
Follow-up 질문

Composable로 구현한 전역 상태를 나중에 Pinia로 마이그레이션할 때 어떤 점을 주의해야 하며, 점진적 마이그레이션 전략은 어떻게 수립하시겠습니까?

2 빌드 최적화
Hard

Q. Vue 3 프로젝트의 번들 크기가 지나치게 커서 초기 로딩 시간이 길어지는 문제를 해결해야 합니다. Vite 또는 Webpack을 사용할 때 번들 분석 방법, 코드 스플리팅 전략, 그리고 Tree Shaking이 제대로 동작하지 않는 경우의 원인과 해결 방법을 설명해주세요.

A. 모범답안

번들 분석은 rollup-plugin-visualizer나 webpack-bundle-analyzer를 사용하여 각 패키지의 크기를 시각화하고, 라우트 기반 코드 스플리팅은 Vue Router의 동적 import를 활용하며, 컴포넌트 레벨 스플리팅은 defineAsyncComponent로 구현합니다. Tree Shaking이 동작하지 않는 주요 원인은 CommonJS 모듈 사용, 사이드 이펙트가 있는 코드, package.json의 sideEffects 설정 누락입니다. 해결 방법으로는 ES Module 버전의 라이브러리 사용, lodash 대신 lodash-es 사용, 사이드 이펙트가 없는 순수 함수로 리팩토링, 그리고 manualChunks 설정으로 vendor 분리를 최적화합니다.

핵심 포인트
  • • 번들 분석 도구 활용
  • • 라우트 및 컴포넌트 기반 코드 스플리팅
  • • Tree Shaking 동작 조건과 CommonJS 문제
  • • manualChunks를 통한 청크 최적화
Follow-up 질문

Dynamic Import로 분할된 청크들이 너무 많아져서 오히려 HTTP 요청 수가 증가하는 경우, 적절한 청크 크기와 개수를 결정하는 기준은 무엇입니까?

3 에러 핸들링
Medium

Q. Vue 3 애플리케이션에서 전역 에러 핸들링 시스템을 구축해야 합니다. app.config.errorHandler, onErrorCaptured 훅, try-catch의 차이점과 각각의 적절한 사용 시나리오를 설명하고, 비동기 에러를 처리하는 방법을 설명해주세요.

A. 모범답안

app.config.errorHandler는 애플리케이션 전역의 모든 에러를 잡아 로깅 서비스로 전송하거나 사용자에게 에러 메시지를 표시하는 최상위 에러 바운더리로 사용합니다. onErrorCaptured는 특정 컴포넌트 하위 트리의 에러를 가로채서 폴백 UI를 표시하거나 에러 복구 로직을 실행할 때 사용하며, false를 반환하면 에러 전파를 중단합니다. try-catch는 특정 비동기 작업의 에러를 세밀하게 제어할 때 사용합니다. 비동기 에러는 Promise rejection을 처리해야 하므로 async/await와 try-catch를 조합하거나, window.addEventListener('unhandledrejection')로 처리되지 않은 Promise 에러를 전역에서 잡습니다.

핵심 포인트
  • • 전역 errorHandler의 역할과 사용 시나리오
  • • onErrorCaptured의 에러 전파 제어
  • • 비동기 에러와 Promise rejection 처리
  • • unhandledrejection 이벤트 활용
Follow-up 질문

에러 발생 시 사용자 세션 정보, 브라우저 환경, 재현 가능한 액션 히스토리를 함께 수집하여 로깅하는 시스템을 구축한다면 어떤 구조로 설계하시겠습니까?

4 테스팅 전략
Medium

Q. Vue 3 컴포넌트를 테스트할 때 Vitest와 Vue Test Utils를 사용하여 사용자 인터랙션, 비동기 상태 업데이트, Composable 로직을 테스트하는 방법을 설명하고, 테스트 커버리지를 높이면서도 유지보수 가능한 테스트를 작성하는 전략을 제시해주세요.

A. 모범답안

사용자 인터랙션은 await wrapper.find('button').trigger('click')로 이벤트를 발생시키고, 비동기 상태 업데이트는 await flushPromises()나 await wrapper.vm.$nextTick()으로 DOM 업데이트를 기다립니다. Composable은 컴포넌트와 분리하여 단위 테스트하되, 실제 컴포넌트에서 통합 테스트도 수행합니다. 유지보수 가능한 테스트를 위해서는 구현 세부사항이 아닌 사용자 관점에서 테스트하고, data-testid 속성을 활용하여 선택자를 안정화하며, 테스트 픽스처와 팩토리 함수로 반복을 줄입니다. API 호출은 MSW나 vi.mock으로 모킹하여 외부 의존성을 제거합니다.

핵심 포인트
  • • 비동기 업데이트 대기 방법
  • • Composable 단위 테스트와 통합 테스트
  • • 사용자 중심의 테스트 작성
  • • API 모킹과 외부 의존성 제거
Follow-up 질문

E2E 테스트(Playwright, Cypress)와 컴포넌트 테스트의 경계를 어떻게 설정하며, 각각 어느 정도의 비중으로 테스트 전략을 구성하시겠습니까?

5 캐싱 전략
Hard

Q. Vue 애플리케이션에서 API 응답 데이터를 효율적으로 캐싱하여 불필요한 네트워크 요청을 줄이고 싶습니다. 클라이언트 사이드에서 구현할 수 있는 캐싱 전략(메모리 캐시, LocalStorage, IndexedDB)의 장단점과 선택 기준, 캐시 무효화 정책, 그리고 stale-while-revalidate 패턴의 구현 방법을 설명해주세요.

A. 모범답안

메모리 캐시는 가장 빠르지만 새로고침 시 사라지므로 세션 내 반복 조회에 적합하고, LocalStorage는 5-10MB 제한이 있지만 간단한 문자열 데이터 영구 저장에 적합하며, IndexedDB는 대용량 구조화된 데이터와 오프라인 지원에 적합합니다. 캐시 무효화는 TTL(Time-To-Live) 기반, 이벤트 기반(데이터 변경 시), 버전 기반(API 버전 변경 시) 전략을 조합합니다. stale-while-revalidate는 캐시된 데이터를 즉시 반환하면서 백그라운드에서 새 데이터를 가져와 갱신하는 패턴으로, 사용자 경험을 유지하면서 데이터 신선도를 보장합니다. 구현 시 캐시 키 설계, 동시 요청 중복 제거, 캐시 용량 관리(LRU 정책)를 고려해야 합니다.

핵심 포인트
  • • 캐싱 저장소별 특성과 선택 기준
  • • TTL, 이벤트, 버전 기반 무효화 전략
  • • stale-while-revalidate 패턴의 동작 방식
  • • 캐시 키 설계와 동시 요청 처리
Follow-up 질문

여러 탭에서 동일한 Vue 애플리케이션이 실행 중일 때, 한 탭에서 데이터를 변경하면 다른 탭의 캐시도 동기화되어야 한다면 어떻게 구현하시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!