대규모 애플리케이션에서는 모든 컴포넌트를 한 번에 불러오면 초기 로딩 속도가 느려집니다. defineAsyncComponent를 활용한 코드 스플리팅 기법과 v-memo, shallowRef 등을 이용한 렌더링 최적화 전략을 다룹니다.
우리가 웹 브라우저로 사이트에 접속할 때, 브라우저는 자바스크립트 파일을 다운로드합니다. 모든 컴포넌트가 하나의 거대한 app.js 파일에 뭉쳐 있다면(Bundle), 사용자는 당장 필요하지 않은 관리자용 페이지나 무거운 차트 라이브러리까지 모두 다운로드될 때까지 하얀 화면만 보게 됩니다. defineAsyncComponent는 이런 거대한 덩어리를 잘게 쪼개어(Code Splitting), "필요한 순간에만 해당 파일을 받아오게" 만드는 훌륭한 최적화 기술입니다.
| 방식 | 코드 작성법 | 특징 및 사용처 |
|---|---|---|
| 정적 Import (동기) | import Header from './Header.vue' | 앱이 시작될 때 무조건 로딩. 헤더, 푸터, 메인 네비게이션 등 즉시 렌더링되어야 하는 필수 요소에 사용. |
| 동적 Import (비동기) | defineAsyncComponent(() => import('./Heavy.vue')) | 해당 컴포넌트가 화면에 나타날 때(v-if 등) 다운로드. 모달(Modal), 복잡한 차트, 에디터, 잘 안 가는 라우터 페이지에 사용. |
단순한 버튼 하나, 작은 텍스트 블록까지 비동기 컴포넌트로 만들면, 브라우저가 수백 개의 자잘한 파일을 다운로드하기 위해 수백 번의 네트워크 요청을 보내야 하므로 오히려 성능이 심각하게 저하됩니다. 비동기 컴포넌트는 오직 '크기가 크고, 초기 화면에 필요하지 않은 덩어리'를 격리할 때만 사용하는 것이 올바른 최적화 전략입니다.
우리가 웹 브라우저로 사이트에 접속할 때, 브라우저는 자바스크립트 파일을 다운로드합니다. 모든 컴포넌트가 하나의 거대한 app.js 파일에 뭉쳐 있다면(Bundle), 사용자는 당장 필요하지 않은 관리자용 페이지나 무거운 차트 라이브러리까지 모두 다운로드될 때까지 하얀 화면만 보게 됩니다. defineAsyncComponent는 이런 거대한 덩어리를 잘게 쪼개어(Code Splitting), "필요한 순간에만 해당 파일을 받아오게" 만드는 훌륭한 최적화 기술입니다.
| 방식 | 코드 작성법 | 특징 및 사용처 |
|---|---|---|
| 정적 Import (동기) | import Header from './Header.vue' | 앱이 시작될 때 무조건 로딩. 헤더, 푸터, 메인 네비게이션 등 즉시 렌더링되어야 하는 필수 요소에 사용. |
| 동적 Import (비동기) | defineAsyncComponent(() => import('./Heavy.vue')) | 해당 컴포넌트가 화면에 나타날 때(v-if 등) 다운로드. 모달(Modal), 복잡한 차트, 에디터, 잘 안 가는 라우터 페이지에 사용. |
단순한 버튼 하나, 작은 텍스트 블록까지 비동기 컴포넌트로 만들면, 브라우저가 수백 개의 자잘한 파일을 다운로드하기 위해 수백 번의 네트워크 요청을 보내야 하므로 오히려 성능이 심각하게 저하됩니다. 비동기 컴포넌트는 오직 '크기가 크고, 초기 화면에 필요하지 않은 덩어리'를 격리할 때만 사용하는 것이 올바른 최적화 전략입니다.