패스잇

프론트엔드 개발

Vue.js / Nuxt 면접 질문

Vue 인스턴스와 옵션, v-bind와 v-model, ref와 reactive, computed와 watch, props·emit 너머의 컴포넌트 통신, Composition API와 TypeScript로 로직 모듈화, 대량 데이터 테이블 성능, Nuxt 3의 Nitro 서버. Vue 면접은 반응형 시스템이 "언제 무엇을 다시 계산하는지"를 설명할 수 있는지를 봅니다. Vue 3·Nuxt 단골 질문을 모범답안과 함께 정리했습니다.

총 21문제 · 기초 7 · 중급 7 · 심화 7 · 모범답안 포함

Vue.js / Nuxt 면접 질문 · 기초

Q1 기초

Vue.js는 어떤 프레임워크이며, 프론트엔드 개발에서 어떤 장점을 제공하는지 설명해 주세요.

힌트 · 프로그레시브 프레임워크로, 컴포넌트 기반 아키텍처와 반응형 데이터 바인딩을 통해 쉽고 효율적인 UI 개발을 가능하게 합니다.

Vue.js는 사용자 인터페이스를 구축하기 위한 프로그레시브 JavaScript 프레임워크입니다. 핵심은 뷰 레이어에 집중되어 있어 다른 라이브러리나 기존 프로젝트에 쉽게 통합할 수 있다는 장점이 있습니다.

전체 모범답안 펼치기

Vue.js는 사용자 인터페이스를 구축하기 위한 프로그레시브 JavaScript 프레임워크입니다. 핵심은 뷰 레이어에 집중되어 있어 다른 라이브러리나 기존 프로젝트에 쉽게 통합할 수 있다는 장점이 있습니다.

프론트엔드 개발에서 Vue.js는 다음과 같은 장점을 제공합니다.

  • 컴포넌트 기반 아키텍처: 재사용 가능한 UI 컴포넌트를 쉽게 만들고 관리할 수 있어 개발 생산성을 높여줍니다.
  • 반응형 데이터 바인딩: 데이터 변경 시 UI가 자동으로 업데이트되어 개발자가 DOM을 직접 조작할 필요가 없습니다.
  • Virtual DOM: 실제 DOM 조작 횟수를 최소화하여 성능을 향상시킵니다.
  • 쉬운 학습 곡선: 비교적 배우기 쉬워서 빠르게 프로젝트에 적용할 수 있습니다.
  • 점진적 적용: 기존 프로젝트에 부분적으로 도입하여 점차적으로 Vue.js의 기능을 활용할 수 있습니다.
#컴포넌트 기반#반응형#Virtual DOM#데이터 바인딩#점진적 적용

이 질문 단독 페이지 →

Q2 기초

Vue 애플리케이션의 가장 기본적인 단위인 Vue 인스턴스는 어떻게 생성하며, 주요 옵션(data, methods 등)은 무엇이 있는지 설명해 주세요.

힌트 · `new Vue({})`로 생성하며, `el`, `data`, `methods`, `computed`, `watch` 등의 옵션을 사용하여 인스턴스의 동작을 정의합니다.

Vue 애플리케이션의 가장 기본적인 단위는 Vue 인스턴스입니다. new Vue({})를 통해 생성할 수 있습니다. 이 때, 객체 안에 다양한 옵션을 설정하여 인스턴스의 동작을 정의합니다.

전체 모범답안 펼치기

Vue 애플리케이션의 가장 기본적인 단위는 Vue 인스턴스입니다. new Vue({})를 통해 생성할 수 있습니다. 이 때, 객체 안에 다양한 옵션을 설정하여 인스턴스의 동작을 정의합니다.

주요 옵션으로는 el, data, methods, computed, watch 등이 있습니다.

el은 Vue 인스턴스가 마운트될 DOM 요소를 지정합니다. data는 Vue 인스턴스 내에서 사용할 데이터를 정의하며, 템플릿에서 접근하고 변경할 수 있습니다. methods는 Vue 인스턴스 내에서 호출할 수 있는 함수들을 정의합니다. computed는 데이터에 기반하여 계산된 값을 반환하는 속성을 정의하며, 종속된 데이터가 변경될 때 자동으로 업데이트됩니다. 마지막으로 watch는 특정 데이터의 변화를 감지하고 그에 따른 동작을 수행하는 기능을 제공합니다.

이러한 옵션들을 통해 Vue 인스턴스의 동작을 정의하고, 애플리케이션의 UI와 로직을 구성할 수 있습니다.

#Vue 인스턴스#new Vue()#data#methods#컴포넌트

이 질문 단독 페이지 →

Q3 기초

Vue.js에서 `v-bind`와 `v-model` 디렉티브는 각각 어떤 용도로 사용되며, 둘의 주요 차이점은 무엇인지 설명해 주세요.

힌트 · `v-bind`는 단방향 바인딩으로 HTML 속성에 데이터를 연결하고, `v-model`은 양방향 바인딩으로 주로 폼 요소의 입력과 데이터를 동기화합니다.

vbind와 vmodel은 Vue.js에서 데이터를 HTML 요소와 연결하는 데 사용되는 디렉티브입니다.

전체 모범답안 펼치기

v-bind와 v-model은 Vue.js에서 데이터를 HTML 요소와 연결하는 데 사용되는 디렉티브입니다.

v-bind는 주로 HTML 속성에 데이터를 바인딩하는 데 사용됩니다. 예를 들어, 이미지의 src 속성이나 버튼의 disabled 속성 등을 데이터 속성과 연결할 수 있습니다. 이는 단방향 바인딩으로, 데이터가 변경되면 속성 값이 업데이트되지만, 속성 값이 변경되어도 데이터는 변경되지 않습니다.

반면, v-model은 주로 폼 요소(input, textarea, select 등)와 데이터를 양방향으로 바인딩하는 데 사용됩니다. 사용자가 폼 요소에 값을 입력하면 데이터가 업데이트되고, 데이터가 변경되면 폼 요소의 값도 업데이트됩니다. v-model은 내부적으로 v-bind와 이벤트 리스너를 사용하여 양방향 데이터 바인딩을 구현합니다.

따라서 주요 차이점은 v-bind는 단방향 바인딩, v-model은 양방향 바인딩이라는 점입니다. v-bind는 속성 값을 데이터에 연결하는 데 사용되고, v-model은 폼 요소의 입력 값과 데이터를 동기화하는 데 사용됩니다.

#단방향 바인딩#양방향 바인딩#속성 바인딩#이벤트 리스너#데이터 동기화

이 질문 단독 페이지 →

Q4 기초

Vue.js에서 조건부 렌더링을 위해 사용되는 `v-if`와 `v-show` 디렉티브의 차이점을 설명하고, 각각 어떤 상황에 더 적합한지 예시를 들어 설명해 주세요.

힌트 · `v-if`는 조건에 따라 DOM 요소를 추가/제거하고, `v-show`는 CSS `display` 속성을 토글하여 요소를 숨기거나 보이게 합니다. 전환 빈도에 따라 선택합니다.

"Vue.js에서 vif와 vshow는 조건부 렌더링을 위한 디렉티브입니다. 가장 큰 차이점은 vif는 조건이 거짓일 경우 DOM 요소를 아예 렌더링하지 않는 반면, vshow는 항상 DOM에 존재하며 CSS의 di…

전체 모범답안 펼치기

"Vue.js에서 v-if와 v-show는 조건부 렌더링을 위한 디렉티브입니다. 가장 큰 차이점은 v-if는 조건이 거짓일 경우 DOM 요소를 아예 렌더링하지 않는 반면, v-show는 항상 DOM에 존재하며 CSS의 display 속성을 none으로 설정하여 숨깁니다.

따라서, 조건이 자주 변경되지 않고 초기 렌더링 비용이 중요할 때는 v-if가 더 적합합니다. 예를 들어, 사용자 권한에 따라 특정 섹션을 보여줄지 말지 결정하는 경우처럼, 권한이 자주 바뀌지 않는다면 v-if를 사용하는 것이 좋습니다.

반대로, 조건이 자주 변경되어 토글되는 빈도가 높다면 v-show가 더 효율적입니다. 예를 들어, 탭 메뉴에서 현재 선택된 탭의 내용만 보여주는 경우처럼, 탭 전환이 빈번하게 일어난다면 v-show를 사용하는 것이 성능상 유리합니다."

#DOM#렌더링#초기 렌더링#CSS display#성능

이 질문 단독 페이지 →

Q5 기초

Vue.js에서 배열 데이터를 기반으로 여러 개의 요소를 반복적으로 렌더링할 때 `v-for` 디렉티브를 어떻게 사용하는지 설명해 주세요. 이때 `key` 속성의 중요성도 함께 언급해 주세요.

힌트 · `v-for='(item, index) in items'` 형태로 사용하며, `key`는 각 노드의 고유한 식별자로, DOM 재사용 및 성능 최적화에 필수적입니다.

Vue.js에서 배열 데이터를 기반으로 여러 요소를 반복 렌더링할 때는 vfor 디렉티브를 사용합니다. 예를 들어 vfor="(item, index) in items" 와 같이 사용하면 items 배열의 각 요소에…

전체 모범답안 펼치기

Vue.js에서 배열 데이터를 기반으로 여러 요소를 반복 렌더링할 때는 v-for 디렉티브를 사용합니다. 예를 들어 v-for="(item, index) in items" 와 같이 사용하면 items 배열의 각 요소에 대해 반복적으로 템플릿을 렌더링할 수 있습니다. item은 배열의 각 요소, index는 해당 요소의 인덱스를 나타냅니다.

여기서 중요한 것은 key 속성입니다. key는 Vue가 각 노드를 고유하게 식별하는 데 사용되는 속성으로, Vue는 key를 기반으로 DOM 요소를 재사용하고 업데이트할지 결정합니다. 만약 key가 없다면 Vue는 요소를 효율적으로 업데이트하지 못하고 불필요한 DOM 조작이 발생하여 성능 저하를 일으킬 수 있습니다. 따라서 v-for를 사용할 때는 각 요소의 고유한 ID를 key 속성에 할당하여 성능을 최적화하는 것이 중요합니다. 예를 들어 <li v-for="item in items" :key="item.id">{{ item.name }}</li> 와 같이 사용할 수 있습니다.

#v-for#key#고유 ID#재사용#성능 최적화

이 질문 단독 페이지 →

Q6 기초

Vue.js에서 사용자 인터랙션(클릭, 입력 등)을 처리하기 위해 `v-on` 디렉티브를 어떻게 사용하는지 설명해 주세요. 이벤트 수식어(event modifiers)의 역할도 함께 설명해 주세요.

힌트 · `v-on:click='handler'` 또는 `@click='handler'` 형태로 사용하며, `.prevent`, `.stop` 같은 수식어로 이벤트의 기본 동작이나 전파를 제어할 수 있습니다.

Vue.js에서 von 디렉티브는 DOM 이벤트에 반응하여 Vue 인스턴스의 메서드를 실행하는 데 사용됩니다. 예를 들어 @click='handleClick'처럼 사용하면 클릭 이벤트가 발생했을 때 handleCli…

전체 모범답안 펼치기

Vue.js에서 v-on 디렉티브는 DOM 이벤트에 반응하여 Vue 인스턴스의 메서드를 실행하는 데 사용됩니다. 예를 들어 @click='handleClick'처럼 사용하면 클릭 이벤트가 발생했을 때 handleClick 메서드가 호출됩니다. v-on은 @ 기호로 축약해서 사용할 수 있습니다.

이벤트 수식어는 이벤트 핸들러가 호출되기 전후에 특정 동작을 수행하도록 도와줍니다. .prevent는 이벤트의 기본 동작을 막고, .stop은 이벤트 전파를 중단시킵니다. 예를 들어 <form @submit.prevent='handleSubmit'>는 폼 제출 시 페이지 새로고침을 막습니다. .once는 이벤트 핸들러를 한 번만 실행하고, .capture는 캡처링 방식으로 이벤트를 처리합니다. 이러한 수식어를 사용하면 코드를 더 간결하고 효율적으로 관리할 수 있습니다.

#v-on#이벤트 핸들러#이벤트 수식어#DOM 이벤트#메서드

이 질문 단독 페이지 →

Q7 기초

Vue.js에서 컴포넌트 기반 개발의 이점은 무엇이며, 하나의 컴포넌트는 일반적으로 어떤 구조(template, script, style)로 이루어져 있는지 설명해 주세요.

힌트 · UI를 재사용 가능한 독립적인 단위로 분리하여 개발 효율성과 유지보수성을 높이며, 단일 파일 컴포넌트(SFC)는 `template`, `script`, `style` 블록으로 구성됩니다.

Vue.js에서 컴포넌트 기반 개발은 UI를 독립적이고 재사용 가능한 단위, 즉 컴포넌트로 나누어 개발하는 방식입니다. 이렇게 하면 다음과 같은 이점이 있습니다.

전체 모범답안 펼치기

Vue.js에서 컴포넌트 기반 개발은 UI를 독립적이고 재사용 가능한 단위, 즉 컴포넌트로 나누어 개발하는 방식입니다. 이렇게 하면 다음과 같은 이점이 있습니다.

  • 재사용성: 한번 만든 컴포넌트를 여러 곳에서 재사용하여 코드 중복을 줄이고 개발 효율성을 높일 수 있습니다.
  • 유지보수성: 각 컴포넌트가 독립적이므로 특정 기능 수정 시 해당 컴포넌트만 수정하면 되어 유지보수가 용이합니다.
  • 모듈화: 코드를 모듈화하여 전체 애플리케이션의 구조를 파악하기 쉽고, 협업에도 유리합니다.

Vue.js 컴포넌트는 일반적으로 단일 파일 컴포넌트(SFC) 형태로 구성되며, template, script, style 세 부분으로 나뉩니다. template은 컴포넌트의 HTML 구조를 정의하고, script는 컴포넌트의 로직(데이터, 메서드 등)을 담당하며, style은 컴포넌트의 스타일을 정의합니다.

#재사용성#유지보수성#모듈화#단방향 데이터 흐름#template

이 질문 단독 페이지 →

읽기만으론 부족합니다. 직접 말해보세요

패스잇 앱에서 Vue.js / Nuxt 질문에 직접 답하면 AI가 1:1로 답변을 코칭합니다.

Vue.js / Nuxt 면접 질문 · 중급

Q8 중급

Vue 3 Composition API에서 'ref'와 'reactive'는 반응형 데이터를 생성하는 데 사용됩니다. 이 두 함수의 주요 차이점은 무엇이며, 각각 어떤 상황에서 사용하는 것이 더 적절한지 구체적인 예시와 함께 설명해주세요.

힌트 · ref는 원시 값과 객체 모두를 래핑하며, .value로 접근합니다. reactive는 객체에만 사용되며 프록시로 동작하고 .value 없이 직접 접근합니다.

네, Vue 3 Composition API에서 ref와 reactive는 모두 반응형 데이터를 만드는 데 사용되지만, 몇 가지 중요한 차이점이 있습니다.

전체 모범답안 펼치기

네, Vue 3 Composition API에서 ref와 reactive는 모두 반응형 데이터를 만드는 데 사용되지만, 몇 가지 중요한 차이점이 있습니다.

가장 큰 차이점은 ref는 원시 타입 값(숫자, 문자열, 불리언 등)과 객체 모두를 감쌀 수 있다는 점입니다. ref로 생성된 반응형 데이터에 접근하거나 값을 변경하려면 .value를 사용해야 합니다. 반면, reactive는 객체에만 사용 가능하며, 객체의 속성에 직접 접근하여 값을 변경할 수 있습니다. reactive는 객체를 프록시로 감싸 깊은 반응성을 제공합니다.

어떤 것을 사용할지는 데이터의 형태와 사용 방식에 따라 결정됩니다. 예를 들어, 단순한 숫자나 문자열 값을 반응형으로 관리해야 한다면 ref를 사용하는 것이 적절합니다. 컴포넌트의 카운터를 예로 들 수 있습니다. 반면, 여러 속성을 가진 객체의 반응성을 관리해야 한다면 reactive를 사용하는 것이 더 편리합니다. 사용자 정보 객체와 같이 여러 속성을 한 번에 관리해야 할 때 유용합니다.

템플릿에서는 ref로 생성된 값은 자동으로 언래핑되므로 .value 없이 직접 사용할 수 있습니다.

#원시값#객체#반응성 추적#깊은 반응성#템플릿 자동 언래핑

이 질문 단독 페이지 →

Q9 중급

Vue 컴포넌트에서 'computed' 속성과 'watch' 옵션(또는 watch effect)은 모두 반응형 데이터의 변화에 따라 특정 로직을 수행할 수 있습니다. 이 둘의 주요 차이점을 설명하고, 각각 어떤 상황에 더 적합한지 실무 예시를 들어 설명해주세요.

힌트 · computed는 종속성에 기반한 캐시된 파생 상태를 만들 때, watch는 특정 상태 변화에 대한 부수 효과를 수행할 때 사용합니다.

네, Vue 컴포넌트에서 computed와 watch는 모두 반응형 데이터 변화에 반응하지만, 목적과 동작 방식에 차이가 있습니다.

전체 모범답안 펼치기

네, Vue 컴포넌트에서 computed와 watch는 모두 반응형 데이터 변화에 반응하지만, 목적과 동작 방식에 차이가 있습니다.

computed는 종속성을 기반으로 계산된 값을 반환합니다. 즉, 종속된 데이터가 변경될 때만 다시 계산되고, 결과는 캐싱됩니다. 따라서 성능 최적화에 유리하며, 템플릿에서 데이터를 표시하거나 다른 computed 속성의 종속성으로 사용될 때 적합합니다. 예를 들어, 상품 가격과 할인율을 기반으로 최종 가격을 계산하는 경우에 computed를 사용하면 됩니다.

반면 watch는 특정 데이터의 변화를 감지하고, 그에 따른 부수 효과(side effect)를 수행합니다. 데이터 변경 시마다 실행되며, 비동기 작업이나 API 호출, 로깅 등과 같이 데이터 변경에 따라 다른 작업을 수행해야 할 때 유용합니다. 예를 들어, 검색어 입력 시 API를 호출하여 검색 결과를 업데이트하는 경우에 watch를 사용할 수 있습니다.

요약하자면, computed는 값을 계산하고 캐싱하는 데, watch는 데이터 변화에 따른 부수 효과를 처리하는 데 더 적합합니다.

#캐싱#부수 효과#종속성#성능 최적화#비동기

이 질문 단독 페이지 →

Q10 중급

Vue 컴포넌트 간 통신에서 'props'와 'emit'은 기본적인 부모-자식 통신 방식입니다. 이 외에 복잡한 컴포넌트 트리에서 부모-자식 관계가 아닌 컴포넌트 간 효율적인 통신 방법들(예: provide/inject, Pinia/Vuex)을 설명하고, 각 방법의 장단점을 비교해주세요.

힌트 · provide/inject는 깊은 계층의 컴포넌트 간 통신에 적합하며, Pinia/Vuex는 전역 상태 관리에 사용됩니다.

네, Vue 컴포넌트 간 통신 방법에 대해 설명드리겠습니다.

전체 모범답안 펼치기

네, Vue 컴포넌트 간 통신 방법에 대해 설명드리겠습니다.

'props'와 'emit'은 부모-자식 관계에서 가장 기본적인 통신 방식이지만, 컴포넌트 트리가 복잡해지면 효율성이 떨어질 수 있습니다.

이러한 문제를 해결하기 위해 'provide/inject'와 'Pinia/Vuex' 같은 방법들을 사용할 수 있습니다. 'provide/inject'는 부모 컴포넌트에서 데이터를 제공(provide)하고, 하위 컴포넌트에서 해당 데이터를 주입(inject)받는 방식입니다. 깊은 계층 구조에서 props를 여러 단계 거쳐 전달할 필요 없이 직접 데이터를 공유할 수 있다는 장점이 있지만, 컴포넌트 간의 결합도가 높아지고, 데이터 흐름 추적이 어려워질 수 있다는 단점이 있습니다.

'Pinia/Vuex'는 전역 상태 관리 라이브러리입니다. 여러 컴포넌트에서 공유해야 하는 상태를 중앙 집중식으로 관리하여 컴포넌트 간의 통신을 간소화합니다. 상태 변화를 예측 가능하게 만들고, 디버깅을 용이하게 한다는 장점이 있지만, 규모가 작은 프로젝트에서는 오히려 오버헤드가 될 수 있습니다. 프로젝트 규모와 복잡성을 고려하여 적절한 방법을 선택하는 것이 중요합니다.

#props#emit#provide/inject#Pinia/Vuex#전역 상태 관리

이 질문 단독 페이지 →

Q11 중급

Vue Router의 내비게이션 가드(Navigation Guards)는 무엇이며, 어떤 종류(전역, 라우트별, 컴포넌트 내)가 있고 각각 어떤 시점에 호출되는지 설명하고 실제 애플리케이션에서 활용 사례를 들어주세요.

힌트 · 내비게이션 가드는 라우트 이동 전후에 특정 로직을 실행하는 훅입니다. 인증, 권한 확인, 데이터 로딩 등에 활용됩니다.

Vue Router의 내비게이션 가드는 라우트 이동 과정에서 특정 시점에 실행되는 함수입니다. 라우트 접근을 제어하거나, 데이터를 미리 로딩하는 등의 작업을 수행할 수 있습니다.

전체 모범답안 펼치기

Vue Router의 내비게이션 가드는 라우트 이동 과정에서 특정 시점에 실행되는 함수입니다. 라우트 접근을 제어하거나, 데이터를 미리 로딩하는 등의 작업을 수행할 수 있습니다.

종류는 크게 세 가지가 있습니다.

  • 전역 가드: router.beforeEach, router.afterEach 등으로 정의하며, 모든 라우트 이동에 대해 실행됩니다. 인증 상태 확인 등에 유용합니다.
  • 라우트별 가드: 라우트 설정 내에 beforeEnter를 사용하여 정의하며, 해당 라우트에 진입할 때만 실행됩니다. 특정 라우트에 대한 권한 검사에 적합합니다.
  • 컴포넌트 내 가드: 컴포넌트 내에 beforeRouteEnter, beforeRouteUpdate, beforeRouteLeave 등으로 정의하며, 해당 컴포넌트가 라우트에 의해 렌더링될 때 실행됩니다. 컴포넌트와 관련된 데이터 로딩이나 정리 작업에 활용됩니다.

예를 들어, beforeEach를 사용하여 모든 페이지에 접근하기 전에 사용자의 로그인 여부를 확인하고, 로그인되지 않았다면 로그인 페이지로 리다이렉트하는 기능을 구현할 수 있습니다. 라우트 메타 정보(meta fields)를 활용하여 특정 라우트에만 적용되는 가드를 만들 수도 있습니다.

#Navigation Guards#beforeEach#beforeEnter#beforeRouteEnter#메타 정보

이 질문 단독 페이지 →

Q12 중급

Vue 컴포넌트에서 'slot'을 사용하는 목적은 무엇이며, 'named slot'과 'scoped slot'의 차이점을 구체적인 예시와 함께 설명해주세요.

힌트 · slot은 컴포넌트 콘텐츠 배포를 위한 것입니다. named slot은 특정 위치에 콘텐츠를, scoped slot은 자식 컴포넌트의 데이터를 부모에서 렌더링할 때 사용합니다.

Vue 컴포넌트에서 slot을 사용하는 주된 목적은 컴포넌트의 재사용성을 높이고, 부모 컴포넌트에서 자식 컴포넌트의 특정 영역에 원하는 콘텐츠를 삽입할 수 있도록 하기 위함입니다.

전체 모범답안 펼치기

Vue 컴포넌트에서 slot을 사용하는 주된 목적은 컴포넌트의 재사용성을 높이고, 부모 컴포넌트에서 자식 컴포넌트의 특정 영역에 원하는 콘텐츠를 삽입할 수 있도록 하기 위함입니다.

named slot은 컴포넌트 내의 특정 위치에 콘텐츠를 넣고 싶을 때 사용합니다. 예를 들어, <template v-slot:header>와 같이 이름을 지정하여 해당 슬롯에 맞는 콘텐츠를 삽입할 수 있습니다.

scoped slot은 자식 컴포넌트의 데이터를 부모 컴포넌트에서 렌더링하고 싶을 때 사용합니다. 자식 컴포넌트에서 slot에 데이터를 바인딩하여 부모 컴포넌트로 전달하고, 부모 컴포넌트에서는 이 데이터를 활용하여 슬롯 콘텐츠를 렌더링할 수 있습니다. 이를 통해 자식 컴포넌트의 로직과 데이터를 활용하면서도 UI는 부모 컴포넌트에서 제어할 수 있습니다.

#컴포넌트 재사용성#컨텐츠 주입#named slot#scoped slot#props 전달

이 질문 단독 페이지 →

Q13 중급

Nuxt.js 3에서 서버 사이드 렌더링(SSR) 환경에서 데이터를 비동기적으로 가져오는 주요 방법들(예: useAsyncData, useFetch)을 설명하고, 각각의 특징과 사용 시나리오를 비교해주세요.

힌트 · useAsyncData는 일반적인 비동기 데이터 가져오기에, useFetch는 API 요청에 특화되어 있으며 캐싱, 에러 처리 등의 편의 기능을 제공합니다.

Nuxt 3에서 SSR 환경에서 데이터를 비동기적으로 가져오는 주요 방법은 useAsyncData와 useFetch입니다.

전체 모범답안 펼치기

Nuxt 3에서 SSR 환경에서 데이터를 비동기적으로 가져오는 주요 방법은 useAsyncData와 useFetch입니다.

useAsyncData는 가장 기본적인 데이터 fetching 방식입니다. Promise를 반환하는 함수를 인자로 받아 데이터를 가져오고, 로딩 상태와 에러를 관리할 수 있게 해줍니다. 일반적인 비동기 작업에 유용합니다.

useFetch는 useAsyncData를 기반으로 만들어졌지만, API 엔드포인트에서 데이터를 가져오는 데 특화되어 있습니다. 자동으로 HTTP 요청을 보내고, 응답을 처리하며, 캐싱, 에러 핸들링 등 API 요청에 필요한 다양한 기능을 내장하고 있습니다. API 서버와 통신할 때는 useFetch를 사용하는 것이 더 편리합니다.

예를 들어, 블로그 포스트 목록을 가져올 때는 useFetch('/api/posts')를 사용하고, 특정 계산 결과를 비동기적으로 가져올 때는 useAsyncData(() => computeResult())를 사용할 수 있습니다.

#useAsyncData#useFetch#SSR#캐싱#에러 핸들링

이 질문 단독 페이지 →

Q14 중급

Nuxt.js의 미들웨어(Middleware)는 무엇이며, 전역 미들웨어, 라우트 미들웨어, 명명된 미들웨어의 차이점을 설명하고 각 유형의 적절한 사용 사례를 제시해주세요.

힌트 · 미들웨어는 라우트 이동 전후에 실행되는 함수입니다. 전역은 모든 라우트에, 라우트별은 특정 라우트에, 명명된 미들웨어는 필요할 때 적용됩니다.

Nuxt.js 미들웨어는 라우트 이동 전후에 특정 로직을 실행하는 함수입니다. 주로 인증, 권한 검사, 로깅 등에 사용됩니다.

전체 모범답안 펼치기

Nuxt.js 미들웨어는 라우트 이동 전후에 특정 로직을 실행하는 함수입니다. 주로 인증, 권한 검사, 로깅 등에 사용됩니다.

전역 미들웨어는 nuxt.config.js에 등록되어 모든 라우트에 적용됩니다. 예를 들어, 모든 페이지 방문 기록을 남기는 데 사용할 수 있습니다.

라우트 미들웨어는 특정 라우트에만 적용됩니다. 페이지 컴포넌트 내에서 middleware 속성을 사용하여 지정합니다. 특정 페이지에만 필요한 권한 검사에 유용합니다.

명명된 미들웨어는 middleware/ 디렉토리에 정의하고, 필요에 따라 라우트나 컴포넌트에서 이름을 지정하여 사용합니다. 여러 라우트에서 재사용 가능한 로직을 구현할 때 효과적입니다. 예를 들어, 특정 사용자 역할에 대한 접근 권한을 확인하는 미들웨어를 만들고, 필요한 라우트에 적용할 수 있습니다.

#미들웨어#전역 미들웨어#라우트 미들웨어#명명된 미들웨어#컨텍스트(Context)

이 질문 단독 페이지 →

Vue.js / Nuxt 면접 질문 · 심화

Q15 심화

대규모 Vue 3 애플리케이션에서 Composition API와 TypeScript를 사용하여 복잡한 비즈니스 로직을 모듈화하고 재사용 가능한 형태로 설계할 때, 어떤 디자인 패턴(예: Custom Composables, Provide/Inject)을 고려하며, 각 패턴의 장단점 및 적절한 사용 시나리오에 대해 설명해 주십시오.

힌트 · Custom Composables는 로직 재사용성을 높이고, Provide/Inject는 깊은 컴포넌트 트리의 상태 공유에 유용하며, 명확한 타입 정의가 중요합니다.

네, Vue 3 애플리케이션에서 복잡한 비즈니스 로직을 모듈화하고 재사용 가능하게 설계할 때, Composition API와 TypeScript를 활용하여 Custom Composables와 Provide/Injec…

전체 모범답안 펼치기

네, Vue 3 애플리케이션에서 복잡한 비즈니스 로직을 모듈화하고 재사용 가능하게 설계할 때, Composition API와 TypeScript를 활용하여 Custom Composables와 Provide/Inject 패턴을 고려할 수 있습니다.

Custom Composables는 특정 로직을 캡슐화하여 여러 컴포넌트에서 재사용할 수 있도록 해줍니다. 예를 들어, API 호출 로직이나 데이터 포맷팅 로직을 Custom Composables로 만들면 코드 중복을 줄이고 유지보수성을 높일 수 있습니다. 장점은 명확한 관심사 분리, 높은 재사용성, 테스트 용이성이 있습니다. 단점은 컴포넌트 간의 의존성이 명시적으로 드러나지 않을 수 있다는 점입니다.

Provide/Inject는 컴포넌트 트리 깊숙한 곳에 있는 컴포넌트들에게 데이터를 제공할 때 유용합니다. 예를 들어, 테마 설정이나 사용자 인증 정보를 Provide로 제공하고, 하위 컴포넌트에서 Inject로 접근할 수 있습니다. 장점은 컴포넌트 간 결합도를 낮추고 전역 상태 관리를 간편하게 할 수 있다는 것입니다. 단점은 데이터 흐름을 추적하기 어려울 수 있으며, 과도하게 사용하면 컴포넌트 간의 의존성이 숨겨질 수 있다는 점입니다.

TypeScript를 사용하면 Custom Composables와 Provide/Inject를 사용할 때 타입 안정성을 확보할 수 있습니다. 명확한 타입 정의를 통해 컴파일 시점에 오류를 발견하고, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

어떤 패턴을 사용할지는 상황에 따라 다르지만, 일반적으로 로직 재사용성이 중요하다면 Custom Composables를, 컴포넌트 트리 전체에 걸쳐 데이터를 공유해야 한다면 Provide/Inject를 사용하는 것이 좋습니다.

#Composition API#Custom Composables#Provide/Inject#관심사 분리 (Separation of Concerns)#재사용성 (Reusability)

이 질문 단독 페이지 →

Q16 심화

Nuxt 3의 Nitro 서버 엔진이 제공하는 주요 이점은 무엇이며, 이를 활용하여 API 라우트, 서버 미들웨어, 서버 컴포넌트 등 백엔드 로직을 어떻게 효과적으로 구현하고 최적화할 수 있는지 구체적인 예시와 함께 설명해 주십시오.

힌트 · Nitro는 크로스 플랫폼 서버 엔진으로, API 라우트, 미들웨어, 서버 컴포넌트를 통해 풀스택 개발 경험을 제공하며 성능 최적화에 기여합니다.

Nuxt 3의 Nitro 엔진은 서버리스 환경을 포함한 다양한 플랫폼에서 실행 가능한 강력한 서버 엔진입니다. 가장 큰 이점은 풀스택 개발 경험을 제공한다는 점입니다.

전체 모범답안 펼치기

Nuxt 3의 Nitro 엔진은 서버리스 환경을 포함한 다양한 플랫폼에서 실행 가능한 강력한 서버 엔진입니다. 가장 큰 이점은 풀스택 개발 경험을 제공한다는 점입니다.

API 라우트는 server/api 디렉토리에 파일을 생성하는 것만으로 간단하게 구현할 수 있습니다. 예를 들어 server/api/hello.js에 간단한 API를 만들면 /api/hello로 접근 가능합니다.

서버 미들웨어는 요청과 응답을 가로채서 로깅, 인증 등의 작업을 수행할 수 있습니다. server/middleware 디렉토리에 파일을 생성하여 전역 또는 특정 라우트에 적용할 수 있습니다.

Nitro는 코드 분할, 자동 최적화, API 라우팅, 미들웨어 등을 통해 성능을 향상시킵니다. 서버 컴포넌트는 아직 실험적인 기능이지만, 서버 측에서 렌더링되는 Vue 컴포넌트를 통해 초기 로딩 속도를 개선할 수 있습니다. 이러한 기능들을 통해 개발 생산성을 높이고 애플리케이션 성능을 최적화할 수 있습니다.

#서버리스#API 라우팅#미들웨어#코드 분할#자동 최적화

이 질문 단독 페이지 →

Q17 심화

수십만 개의 데이터 포인트를 렌더링해야 하는 대규모 Vue.js 테이블 컴포넌트에서 심각한 성능 저하가 발생했을 때, 이를 해결하기 위한 고급 최적화 전략(예: Virtual Scrolling, Time Slicing, Memoization)과 각 기법의 구현 방식 및 고려사항에 대해 설명해 주십시오.

힌트 · Virtual Scrolling은 DOM 요소 수를 줄여 렌더링 부하를 낮추고, Memoization은 불필요한 연산을 방지하며, Time Slicing은 긴 작업을 작은 단위로 분할하여 UI 응답성을 유지합니다.

네, 수십만 개의 데이터 포인트를 렌더링하는 Vue.js 테이블 컴포넌트의 성능 저하 문제는 흔히 발생합니다. 몇 가지 고급 최적화 전략을 적용할 수 있습니다.

전체 모범답안 펼치기

네, 수십만 개의 데이터 포인트를 렌더링하는 Vue.js 테이블 컴포넌트의 성능 저하 문제는 흔히 발생합니다. 몇 가지 고급 최적화 전략을 적용할 수 있습니다.

가장 효과적인 방법은 Virtual Scrolling입니다. 화면에 보이는 데이터만 렌더링하고, 스크롤 위치에 따라 동적으로 데이터를 업데이트하여 DOM 요소 수를 획기적으로 줄입니다. vue-virtual-scroller 같은 라이브러리를 사용하거나, 직접 구현할 수도 있습니다. 구현 시 스크롤 위치 계산 및 데이터 슬라이싱 로직을 최적화해야 합니다.

다음으로 Memoization을 활용할 수 있습니다. 복잡한 계산 결과를 캐싱하여 동일한 입력에 대한 불필요한 연산을 방지합니다. Vue의 computed 속성을 활용하거나, Lodash의 memoize 함수를 사용할 수 있습니다.

Time Slicing은 긴 렌더링 작업을 작은 단위로 분할하여 UI 응답성을 유지하는 데 도움이 됩니다. requestAnimationFrame이나 setTimeout을 사용하여 작업을 쪼개 비동기적으로 처리할 수 있습니다.

추가적으로, 검색이나 필터링 기능이 있다면 Debouncing이나 Throttling을 적용하여 이벤트 발생 빈도를 조절하는 것도 고려해볼 수 있습니다.

마지막으로, Virtual Scrolling 구현 시 Intersection Observer API를 활용하여 화면에 요소가 나타나는 시점을 감지하고 필요한 데이터만 로딩하는 방식으로 성능을 더욱 향상시킬 수 있습니다.

#Virtual Scrolling#Time Slicing#Memoization#Debouncing/Throttling#Intersection Observer API

이 질문 단독 페이지 →

Q18 심화

Vue 2의 반응형 시스템(Object.defineProperty를 이용한 Getter/Setter)과 Vue 3의 반응형 시스템(Proxy 객체)의 근본적인 차이점은 무엇이며, 이 변화가 대규모 애플리케이션의 성능, 개발 경험, 그리고 특정 엣지 케이스 처리(예: 동적 속성 추가, 배열 변경 감지)에 어떤 영향을 미치는지 심층적으로 분석해 주십시오.

힌트 · Vue 3의 Proxy는 객체 전체 변경 감지 및 동적 속성 추가에 유리하며, Vue 2의 Getter/Setter는 이러한 한계가 있었습니다.

Vue 2와 Vue 3의 반응형 시스템은 핵심적으로 객체 변경을 감지하는 방식에서 차이가 있습니다. Vue 2는 Object.defineProperty를 사용하여 각 속성의 Getter/Setter를 정의하여 변경을…

전체 모범답안 펼치기

Vue 2와 Vue 3의 반응형 시스템은 핵심적으로 객체 변경을 감지하는 방식에서 차이가 있습니다. Vue 2는 Object.defineProperty를 사용하여 각 속성의 Getter/Setter를 정의하여 변경을 감지했습니다. 이는 특정 속성에 대한 감시는 가능했지만, 객체 전체에 대한 감시나 동적 속성 추가에는 한계가 있었습니다.

반면 Vue 3는 Proxy 객체를 사용합니다. Proxy는 객체 전체를 감싸 변경을 가로채기 때문에, 동적 속성 추가나 삭제, 배열의 인덱스 접근 등 더 다양한 변경을 감지할 수 있습니다.

이러한 변화는 대규모 애플리케이션에서 성능 향상으로 이어집니다. Vue 3는 필요한 변경만 추적하므로 불필요한 업데이트를 줄여 초기 렌더링 및 업데이트 성능이 향상되었습니다. 또한, 개발 경험 측면에서도 동적 속성 추가 등에 대한 제약이 줄어들어 더욱 유연한 개발이 가능해졌습니다. 엣지 케이스 처리에서도 Proxy가 더 강력한 기능을 제공하여 Vue 2에서 해결하기 어려웠던 문제들을 쉽게 해결할 수 있게 되었습니다.

#Object.defineProperty#Proxy#반응형#성능#엣지 케이스

이 질문 단독 페이지 →

Q19 심화

Nuxt 3에서 제공하는 SSR, SSG, CSR 렌더링 모드 외에, ISR(Incremental Static Regeneration)을 구현해야 하는 시나리오가 발생했을 때, 이를 Nuxt 3 환경에서 어떻게 구현할 수 있으며, ISR이 SSR이나 SSG 대비 갖는 장점과 한계점은 무엇인지 설명해 주십시오.

힌트 · ISR은 SSG의 장점과 SSR의 동적 업데이트 기능을 결합하여 빌드 시간을 단축하고 최신 데이터를 제공하며, 캐시 무효화 전략이 중요합니다.

Nuxt 3에서 ISR을 구현해야 하는 시나리오는 데이터가 자주 변경되지만, 매번 빌드하거나 SSR을 하기에는 부담스러울 때 발생합니다. 예를 들어, 뉴스 기사나 블로그 포스트처럼 내용이 주기적으로 업데이트되는 경우…

전체 모범답안 펼치기

Nuxt 3에서 ISR을 구현해야 하는 시나리오는 데이터가 자주 변경되지만, 매번 빌드하거나 SSR을 하기에는 부담스러울 때 발생합니다. 예를 들어, 뉴스 기사나 블로그 포스트처럼 내용이 주기적으로 업데이트되는 경우죠.

Nuxt 3에서 ISR을 구현하는 방법은 크게 두 가지입니다. 첫째, Vercel이나 Netlify 같은 플랫폼의 ISR 기능을 활용하는 것입니다. 이 플랫폼들은 routes 옵션을 통해 특정 경로에 대한 ISR 설정을 제공합니다. 둘째, 서버리스 함수와 캐시 전략을 직접 구현하는 것입니다. Cache-Control 헤더의 stale-while-revalidate 옵션을 사용하여 캐시된 데이터를 먼저 보여주고, 백그라운드에서 데이터를 업데이트하는 방식을 사용할 수 있습니다.

ISR은 SSG보다 최신 데이터를 제공할 수 있고, SSR보다 서버 부하를 줄일 수 있다는 장점이 있습니다. 하지만 캐시 무효화 전략을 잘못 설정하면 오래된 데이터를 보여줄 수 있고, 서버리스 함수를 직접 구현하는 경우 복잡도가 증가한다는 단점이 있습니다. CDN을 함께 사용하면 캐시 효율을 높이고 사용자 경험을 개선할 수 있습니다.

#Vercel#Netlify#Cache-Control#stale-while-revalidate#CDN

이 질문 단독 페이지 →

Q20 심화

프로덕션 환경에서 Vue/Nuxt 애플리케이션의 복잡한 에러를 효과적으로 감지, 로깅, 보고 및 복구하기 위한 포괄적인 에러 처리 전략을 설계해야 한다면, 어떤 기법(예: 전역 에러 핸들러, 에러 바운더리, Sentry 통합, 서버 측 에러 처리)들을 조합하여 사용할 것이며, 각 기법의 역할과 상호작용에 대해 설명해 주십시오.

힌트 · 전역 에러 핸들러는 예상치 못한 에러를 포착하고, 에러 바운더리는 UI 손상을 격리하며, Sentry 같은 도구는 에러 보고 및 모니터링을 자동화합니다.

네, 프로덕션 환경에서 Vue/Nuxt 애플리케이션의 에러를 효과적으로 처리하기 위한 전략은 다음과 같습니다.

전체 모범답안 펼치기

네, 프로덕션 환경에서 Vue/Nuxt 애플리케이션의 에러를 효과적으로 처리하기 위한 전략은 다음과 같습니다.

우선, 전역 에러 핸들러를 사용하여 예상치 못한 에러를 포착하고 로깅합니다. Vue.config.errorHandler를 통해 전역적으로 처리할 수 있습니다.

다음으로, 에러 바운더리 컴포넌트를 사용하여 특정 UI 영역에서 발생하는 에러가 전체 애플리케이션에 영향을 미치지 않도록 격리합니다. 에러 발생 시 대체 UI를 보여줄 수 있습니다.

Sentry와 같은 에러 모니터링 도구를 통합하여 에러를 자동으로 보고하고 추적합니다. 에러 발생 시 컨텍스트 정보(사용자, 브라우저, 스택 트레이스 등)를 함께 전송하여 디버깅을 용이하게 합니다.

마지막으로, 서버 사이드 로깅을 통해 클라이언트에서 발생한 에러뿐만 아니라 서버에서 발생하는 에러도 함께 관리합니다. 필요에 따라 재시도 메커니즘을 구현하여 일시적인 오류를 자동으로 복구할 수 있도록 합니다.

이러한 기법들을 조합하여 사용하면 에러를 감지, 로깅, 보고, 복구하는 전반적인 프로세스를 효율적으로 관리할 수 있습니다.

#전역 에러 핸들러#에러 바운더리#Sentry#서버 사이드 로깅#재시도 메커니즘

이 질문 단독 페이지 →

Q21 심화

재사용성과 유연성을 극대화하는 컴포넌트 설계를 위해, Renderless Components, Higher-Order Components (HOCs), 그리고 재귀 컴포넌트(Recursive Components) 패턴을 언제, 어떻게 활용할 수 있는지 각각의 실용적인 사용 사례와 구현 시 주의할 점을 들어 설명해 주십시오.

힌트 · Renderless 컴포넌트는 로직만 제공하고 렌더링은 슬롯에 위임하며, HOC는 컴포넌트에 추가 기능을 주입하고, 재귀 컴포넌트는 트리 구조 데이터 렌더링에 적합합니다.

면접관님, 좋은 질문 감사합니다. 재사용성과 유연성을 높이는 컴포넌트 설계는 매우 중요하다고 생각합니다.

전체 모범답안 펼치기

면접관님, 좋은 질문 감사합니다. 재사용성과 유연성을 높이는 컴포넌트 설계는 매우 중요하다고 생각합니다.

Renderless 컴포넌트는 UI 로직을 재사용하고 싶을 때 유용합니다. 예를 들어, 현재 마우스 좌표를 추적하는 로직을 Renderless 컴포넌트로 만들고, 슬롯을 통해 렌더링 부분을 사용자에게 맡기는 것이죠. 주의할 점은 너무 많은 로직을 Renderless 컴포넌트에 넣으면 오히려 복잡해질 수 있다는 것입니다.

Higher-Order Component (HOC)는 기존 컴포넌트에 기능을 추가할 때 사용합니다. 인증이 필요한 컴포넌트에 인증 로직을 HOC로 감싸는 것이 대표적인 예시입니다. HOC를 사용할 때는 props 충돌이나 side effects 관리에 주의해야 합니다.

재귀 컴포넌트는 트리 구조 데이터를 렌더링할 때 효과적입니다. 댓글이나 파일 시스템을 시각화하는 데 사용할 수 있습니다. 재귀 호출이 무한 루프에 빠지지 않도록 탈출 조건을 명확하게 설정하는 것이 중요합니다.

각 패턴은 특정 상황에 최적화되어 있으며, 상황에 맞게 적절히 선택하는 것이 중요하다고 생각합니다.

#Render Props#Composition#Side Effects#재귀 탈출 조건#관심사 분리

이 질문 단독 페이지 →

함께 보면 좋은 프론트엔드 개발 면접 질문

프론트엔드 개발 면접 질문 전체 보기 → 전체 카테고리

보유한 Vue.js / Nuxt 질문은 이게 전부가 아닙니다

패스잇 앱에는 직무별 면접 질문 수천 개와 모범답안이 담겨 있습니다. AI 모의면접으로 직접 답하고, 약점을 분석받아 보세요.