Vue.js 시니어 프레임워크 심화 면접
새 면접Q. Vue 3의 반응성 시스템에서 Proxy 기반 구현의 한계로 인해 발생할 수 있는 문제들과 이를 해결하기 위한 방법을 설명해주세요. 특히 Map/Set/WeakMap 같은 컬렉션 타입, private 필드, 그리고 Proxy를 감지하는 서드파티 라이브러리와의 호환성 문제를 다루는 전략을 제시해주세요.
Vue 3의 Proxy는 컬렉션 타입의 내장 메서드를 추적하기 위해 별도의 instrumentation이 필요하며, Vue는 컬렉션 메서드를 재정의하여 이를 해결합니다. Private 필드는 Proxy를 통과할 때 this 바인딩 문제로 접근이 불가능하므로 markRaw나 shallowReactive로 처리해야 합니다. 서드파티 라이브러리가 Proxy를 거부하는 경우 toRaw로 원본 객체를 전달하거나, 라이브러리 인스턴스를 반응형 시스템 외부에서 관리하고 수동으로 trigger를 호출하는 패턴을 사용합니다. 대규모 시스템에서는 반응형이 필요한 데이터와 그렇지 않은 데이터를 명확히 분리하는 아키텍처 설계가 중요합니다.
- • 컬렉션 타입은 Vue의 내장 instrumentation으로 메서드를 재정의하여 추적
- • Private 필드는 Proxy의 this 바인딩 문제로 markRaw/shallowReactive 사용 필요
- • 서드파티 라이브러리는 toRaw로 원본 전달 또는 수동 trigger 패턴 적용
- • 반응형 데이터와 비반응형 데이터의 명확한 경계 설정이 아키텍처 설계의 핵심
대규모 3D 시각화 라이브러리(Three.js 등)를 Vue 애플리케이션과 통합할 때, 성능과 반응성 관리를 어떻게 설계하시겠습니까?
Q. Vue에서 커스텀 디렉티브를 설계할 때 성능과 유지보수성을 고려한 베스트 프랙티스를 설명해주세요. 특히 디렉티브 내부에서 반응성을 다루는 방법, 라이프사이클 훅 선택 기준, 그리고 디렉티브 vs Composable vs Component 중 적절한 추상화 수준을 선택하는 의사결정 기준을 제시해주세요.
커스텀 디렉티브는 DOM 조작에 집중해야 하며, 복잡한 상태 관리는 피해야 합니다. 디렉티브 내부에서 watch나 watchEffect를 사용할 때는 반드시 unmounted 훅에서 cleanup을 수행해야 메모리 누수를 방지할 수 있습니다. 순수한 DOM 조작(포커스, 애니메이션)은 디렉티브로, 재사용 가능한 로직은 Composable로, UI를 포함한 복잡한 기능은 Component로 구현하는 것이 원칙입니다. 디렉티브의 binding 값이 변경될 때마다 updated 훅이 호출되므로, 실제 변경이 필요한 경우만 DOM을 조작하도록 이전 값과 비교하는 로직을 추가해야 성능을 최적화할 수 있습니다.
- • 디렉티브는 DOM 조작에 집중, 복잡한 상태 관리는 외부로 분리
- • watch/watchEffect 사용 시 unmounted에서 cleanup 필수
- • DOM 조작은 디렉티브, 로직은 Composable, UI는 Component로 분리
- • updated 훅에서 이전 값 비교로 불필요한 DOM 조작 방지
v-model을 확장한 복잡한 양방향 바인딩 디렉티브를 만든다면, modifier와 argument를 활용한 설계를 어떻게 구현하시겠습니까?
Q. Vue Router에서 Navigation Guard의 실행 순서와 각 가드에서의 비동기 처리 전략을 설명해주세요. 특히 여러 가드에서 동일한 API를 호출하는 중복 요청 문제, 가드 체인 중간에서 에러가 발생했을 때의 롤백 처리, 그리고 긴 비동기 작업으로 인한 사용자 경험 저하를 해결하는 패턴을 제시해주세요.
Navigation Guard는 전역 beforeEach → 라우트별 beforeEnter → 컴포넌트 beforeRouteEnter 순서로 실행되며, 각 가드는 Promise를 반환하거나 next 콜백을 호출할 수 있습니다. 중복 API 호출은 가드 레벨에서 캐싱 레이어를 두거나 Pinia 스토어의 액션에서 pending 상태를 관리하여 방지합니다. 가드 체인 중 에러 발생 시 router.onError로 전역 에러 핸들링을 설정하고, 이전 라우트로 복귀하거나 에러 페이지로 리다이렉트하는 전략을 사용합니다. 긴 비동기 작업은 낙관적 네비게이션으로 먼저 화면을 전환하고 Suspense나 로딩 상태로 처리하거나, 프리페칭 전략으로 이전 페이지에서 미리 데이터를 로드하는 방식으로 UX를 개선합니다.
- • 가드 실행 순서: 전역 → 라우트 → 컴포넌트 순, Promise 또는 next 콜백 지원
- • 중복 API 호출은 가드 레벨 캐싱 또는 Pinia의 pending 상태 관리로 방지
- • 에러는 router.onError로 전역 처리, 이전 라우트 복귀 또는 에러 페이지 리다이렉트
- • 긴 비동기 작업은 낙관적 네비게이션, Suspense, 프리페칭으로 UX 개선
SPA에서 뒤로가기 버튼을 눌렀을 때 이전 페이지의 스크롤 위치와 폼 상태를 복원하는 시스템을 설계한다면 어떻게 구현하시겠습니까?
Q. Vue 3에서 Teleport, Suspense, KeepAlive를 조합하여 복잡한 모달 관리 시스템을 구현할 때의 설계 전략을 설명해주세요. 특히 중첩된 모달의 z-index 관리, 모달 상태의 히스토리 관리(뒤로가기 지원), 그리고 모달 내부 컴포넌트의 캐싱 전략을 포함하여 설명해주세요.
Teleport로 모달을 body에 렌더링하고, 모달 스택을 관리하는 전역 상태로 z-index를 동적으로 계산합니다. Suspense는 모달 내부의 비동기 컴포넌트 로딩을 처리하며, fallback으로 스켈레톤을 표시합니다. KeepAlive는 자주 재사용되는 모달 컴포넌트를 캐싱하되, include/exclude prop으로 캐싱 대상을 제어합니다. 뒤로가기 지원은 모달이 열릴 때 history.pushState로 가상 히스토리 항목을 추가하고, popstate 이벤트 리스너로 모달을 닫는 방식으로 구현합니다. 모달 스택은 Pinia 스토어나 provide/inject로 관리하며, 각 모달의 ID, 우선순위, 옵션을 배열로 유지합니다.
- • Teleport로 body 렌더링, 모달 스택으로 z-index 동적 계산
- • Suspense로 비동기 컴포넌트 로딩, KeepAlive로 재사용 모달 캐싱
- • history.pushState와 popstate 이벤트로 뒤로가기 지원 구현
- • Pinia 또는 provide/inject로 모달 스택 전역 관리
동일한 모달을 여러 곳에서 동시에 열 수 있는 요구사항이 있다면, 각 인스턴스의 독립적인 상태 관리를 어떻게 설계하시겠습니까?
Q. Vue 3 애플리케이션에서 메모리 누수의 주요 원인과 탐지 방법을 설명하고, 프로덕션 환경에서 메모리 누수를 모니터링하고 예방하는 시스템을 설계해주세요. 특히 이벤트 리스너, 타이머, 구독 패턴, 그리고 대용량 데이터 캐싱에서 발생하는 메모리 누수 시나리오를 다뤄주세요.
메모리 누수의 주요 원인은 cleanup되지 않은 이벤트 리스너, clearInterval/clearTimeout 누락, 구독 해제 실패, 그리고 무한 증가하는 캐시입니다. Chrome DevTools의 Memory Profiler로 Heap Snapshot을 비교하여 누수를 탐지하고, Performance Monitor로 메모리 증가 추이를 관찰합니다. onUnmounted나 effectScope를 활용하여 모든 부수 효과를 자동으로 정리하도록 설계하고, Composable 패턴에서는 반환값으로 cleanup 함수를 제공합니다. 프로덕션 모니터링은 performance.memory API로 주기적으로 메모리 사용량을 측정하고, 임계값 초과 시 경고를 발생시킵니다. 대용량 캐시는 LRU 캐시나 WeakMap을 사용하여 자동 가비지 컬렉션이 가능하도록 구현합니다.
- • 주요 원인: cleanup 누락(이벤트, 타이머, 구독), 무한 증가 캐시
- • Chrome DevTools의 Heap Snapshot 비교와 Performance Monitor로 탐지
- • onUnmounted, effectScope로 자동 cleanup, Composable은 cleanup 함수 반환
- • performance.memory API로 프로덕션 모니터링, LRU/WeakMap으로 캐시 관리
SPA에서 사용자가 여러 페이지를 장시간 탐색할 때 메모리 사용량이 계속 증가하는 문제를 발견했습니다. 어떤 디버깅 프로세스를 거쳐 원인을 파악하시겠습니까?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!