Vue.js 주니어 코딩 면접
새 면접Q. Vue.js에서 v-model 디렉티브의 동작 원리를 설명하고, v-model이 내부적으로 어떤 props와 event로 구성되는지 설명해주세요. 또한 input, checkbox, select 엘리먼트에서 각각 어떤 이벤트를 사용하는지도 포함해주세요.
v-model은 양방향 데이터 바인딩을 위한 문법 설탕(syntactic sugar)입니다. 내부적으로 :value props와 @input 이벤트의 조합으로 동작합니다. input과 textarea는 value 속성과 input 이벤트를 사용하고, checkbox와 radio는 checked 속성과 change 이벤트를, select는 value 속성과 change 이벤트를 사용합니다. 이를 통해 사용자 입력이 즉시 데이터에 반영되고, 데이터 변경이 화면에 반영되는 양방향 바인딩이 구현됩니다.
- • v-model은 :value와 @input의 문법 설탕
- • 엘리먼트 타입에 따라 사용하는 속성과 이벤트가 다름
- • 양방향 데이터 바인딩을 간편하게 구현
커스텀 컴포넌트에서 v-model을 사용하려면 어떻게 구현해야 하나요? Vue 2와 Vue 3에서의 차이점도 설명해주세요.
Q. Vue.js에서 형제 컴포넌트(Sibling Components) 간에 데이터를 주고받아야 하는 상황이 있습니다. 이를 해결할 수 있는 3가지 방법을 제시하고, 각 방법의 장단점과 어떤 상황에서 사용하는 것이 적절한지 설명해주세요.
형제 컴포넌트 간 통신 방법은 1) 부모 컴포넌트를 중간 매개체로 사용(Props down, Emit up), 2) Event Bus 패턴 사용, 3) Vuex나 Pinia 같은 상태관리 라이브러리 사용이 있습니다. 부모를 통한 방법은 간단하지만 깊은 계층에서는 props drilling 문제가 발생합니다. Event Bus는 간편하지만 디버깅이 어렵고 Vue 3에서는 권장되지 않습니다. 상태관리 라이브러리는 복잡한 상태 공유에 적합하지만 작은 프로젝트에서는 오버엔지니어링이 될 수 있습니다.
- • 부모 컴포넌트를 통한 Props/Emit 방식
- • Event Bus 패턴(Vue 3에서는 비권장)
- • Vuex/Pinia 같은 상태관리 라이브러리
- • 프로젝트 규모와 복잡도에 따라 적절한 방법 선택
Provide/Inject 패턴도 형제 컴포넌트 간 통신에 사용할 수 있나요? 사용 가능하다면 어떻게 구현하나요?
Q. Vue 3 Composition API에서 setup 함수의 실행 시점과 특징을 설명하고, setup 함수 내부에서 this를 사용할 수 없는 이유를 설명해주세요. 또한 setup 함수가 반환하는 값들은 템플릿에서 어떻게 사용되는지도 포함해주세요.
setup 함수는 컴포넌트 인스턴스가 생성되기 전, beforeCreate와 created 훅 사이에 실행됩니다. 이 시점에는 아직 컴포넌트 인스턴스가 완전히 생성되지 않았기 때문에 this를 사용할 수 없습니다. setup 함수에서 반환한 객체의 모든 속성은 자동으로 템플릿에 노출되어 직접 사용할 수 있으며, ref로 선언된 값은 템플릿에서 자동으로 언래핑되어 .value 없이 사용 가능합니다. props와 context(emit, slots, attrs 포함)는 setup의 인자로 받아 사용합니다.
- • 컴포넌트 인스턴스 생성 전에 실행되어 this 사용 불가
- • props와 context를 인자로 받음
- • 반환된 값들이 템플릿에 자동 노출
- • ref 값은 템플릿에서 자동 언래핑
script setup 문법을 사용하면 일반 setup 함수와 비교해 어떤 장점이 있나요?
Q. Vue.js에서 대량의 리스트 데이터(1000개 이상)를 렌더링할 때 성능을 최적화하는 방법을 3가지 이상 제시하고, 각 방법이 성능 향상에 기여하는 원리를 설명해주세요.
대량 리스트 렌더링 최적화 방법으로는 1) Virtual Scrolling(vue-virtual-scroller 등)을 사용하여 화면에 보이는 항목만 렌더링, 2) v-once 디렉티브로 정적 콘텐츠를 한 번만 렌더링, 3) Object.freeze()로 반응성이 필요 없는 데이터의 옵저버 생성 방지, 4) Pagination이나 Infinite Scroll로 데이터를 분할 로딩, 5) key 속성에 고유한 ID 사용으로 불필요한 재렌더링 방지가 있습니다. 이들은 DOM 노드 수 감소, 반응성 오버헤드 제거, 효율적인 diff 알고리즘 활용을 통해 성능을 개선합니다.
- • Virtual Scrolling으로 보이는 영역만 렌더링
- • Object.freeze()로 불필요한 반응성 제거
- • 데이터 분할 로딩(Pagination/Infinite Scroll)
- • 적절한 key 사용과 v-once 디렉티브 활용
Vue 3의 Teleport나 Suspense 기능이 성능 최적화에 어떻게 도움이 될 수 있나요?
Q. Vue.js에서 커스텀 디렉티브(Custom Directive)를 작성하는 방법을 설명하고, 디렉티브의 라이프사이클 훅들(mounted, updated, unmounted 등)을 설명해주세요. 실무에서 커스텀 디렉티브를 만들어 사용하기 좋은 사례도 2가지 이상 제시해주세요.
커스텀 디렉티브는 app.directive() 또는 컴포넌트의 directives 옵션으로 등록하며, 라이프사이클 훅으로 created, beforeMount, mounted, beforeUpdate, updated, beforeUnmount, unmounted를 제공합니다. mounted는 엘리먼트가 DOM에 삽입될 때, updated는 부모 컴포넌트가 업데이트될 때, unmounted는 엘리먼트가 제거될 때 호출됩니다. 실무 사례로는 v-focus(자동 포커스), v-click-outside(외부 클릭 감지), v-lazy(이미지 지연 로딩), v-permission(권한 기반 엘리먼트 표시) 등이 있으며, DOM 직접 조작이 필요한 재사용 가능한 로직에 적합합니다.
- • 디렉티브 라이프사이클 훅 이해(mounted, updated, unmounted 등)
- • DOM 직접 조작이 필요한 재사용 로직에 적합
- • v-focus, v-click-outside, v-lazy 등 실무 활용 사례
- • 전역 또는 로컬로 등록 가능
커스텀 디렉티브와 Composable(Composition API)의 차이점은 무엇이며, 각각 어떤 상황에서 사용하는 것이 더 적절한가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!